diff --git a/.bazelrc b/.bazelrc index 214258e775a..12232b4bbd6 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,4 +1,12 @@ common --enable_platform_specific_config +common --enable_bzlmod +# because we use --override_module with `%workspace%`, the lock file is not stable +common --lockfile_mode=off + +# when building from this repository in isolation, the internal repository will not be found at .. +# where `MODULE.bazel` looks for it. The following will get us past the module loading phase, so +# that we can build things that do not rely on that +common --override_module=semmle_code=%workspace%/misc/bazel/semmle_code_stub build --repo_env=CC=clang --repo_env=CXX=clang++ diff --git a/.bazelversion b/.bazelversion index dc0208aba8e..a8907c025d5 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -6.3.1 +7.0.2 diff --git a/.gitattributes b/.gitattributes index 229c2eaefea..37484ad742a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -74,3 +74,7 @@ javascript/ql/experimental/adaptivethreatmodeling/test/endpoint_large_scale/auto # Auto-generated modeling for Python python/ql/lib/semmle/python/frameworks/data/internal/subclass-capture/*.yml linguist-generated=true + +# auto-generated bazel lock file +ruby/extractor/cargo-bazel-lock.json linguist-generated=true +ruby/extractor/cargo-bazel-lock.json -merge diff --git a/.github/labeler.yml b/.github/labeler.yml index baa8f5ff05f..9a52f1477ef 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -20,7 +20,7 @@ JS: Kotlin: - java/kotlin-extractor/**/* - - java/ql/test/kotlin/**/* + - java/ql/test-kotlin*/**/* Python: - python/**/* diff --git a/.github/workflows/compile-queries.yml b/.github/workflows/compile-queries.yml index 7176c6c1a50..38452f97d36 100644 --- a/.github/workflows/compile-queries.yml +++ b/.github/workflows/compile-queries.yml @@ -28,7 +28,7 @@ jobs: with: key: all-queries - name: check formatting - run: find */ql -type f \( -name "*.qll" -o -name "*.ql" \) -print0 | xargs -0 -n 3000 -P 10 codeql query format -q --check-only + run: find shared */ql -type f \( -name "*.qll" -o -name "*.ql" \) -print0 | xargs -0 -n 3000 -P 10 codeql query format -q --check-only - name: compile queries - check-only # run with --check-only if running in a PR (github.sha != main) if : ${{ github.event_name == 'pull_request' }} diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index fda4045cd44..7ef3f499f83 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -51,9 +51,11 @@ jobs: run: | brew install gnu-tar echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH - - name: Install cargo-cross - if: runner.os == 'Linux' - run: cargo install cross --version 0.2.5 + - name: Prepare Windows + if: runner.os == 'Windows' + shell: powershell + run: | + git config --global core.longpaths true - uses: ./.github/actions/os-version id: os_version - name: Cache entire extractor @@ -82,16 +84,8 @@ jobs: - name: Run tests if: steps.cache-extractor.outputs.cache-hit != 'true' run: cd extractor && cargo test --verbose - # On linux, build the extractor via cross in a centos7 container. - # This ensures we don't depend on glibc > 2.17. - - name: Release build (linux) - if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os == 'Linux' - run: | - cd extractor - cross build --release - mv target/x86_64-unknown-linux-gnu/release/codeql-extractor-ruby target/release/ - - name: Release build (windows and macos) - if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os != 'Linux' + - name: Release build + if: steps.cache-extractor.outputs.cache-hit != 'true' run: cd extractor && cargo build --release - name: Generate dbscheme if: ${{ matrix.os == 'ubuntu-latest' && steps.cache-extractor.outputs.cache-hit != 'true'}} @@ -123,7 +117,7 @@ jobs: - name: Cache compilation cache id: query-cache uses: ./.github/actions/cache-query-compilation - with: + with: key: ruby-build - name: Build Query Pack run: | @@ -235,54 +229,3 @@ jobs: shell: bash run: | codeql database analyze --search-path "${{ runner.temp }}/ruby-bundle" --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls - - # This is a copy of the 'test' job that runs in a centos7 container. - # This tests that the extractor works correctly on systems with an old glibc. - test-centos7: - defaults: - run: - working-directory: ${{ github.workspace }} - strategy: - fail-fast: false - runs-on: ubuntu-latest - container: - image: centos:centos7 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - needs: [package] - steps: - - name: Install gh cli - run: | - yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo - # fetch-codeql requires unzip and jq - # jq is available in epel-release (https://docs.fedoraproject.org/en-US/epel/) - yum install -y gh unzip epel-release - yum install -y jq - - uses: actions/checkout@v3 - - name: Fetch CodeQL - uses: ./.github/actions/fetch-codeql - - # Due to a bug in Actions, we can't use runner.temp in the run blocks here. - # https://github.com/actions/runner/issues/2185 - - - name: Download Ruby bundle - uses: actions/download-artifact@v3 - with: - name: codeql-ruby-bundle - path: ${{ runner.temp }} - - name: Unzip Ruby bundle - shell: bash - run: unzip -q -d "$RUNNER_TEMP"/ruby-bundle "$RUNNER_TEMP"/codeql-ruby-bundle.zip - - - name: Run QL test - shell: bash - run: | - codeql test run --search-path "$RUNNER_TEMP"/ruby-bundle --additional-packs "$RUNNER_TEMP"/ruby-bundle ruby/ql/test/library-tests/ast/constants/ - - name: Create database - shell: bash - run: | - codeql database create --search-path "$RUNNER_TEMP"/ruby-bundle --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database - - name: Analyze database - shell: bash - run: | - codeql database analyze --search-path "$RUNNER_TEMP"/ruby-bundle --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls diff --git a/.gitignore b/.gitignore index c81e23fc7f8..3d2e92e3ca9 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,9 @@ # local bazel options /local.bazelrc +# generated cmake directory +/.bazel-cmake + # CLion project files /.clwb diff --git a/CODEOWNERS b/CODEOWNERS index a4f85a04475..1869b38b7c9 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -25,6 +25,7 @@ # Bazel (excluding BUILD.bazel files) WORKSPACE.bazel @github/codeql-ci-reviewers +MODULE.bazel @github/codeql-ci-reviewers .bazelversion @github/codeql-ci-reviewers .bazelrc @github/codeql-ci-reviewers **/*.bzl @github/codeql-ci-reviewers diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 00000000000..e8c79e8377f --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,53 @@ +module( + name = "codeql", + version = "0.0", +) + +# this points to our internal repository when `codeql` is checked out as a submodule thereof +# when building things from `codeql` independently this is stubbed out in `.bazelrc` +bazel_dep(name = "semmle_code", version = "0.0") +local_path_override( + module_name = "semmle_code", + path = "..", +) + +# see https://registry.bazel.build/ for a list of available packages + +bazel_dep(name = "platforms", version = "0.0.8") +bazel_dep(name = "rules_pkg", version = "0.9.1") +bazel_dep(name = "rules_nodejs", version = "6.0.3") +bazel_dep(name = "rules_python", version = "0.31.0") +bazel_dep(name = "bazel_skylib", version = "1.5.0") +bazel_dep(name = "abseil-cpp", version = "20240116.0", repo_name = "absl") +bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json") +bazel_dep(name = "fmt", version = "10.0.0") + +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") +pip.parse( + hub_name = "codegen_deps", + python_version = "3.11", + requirements_lock = "//misc/codegen:requirements_lock.txt", +) +use_repo(pip, "codegen_deps") + +swift_deps = use_extension("//swift/third_party:load.bzl", "swift_deps") +use_repo( + swift_deps, + "binlog", + "picosha2", + "swift_prebuilt_darwin_x86_64", + "swift_prebuilt_linux", + "swift_toolchain_linux", + "swift_toolchain_macos", +) + +node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") +node.toolchain( + name = "nodejs", + node_version = "18.15.0", +) +use_repo(node, "nodejs", "nodejs_toolchains") + +register_toolchains( + "@nodejs_toolchains//:all", +) diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 42b7f54c24c..3f7ecf16770 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -1,12 +1,2 @@ -# Please notice that any bazel targets and definitions in this repository are currently experimental -# and for internal use only. - -workspace(name = "codeql") - -load("//misc/bazel:workspace.bzl", "codeql_workspace") - -codeql_workspace() - -load("//misc/bazel:workspace_deps.bzl", "codeql_workspace_deps") - -codeql_workspace_deps() +# please use MODULE.bazel to add dependencies +# this empty file is required by internal repositories, don't remove it diff --git a/config/identical-files.json b/config/identical-files.json index cde68f43caf..a24b5a3a618 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -431,13 +431,6 @@ "java/ql/src/experimental/Security/CWE/CWE-400/LocalThreadResourceAbuse.qhelp", "java/ql/src/experimental/Security/CWE/CWE-400/ThreadResourceAbuse.qhelp" ], - "IDE Contextual Queries": [ - "cpp/ql/lib/IDEContextual.qll", - "csharp/ql/lib/IDEContextual.qll", - "java/ql/lib/IDEContextual.qll", - "javascript/ql/lib/IDEContextual.qll", - "python/ql/lib/analysis/IDEContextual.qll" - ], "CryptoAlgorithms Python/JS/Ruby": [ "javascript/ql/lib/semmle/javascript/security/CryptoAlgorithms.qll", "python/ql/lib/semmle/python/concepts/CryptoAlgorithms.qll", diff --git a/cpp/autobuilder/Semmle.Autobuild.Cpp/Program.cs b/cpp/autobuilder/Semmle.Autobuild.Cpp/Program.cs index a7556197bcd..5fca6f556fb 100644 --- a/cpp/autobuilder/Semmle.Autobuild.Cpp/Program.cs +++ b/cpp/autobuilder/Semmle.Autobuild.Cpp/Program.cs @@ -1,5 +1,7 @@ using System; + using Semmle.Autobuild.Shared; +using Semmle.Util; namespace Semmle.Autobuild.Cpp { diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index b3091ec37d8..e1c0dfbecd9 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.12.7 + +### Minor Analysis Improvements + +* Added destructors for named objects to the intermediate representation. + ## 0.12.6 ### New Features diff --git a/cpp/ql/lib/IDEContextual.qll b/cpp/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/cpp/ql/lib/IDEContextual.qll +++ b/cpp/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/cpp/ql/lib/change-notes/released/0.12.7.md b/cpp/ql/lib/change-notes/released/0.12.7.md new file mode 100644 index 00000000000..856a8b665c7 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.12.7.md @@ -0,0 +1,5 @@ +## 0.12.7 + +### Minor Analysis Improvements + +* Added destructors for named objects to the intermediate representation. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 170a312c104..20419e9c610 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.12.6 +lastReleaseVersion: 0.12.7 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 90171958170..3bb9229bf94 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.12.6 +version: 0.12.7 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/Enclosing.qll b/cpp/ql/lib/semmle/code/cpp/Enclosing.qll index d821589a76c..013f5e672be 100644 --- a/cpp/ql/lib/semmle/code/cpp/Enclosing.qll +++ b/cpp/ql/lib/semmle/code/cpp/Enclosing.qll @@ -60,4 +60,6 @@ Element exprEnclosingElement(Expr e) { ) else result = de.getDeclaration() ) + or + result.(Stmt).getAnImplicitDestructorCall() = e } diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll index 9ee0fa3131b..3d97281daa5 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll @@ -1,6 +1,6 @@ // NOTE: There are two copies of this file, and they must be kept identical: // - semmle/code/cpp/controlflow/SubBasicBlocks.qll -// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll +// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll [now DEPRECATED] // // The second one is a private copy of the `SubBasicBlocks` library for // internal use by the data flow library. Having an extra copy prevents diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll index f6072763e1a..30029a5c762 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides a local analysis for identifying where a variable address * is effectively taken. Array-like offsets are allowed to pass through but * not field-like offsets. diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll index b8870cefd32..895cc09a048 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import cpp private import DataFlowPrivate private import DataFlowUtil diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index f5c51b43e37..115e145bec0 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import DataFlowImplSpecific private import codeql.dataflow.internal.DataFlowImpl import MakeImpl diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll index 868c3ef6a2b..5d61aac1561 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import DataFlowImplSpecific private import codeql.dataflow.internal.DataFlowImplCommon import MakeImplCommon diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll index 229031e0149..8abc7a8760a 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides consistency queries for checking invariants in the language-specific * data-flow classes and predicates. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll index 7fa662bd691..e8686419aac 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides C++-specific definitions for use in the data flow library. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll index 0745e8d0d7a..03c8446a9f4 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import cpp private import DataFlowUtil private import DataFlowDispatch diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll index 10338b18927..83efaf1511f 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides C++-specific definitions for use in the data flow library. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll index 6632a4af18c..4385c4e268a 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides a class for handling variables in the data flow analysis. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll index 9ee0fa3131b..3d97281daa5 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll @@ -1,6 +1,6 @@ // NOTE: There are two copies of this file, and they must be kept identical: // - semmle/code/cpp/controlflow/SubBasicBlocks.qll -// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll +// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll [now DEPRECATED] // // The second one is a private copy of the `SubBasicBlocks` library for // internal use by the data flow library. Having an extra copy prevents diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll index 3f917d69802..e1549ea57a3 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides C++-specific definitions for use in the taint tracking library. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll index 89a8eba2199..4f097fa4bf3 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides classes for performing local (intra-procedural) and * global (inter-procedural) taint-tracking analyses. * diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll index 0d73207dad9..f9346e28434 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `Global` and `GlobalWithState` instead. + */ + import semmle.code.cpp.dataflow.internal.TaintTrackingUtil as Public module Private { diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll index fb4862fd06b..e935b8d4d08 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `Global` and `GlobalWithState` instead. + */ + import semmle.code.cpp.dataflow.internal.TaintTrackingUtil as Public module Private { 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 7d4bb6f5866..b411790596e 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 @@ -34,7 +34,7 @@ private import Node0ToString cached private newtype TIRDataFlowNode = TNode0(Node0Impl node) { DataFlowImplCommon::forceCachingInSameStage() } or - TVariableNode(Variable var, int indirectionIndex) { + TGlobalLikeVariableNode(GlobalLikeVariable var, int indirectionIndex) { indirectionIndex = [getMinIndirectionsForType(var.getUnspecifiedType()) .. Ssa::getMaxIndirectionsForType(var.getUnspecifiedType())] } or @@ -55,29 +55,12 @@ private newtype TIRDataFlowNode = TFinalParameterNode(Parameter p, int indirectionIndex) { exists(Ssa::FinalParameterUse use | use.getParameter() = p and - use.getIndirectionIndex() = indirectionIndex and - parameterIsRedefined(p) + use.getIndirectionIndex() = indirectionIndex ) } or TFinalGlobalValue(Ssa::GlobalUse globalUse) or TInitialGlobalValue(Ssa::GlobalDef globalUse) -/** - * Holds if the value of `*p` (or `**p`, `***p`, etc.) is redefined somewhere in the body - * of the enclosing function of `p`. - * - * Only parameters satisfying this predicate will generate a `FinalParameterNode` transferring - * flow out of the function. - */ -private predicate parameterIsRedefined(Parameter p) { - exists(Ssa::Def def | - def.getSourceVariable().getBaseVariable().(Ssa::BaseIRVariable).getIRVariable().getAst() = p and - def.getIndirectionIndex() = 0 and - def.getIndirection() > 1 and - not def.getValue().asInstruction() instanceof InitializeParameterInstruction - ) -} - /** * An operand that is defined by a `FieldAddressInstruction`. */ @@ -413,7 +396,7 @@ class Node extends TIRDataFlowNode { * modeling flow in and out of global variables. */ Variable asVariable() { - this = TVariableNode(result, getMinIndirectionsForType(result.getUnspecifiedType())) + this = TGlobalLikeVariableNode(result, getMinIndirectionsForType(result.getUnspecifiedType())) } /** @@ -423,7 +406,7 @@ class Node extends TIRDataFlowNode { */ Variable asIndirectVariable(int indirectionIndex) { indirectionIndex > getMinIndirectionsForType(result.getUnspecifiedType()) and - this = TVariableNode(result, indirectionIndex) + this = TGlobalLikeVariableNode(result, indirectionIndex) } /** Gets an indirection of this node's underlying variable, if any. */ @@ -1768,15 +1751,18 @@ class DefinitionByReferenceNode extends IndirectArgumentOutNode { } /** - * A `Node` corresponding to a variable in the program, as opposed to the - * value of that variable at some particular point. This can be used for - * modeling flow in and out of global variables. + * A `Node` corresponding to a global (or `static` local) variable in the + * program, as opposed to the value of that variable at some particular point. + * This is used to model flow through global variables (and `static` local + * variables). + * + * There is no `VariableNode` for non-`static` local variables. */ -class VariableNode extends Node, TVariableNode { +class VariableNode extends Node, TGlobalLikeVariableNode { Variable v; int indirectionIndex; - VariableNode() { this = TVariableNode(v, indirectionIndex) } + VariableNode() { this = TGlobalLikeVariableNode(v, indirectionIndex) } /** Gets the variable corresponding to this node. */ Variable getVariable() { result = v } 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 8a5e8d20319..69ace9f890e 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 @@ -4,7 +4,11 @@ private import DataFlowUtil private import DataFlowImplCommon as DataFlowImplCommon private import semmle.code.cpp.models.interfaces.Allocation as Alloc private import semmle.code.cpp.models.interfaces.DataFlow as DataFlow +private import semmle.code.cpp.models.interfaces.Taint as Taint +private import semmle.code.cpp.models.interfaces.PartialFlow as PartialFlow +private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs as FIO private import semmle.code.cpp.ir.internal.IRCppLanguage +private import semmle.code.cpp.ir.dataflow.internal.ModelUtil private import DataFlowPrivate private import ssa0.SsaInternals as SsaInternals0 import SsaInternalsCommon @@ -138,12 +142,11 @@ private newtype TDefOrUseImpl = isIteratorUse(container, iteratorAddress, _, indirectionIndex) } or TFinalParameterUse(Parameter p, int indirectionIndex) { - // Avoid creating parameter nodes if there is no definitions of the variable other than the initializaion. - exists(SsaInternals0::Def def | - def.getSourceVariable().getBaseVariable().(BaseIRVariable).getIRVariable().getAst() = p and - not def.getValue().asInstruction() instanceof InitializeParameterInstruction and - underlyingTypeIsModifiableAt(p.getUnderlyingType(), indirectionIndex) - ) + underlyingTypeIsModifiableAt(p.getUnderlyingType(), indirectionIndex) and + // Only create an SSA read for the final use of a parameter if there's + // actually a body of the enclosing function. If there's no function body + // then we'll never need to flow out of the function anyway. + p.getFunction().hasDefinition() } private predicate isGlobalUse( @@ -796,10 +799,58 @@ private Node getAPriorDefinition(SsaDefOrUse defOrUse) { ) } +private predicate inOut(FIO::FunctionInput input, FIO::FunctionOutput output) { + exists(int indirectionIndex | + input.isQualifierObject(indirectionIndex) and + output.isQualifierObject(indirectionIndex) + or + exists(int i | + input.isParameterDeref(i, indirectionIndex) and + output.isParameterDeref(i, indirectionIndex) + ) + ) +} + +/** + * Holds if there should not be use-use flow out of `n`. That is, `n` is + * an out-barrier to use-use flow. This includes: + * + * - an input to a call that would be assumed to have use-use flow to the same + * argument as an output, but this flow should be blocked because the + * function is modeled with another flow to that output (for example the + * first argument of `strcpy`). + * - a conversion that flows to such an input. + */ +private predicate modeledFlowBarrier(Node n) { + exists( + FIO::FunctionInput input, FIO::FunctionOutput output, CallInstruction call, + PartialFlow::PartialFlowFunction partialFlowFunc + | + n = callInput(call, input) and + inOut(input, output) and + exists(callOutput(call, output)) and + partialFlowFunc = call.getStaticCallTarget() and + not partialFlowFunc.isPartialWrite(output) + | + call.getStaticCallTarget().(DataFlow::DataFlowFunction).hasDataFlow(_, output) + or + call.getStaticCallTarget().(Taint::TaintFunction).hasTaintFlow(_, output) + ) + or + exists(Operand operand, Instruction instr, Node n0, int indirectionIndex | + modeledFlowBarrier(n0) and + nodeHasInstruction(n0, instr, indirectionIndex) and + conversionFlow(operand, instr, false, _) and + nodeHasOperand(n, operand, indirectionIndex) + ) +} + /** Holds if there is def-use or use-use flow from `nodeFrom` to `nodeTo`. */ predicate ssaFlow(Node nodeFrom, Node nodeTo) { exists(Node nFrom, boolean uncertain, SsaDefOrUse defOrUse | - ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and nodeFrom != nodeTo + ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and + not modeledFlowBarrier(nFrom) and + nodeFrom != nodeTo | if uncertain = true then nodeFrom = [nFrom, getAPriorDefinition(defOrUse)] else nodeFrom = nFrom ) 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 07764ef7aa4..96a01954d17 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 @@ -11,6 +11,7 @@ private import InstructionTag private import TranslatedCondition private import TranslatedElement private import TranslatedExpr +private import TranslatedCall private import TranslatedStmt private import TranslatedFunction private import TranslatedGlobalVar diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll index b3ac43e2873..f9315a36bcf 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll @@ -85,10 +85,14 @@ newtype TInstructionTag = // The next three cases handle generation of branching for __except handling. TryExceptCompareNegativeOneBranch() or TryExceptCompareZeroBranch() or - TryExceptCompareOneBranch() + TryExceptCompareOneBranch() or + ImplicitDestructorTag(int index) { + exists(Expr e | exists(e.getImplicitDestructorCall(index))) or + exists(Stmt s | exists(s.getImplicitDestructorCall(index))) + } class InstructionTag extends TInstructionTag { - final string toString() { result = "Tag" } + final string toString() { result = getInstructionTagId(this) } } /** @@ -255,4 +259,8 @@ string getInstructionTagId(TInstructionTag tag) { tag = TryExceptCompareZeroBranch() and result = "TryExceptCompareZeroBranch" or tag = TryExceptCompareOneBranch() and result = "TryExceptCompareOneBranch" + or + exists(int index | + tag = ImplicitDestructorTag(index) and result = "ImplicitDestructor(" + index + ")" + ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index ffa26d180c3..7e3dc3cd9e2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -27,7 +27,7 @@ private CallInstruction getTranslatedCallInstruction(Call call) { * of a higher-level constructor (e.g. the allocator call in a `NewExpr`). */ abstract class TranslatedCall extends TranslatedExpr { - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { // We choose the child's id in the order of evaluation. // The qualifier is evaluated before the call target, because the value of // the call target may depend on the value of the qualifier for virtual @@ -47,13 +47,19 @@ abstract class TranslatedCall extends TranslatedExpr { else result = this.getFirstCallTargetInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getSideEffects().getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getSideEffects() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = CallTag() and opcode instanceof Opcode::Call and resultType = getTypeForPRValue(this.getCallResultType()) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getQualifier() and result = this.getFirstCallTargetInstruction(kind) or @@ -87,7 +93,7 @@ abstract class TranslatedCall extends TranslatedExpr { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = CallTag() and result = this.getSideEffects().getFirstInstruction(kind) } @@ -225,7 +231,7 @@ abstract class TranslatedSideEffects extends TranslatedElement { ) } - final override Instruction getChildSuccessor(TranslatedElement te, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement te, EdgeKind kind) { exists(int i | this.getChild(i) = te and if exists(this.getChild(i + 1)) @@ -234,6 +240,10 @@ abstract class TranslatedSideEffects extends TranslatedElement { ) } + override TranslatedElement getLastChild() { + result = this.getChild(max(int i | exists(this.getChild(i)))) + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType type) { none() } @@ -246,7 +256,18 @@ abstract class TranslatedSideEffects extends TranslatedElement { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getALastInstructionInternal() { + if exists(this.getAChild()) + then result = this.getChild(max(int i | exists(this.getChild(i)))).getALastInstruction() + else + // If there are no side effects, the "last" instruction should be the parent call's last + // instruction, so that implicit destructors can be inserted in the right place. + result = this.getParent().getInstruction(CallTag()) + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } /** Gets the primary instruction to be associated with each side effect instruction. */ abstract Instruction getPrimaryInstruction(); @@ -273,8 +294,8 @@ abstract class TranslatedDirectCall extends TranslatedCall { resultType = getFunctionGLValueType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedCall.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedCall.super.getInstructionSuccessorInternal(tag, kind) or tag = CallTargetTag() and result = this.getFirstArgumentOrCallInstruction(kind) @@ -367,6 +388,16 @@ class TranslatedStructorCall extends TranslatedFunctionCall { context = this.getParent() and result = context.getReceiver() ) + or + exists(Stmt parent | + expr = parent.getAnImplicitDestructorCall() and + result = getTranslatedExpr(expr.getQualifier().getFullyConverted()).getResult() + ) + or + exists(Expr parent | + expr = parent.getAnImplicitDestructorCall() and + result = getTranslatedExpr(expr.getQualifier().getFullyConverted()).getResult() + ) } override predicate hasQualifier() { any() } @@ -416,19 +447,25 @@ private int initializeAllocationGroup() { result = 3 } abstract class TranslatedSideEffect extends TranslatedElement { final override TranslatedElement getChild(int n) { none() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType type) { tag = OnlyInstructionTag() and this.sideEffectInstruction(opcode, type) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { result = this.getParent().getChildSuccessor(this, kind) and tag = OnlyInstructionTag() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll index 333e87ca214..77864969068 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll @@ -50,19 +50,29 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio { TranslatedFlexibleCondition() { this = TTranslatedFlexibleCondition(expr) } + final override predicate handlesDestructorsExplicitly() { none() } // TODO: this needs to be revisted when we get unnamed destructors + final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } final override Instruction getFirstInstruction(EdgeKind kind) { result = this.getOperand().getFirstInstruction(kind) } + final override Instruction getALastInstructionInternal() { + result = this.getOperand().getALastInstruction() + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } abstract TranslatedCondition getOperand(); } @@ -88,12 +98,16 @@ class TranslatedParenthesisCondition extends TranslatedFlexibleCondition { abstract class TranslatedNativeCondition extends TranslatedCondition, TTranslatedNativeCondition { TranslatedNativeCondition() { this = TTranslatedNativeCondition(expr) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } } abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeCondition, ConditionContext { override BinaryLogicalOperation expr; + final override predicate handlesDestructorsExplicitly() { none() } // TODO: this needs to be revisted when we get unnamed destructors + final override TranslatedElement getChild(int id) { id = 0 and result = this.getLeftOperand() or @@ -104,11 +118,19 @@ abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeConditio result = this.getLeftOperand().getFirstInstruction(kind) } + final override Instruction getALastInstructionInternal() { + result = this.getLeftOperand().getALastInstruction() + or + result = this.getRightOperand().getALastInstruction() + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } final TranslatedCondition getLeftOperand() { result = getTranslatedCondition(expr.getLeftOperand().getFullyConverted()) @@ -162,19 +184,25 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond result = this.getValueExpr().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(ValueConditionConditionalBranchTag()) + } + + final override predicate handlesDestructorsExplicitly() { none() } // TODO: this needs to be revisted when we get unnamed destructors + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = ValueConditionConditionalBranchTag() and opcode instanceof Opcode::ConditionalBranch and resultType = getVoidType() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getValueExpr() and result = this.getInstruction(ValueConditionConditionalBranchTag()) and kind instanceof GotoEdge } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = ValueConditionConditionalBranchTag() and ( kind instanceof TrueEdge and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll index 61095072d5e..55b5aa179f4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll @@ -60,6 +60,10 @@ abstract class TranslatedLocalVariableDeclaration extends TranslatedVariableInit */ abstract LocalVariable getVariable(); + final override TranslatedElement getChild(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + final override Type getTargetType() { result = getVariableType(this.getVariable()) } final override TranslatedInitialization getInitialization() { @@ -152,7 +156,13 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio kind instanceof GotoEdge } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getALastInstructionInternal() { + result = this.getInstruction(DynamicInitializationConditionalBranchTag()) + or + result = this.getInstruction(DynamicInitializationFlagStoreTag()) + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = DynamicInitializationFlagAddressTag() and kind instanceof GotoEdge and result = this.getInstruction(DynamicInitializationFlagLoadTag()) @@ -178,7 +188,7 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getInstruction(DynamicInitializationFlagConstantTag()) and kind instanceof GotoEdge diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index c83aea863e0..8d2242df4ab 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -20,10 +20,14 @@ private import SideEffects * they were explicit nodes in the expression tree, rather than as implicit * nodes as in the regular AST representation. */ -private Element getRealParent(Expr expr) { +Element getRealParent(Expr expr) { result = expr.getParentWithConversions() or result.(Destructor).getADestruction() = expr + or + result.(Expr).getAnImplicitDestructorCall() = expr + or + result.(Stmt).getAnImplicitDestructorCall() = expr } IRUserVariable getIRUserVariable(Declaration decl, Variable var) { @@ -105,12 +109,6 @@ private predicate ignoreExprOnly(Expr expr) { newExpr.getAllocatorCall() = expr ) or - exists(DeleteOrDeleteArrayExpr deleteExpr | - // Ignore the destructor call as we don't model it yet. Don't ignore - // its arguments, though, as they are the arguments to the deallocator. - deleteExpr.getDestructorCall() = expr - ) - or // The extractor deliberately emits an `ErrorExpr` as the first argument to // the allocator call, if any, of a `NewOrNewArrayExpr`. That `ErrorExpr` // should not be translated. @@ -118,6 +116,11 @@ private predicate ignoreExprOnly(Expr expr) { or not translateFunction(getEnclosingFunction(expr)) and not Raw::varHasIRFunc(getEnclosingVariable(expr)) + or + exists(DeleteOrDeleteArrayExpr deleteExpr | + // Ignore the destructor call, because the duplicated qualifier breaks control flow. + deleteExpr.getDestructorCall() = expr + ) } /** @@ -608,16 +611,27 @@ newtype TTranslatedElement = TTranslatedInitialization(Expr expr) { not ignoreExpr(expr) and ( - exists(Initializer init | init.getExpr().getFullyConverted() = expr) or - exists(ClassAggregateLiteral initList | initList.getAFieldExpr(_).getFullyConverted() = expr) or + exists(Initializer init | init.getExpr().getFullyConverted() = expr) + or + exists(ClassAggregateLiteral initList | initList.getAFieldExpr(_).getFullyConverted() = expr) + or exists(ArrayOrVectorAggregateLiteral initList | initList.getAnElementExpr(_).getFullyConverted() = expr - ) or - exists(ReturnStmt returnStmt | returnStmt.getExpr().getFullyConverted() = expr) or - exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) or - exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) or - exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) or - exists(TemporaryObjectExpr temp | temp.getExpr() = expr) or + ) + or + exists(ReturnStmt returnStmt | + returnStmt.getExpr().getFullyConverted() = expr and + hasReturnValue(returnStmt.getEnclosingFunction()) + ) + or + exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) + or + exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) + or + exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) + or + exists(TemporaryObjectExpr temp | temp.getExpr() = expr) + or exists(LambdaExpression lambda | lambda.getInitializer().getFullyConverted() = expr) ) } or @@ -751,8 +765,6 @@ newtype TTranslatedElement = // on `*this` without an `Expr`. TTranslatedStructorQualifierSideEffect(Call call, SideEffectOpcode opcode) { not ignoreSideEffects(call) and - // Don't bother with destructor calls for now, since we won't see very many of them in the IR - // until we start injecting implicit destructor calls. call instanceof ConstructorCall and opcode = getASideEffectOpcode(call, -1) } or @@ -866,6 +878,23 @@ abstract class TranslatedElement extends TTranslatedElement { 1 + sum(TranslatedElement child | child = this.getChildByRank(_) | child.getDescendantCount()) } + /** + * Holds if this element has implicit destructor calls that should follow it. + */ + predicate hasAnImplicitDestructorCall() { none() } + + /** + * Gets the child index of the first destructor call that should be executed after this `TranslatedElement` + */ + int getFirstDestructorCallIndex() { none() } + + /** + * Holds if this `TranslatedElement` includes any destructor calls that must be performed after + * it in its `getChildSuccessorInternal`, `getInstructionSuccessorInternal`, and + * `getALastInstructionInternal` relations, rather than needing them inserted. + */ + predicate handlesDestructorsExplicitly() { none() } + private int getUniqueId() { if not exists(this.getParent()) then result = 0 @@ -901,15 +930,81 @@ abstract class TranslatedElement extends TTranslatedElement { /** * Gets the successor instruction of the instruction that was generated by * this element for tag `tag`. The successor edge kind is specified by `kind`. + * This predicate does not usually include destructors, which are inserted as + * part of `getInstructionSuccessor` unless `handlesDestructorsExplicitly` + * holds. */ - abstract Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind); + abstract Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind); + + /** + * Gets the successor instruction of the instruction that was generated by + * this element for tag `tag`. The successor edge kind is specified by `kind`. + */ + final Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + if + this.hasAnImplicitDestructorCall() and + this.getInstruction(tag) = this.getALastInstructionInternal() and + not this.handlesDestructorsExplicitly() + then + result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) and + kind instanceof GotoEdge + else result = this.getInstructionSuccessorInternal(tag, kind) + } + + /** + * Gets an instruction within this `TranslatedElement` (including its transitive children) which + * will be followed by an instruction outside the `TranslatedElement`. + */ + final Instruction getALastInstruction() { + if this.hasAnImplicitDestructorCall() and not this.handlesDestructorsExplicitly() + then result = this.getChild(max(int n | exists(this.getChild(n)))).getALastInstruction() // last destructor + else result = this.getALastInstructionInternal() + } + + /** + * Gets an instruction within this `TranslatedElement` (including its transitive children) which + * will be followed by an instruction outside the `TranslatedElement`. + * This predicate does not usually include destructors, which are inserted as + * part of `getALastInstruction` unless `handlesDestructorsExplicitly` holds. + */ + abstract Instruction getALastInstructionInternal(); + + TranslatedElement getLastChild() { none() } + + /** + * Gets the successor instruction to which control should flow after the + * child element specified by `child` has finished execution. The successor + * edge kind is specified by `kind`. + * This predicate does not usually include destructors, which are inserted as + * part of `getChildSuccessor` unless `handlesDestructorsExplicitly` holds. + */ + Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } /** * Gets the successor instruction to which control should flow after the * child element specified by `child` has finished execution. The successor * edge kind is specified by `kind`. */ - abstract Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind); + final Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + ( + if + // this is the last child and we need to handle destructors for it + this.hasAnImplicitDestructorCall() and + not this.handlesDestructorsExplicitly() and + child = this.getLastChild() + then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) + else result = this.getChildSuccessorInternal(child, kind) + ) + or + not this.handlesDestructorsExplicitly() and + exists(int id | + id >= this.getFirstDestructorCallIndex() and + child = this.getChild(id) and + if id = max(int n | exists(this.getChild(n))) + then result = this.getParent().getChildSuccessor(this, kind) + else result = this.getChild(id + 1).getFirstInstruction(kind) + ) + } /** * Gets the instruction to which control should flow if an exception is thrown diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 4bf21a43f63..5ddd0bfab05 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -14,6 +14,7 @@ private import TranslatedFunction private import TranslatedInitialization private import TranslatedStmt private import TranslatedGlobalVar +private import IRConstruction import TranslatedCall /** @@ -75,6 +76,40 @@ abstract class TranslatedExpr extends TranslatedElement { expr.isGLValueCategory() } + /** + * Gets the immediate child element of this element. The `id` is unique + * among all children of this element, but the values are not necessarily + * consecutive. + * + * This predicate does not usually include destructors, which are inserted as + * part of `getChild` unless `handlesDestructorsExplicitly` + * holds. + */ + abstract TranslatedElement getChildInternal(int id); + + final override TranslatedElement getChild(int id) { + result = this.getChildInternal(id) + or + exists(int maxChildId, int destructorIndex | + maxChildId = max(int childId | exists(this.getChildInternal(childId))) and + result.(TranslatedExpr).getExpr() = expr.getImplicitDestructorCall(destructorIndex) and + id = maxChildId + 1 + destructorIndex + ) + } + + final override predicate hasAnImplicitDestructorCall() { + exists(expr.getAnImplicitDestructorCall()) + } + + final override int getFirstDestructorCallIndex() { + not this.handlesDestructorsExplicitly() and + ( + result = max(int childId | exists(this.getChildInternal(childId))) + 1 + or + not exists(this.getChildInternal(_)) and result = 0 + ) + } + final override Locatable getAst() { result = expr } final override Declaration getFunction() { result = getEnclosingDeclaration(expr) } @@ -178,12 +213,16 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, { TranslatedConditionValue() { this = TTranslatedConditionValue(expr) } - override TranslatedElement getChild(int id) { id = 0 and result = this.getCondition() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getCondition() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getCondition().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(ConditionValueResultLoadTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { ( tag = ConditionValueTrueTempAddressTag() or @@ -212,7 +251,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, resultType = this.getResultType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = ConditionValueTrueTempAddressTag() and @@ -289,7 +328,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, override Instruction getResult() { result = this.getInstruction(ConditionValueResultLoadTag()) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and @@ -318,7 +357,9 @@ abstract class TranslatedValueCategoryAdjustment extends TranslatedExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } final override predicate producesExprResult() { // A temp object always produces the result of the expression. @@ -345,17 +386,19 @@ class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad override predicate isResultGLValue() { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = LoadTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(LoadTag()) and kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { result = this.getInstruction(LoadTag()) } + override Instruction getResult() { result = this.getInstruction(LoadTag()) } override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { @@ -393,7 +436,7 @@ class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustme override predicate isResultGLValue() { any() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = InitializerVariableAddressTag() and result = this.getInstruction(InitializerStoreTag()) and kind instanceof GotoEdge @@ -402,7 +445,11 @@ class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustme result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(InitializerStoreTag()) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(InitializerVariableAddressTag()) and kind instanceof GotoEdge @@ -446,7 +493,7 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { result = this.getOperand().getFirstInstruction(kind) } - override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getOperand() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = ResultCopyTag() and @@ -454,12 +501,16 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { resultType = this.getOperand().getResultType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = ResultCopyTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(ResultCopyTag()) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(ResultCopyTag()) and kind instanceof GotoEdge @@ -485,17 +536,23 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { + result = this.getRightOperand().getALastInstruction() + } + + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() } + override TranslatedElement getLastChild() { result = this.getRightOperand() } + override Instruction getResult() { result = this.getRightOperand().getResult() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLeftOperand() and result = this.getRightOperand().getFirstInstruction(kind) or @@ -526,7 +583,9 @@ private int getElementSize(Type type) { abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { override CrementOperation expr; - final override TranslatedElement getChild(int id) { id = 0 and result = this.getLoadedOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getLoadedOperand() + } final override string getInstructionConstantValue(InstructionTag tag) { tag = CrementConstantTag() and @@ -592,7 +651,11 @@ abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { result = this.getLoadedOperand().getFirstInstruction(kind) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(CrementStoreTag()) + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = CrementConstantTag() and @@ -606,7 +669,7 @@ abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLoadedOperand() and result = this.getInstruction(CrementConstantTag()) and kind instanceof GotoEdge @@ -695,18 +758,22 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr { result = this.getBaseOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getBaseOperand() or id = 1 and result = this.getOffsetOperand() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBaseOperand() and result = this.getOffsetOperand().getFirstInstruction(kind) or @@ -753,11 +820,21 @@ abstract class TranslatedTransparentExpr extends TranslatedNonConstantExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + override Instruction getALastInstructionInternal() { + result = this.getOperand().getALastInstruction() + } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override TranslatedElement getLastChild() { result = this.getOperand() } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } + + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getParent().getChildSuccessor(this, kind) } @@ -810,7 +887,7 @@ class TranslatedTransparentConversion extends TranslatedTransparentExpr { class TranslatedThisExpr extends TranslatedNonConstantExpr { override ThisExpr expr; - final override TranslatedElement getChild(int id) { none() } + final override TranslatedElement getChildInternal(int id) { none() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = ThisAddressTag() and @@ -829,7 +906,9 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { kind instanceof GotoEdge } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getALastInstructionInternal() { result = this.getInstruction(ThisLoadTag()) } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = ThisAddressTag() and result = this.getInstruction(ThisLoadTag()) @@ -838,7 +917,9 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = ThisLoadTag() and @@ -855,7 +936,7 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr { override VariableAccess expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getQualifier() // Might not exist } @@ -865,12 +946,12 @@ abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr { override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getQualifier() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -890,6 +971,10 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess { ) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() } @@ -924,6 +1009,10 @@ class TranslatedFieldAccess extends TranslatedVariableAccess { result = this.getQualifier().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = OnlyInstructionTag() and operandTag instanceof UnaryOperandTag and @@ -962,14 +1051,16 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp result = this.getInstruction(StructuredBindingAccessTag()) } - override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { result = this.getInstruction(LoadTag()) } + + override TranslatedElement getChildInternal(int id) { // Structured bindings cannot be qualified. none() } override Instruction getResult() { result = this.getInstruction(LoadTag()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = StructuredBindingAccessTag() and kind instanceof GotoEdge and result = this.getInstruction(LoadTag()) @@ -978,7 +1069,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = StructuredBindingAccessTag() and @@ -1010,7 +1101,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp class TranslatedFunctionAccess extends TranslatedNonConstantExpr { override FunctionAccess expr; - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getQualifier() // Might not exist } @@ -1026,9 +1117,13 @@ class TranslatedFunctionAccess extends TranslatedNonConstantExpr { ) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } @@ -1044,7 +1139,7 @@ class TranslatedFunctionAccess extends TranslatedNonConstantExpr { result = expr.getTarget() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getQualifier() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -1077,7 +1172,11 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { none() } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1091,12 +1190,14 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal resultType = this.getResultType() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } abstract Opcode getOpcode(); } @@ -1154,14 +1255,20 @@ class TranslatedUnaryExpr extends TranslatedSingleInstructionExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -1195,7 +1302,9 @@ abstract class TranslatedConversion extends TranslatedNonConstantExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } final TranslatedExpr getOperand() { result = getTranslatedExpr(expr.getExpr()) } } @@ -1205,12 +1314,16 @@ abstract class TranslatedConversion extends TranslatedNonConstantExpr { * single instruction. */ abstract class TranslatedSingleInstructionConversion extends TranslatedConversion { - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -1307,7 +1420,11 @@ class TranslatedInheritanceConversion extends TranslatedSingleInstructionConvers class TranslatedBoolConversion extends TranslatedConversion { override BoolConversion expr; - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(BoolConversionCompareTag()) + } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = BoolConversionConstantTag() and result = this.getInstruction(BoolConversionCompareTag()) @@ -1316,7 +1433,7 @@ class TranslatedBoolConversion extends TranslatedConversion { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(BoolConversionConstantTag()) and kind instanceof GotoEdge @@ -1432,7 +1549,11 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1456,12 +1577,12 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLeftOperand() and result = this.getRightOperand().getFirstInstruction(kind) or @@ -1518,7 +1639,7 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { class TranslatedAssignExpr extends TranslatedNonConstantExpr { override AssignExpr expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1529,6 +1650,10 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(AssignmentStoreTag()) + } + final override Instruction getResult() { // The following distinction is needed to work around extractor limitations // in old versions of the extractor. @@ -1553,12 +1678,12 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getRValue().getFullyConverted()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = AssignmentStoreTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { // Operands are evaluated right-to-left. child = this.getRightOperand() and result = this.getLeftOperand().getFirstInstruction(kind) @@ -1592,7 +1717,7 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { override BlockAssignExpr expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1603,6 +1728,10 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(AssignmentStoreTag()) + } + final override Instruction getResult() { result = this.getInstruction(AssignmentStoreTag()) } final TranslatedExpr getLeftOperand() { @@ -1613,7 +1742,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getRValue().getFullyConverted()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = LoadTag() and result = this.getInstruction(AssignmentStoreTag()) and kind instanceof GotoEdge @@ -1622,7 +1751,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLeftOperand() and result = this.getRightOperand().getFirstInstruction(kind) or @@ -1661,7 +1790,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { class TranslatedAssignOperation extends TranslatedNonConstantExpr { override AssignOperation expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLoadedLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1672,6 +1801,10 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(AssignmentStoreTag()) + } + final override Instruction getResult() { // The following distinction is needed to work around extractor limitations // in old versions of the extractor. @@ -1708,7 +1841,7 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getRValue().getFullyConverted()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = AssignOperationConvertLeftTag() and @@ -1729,7 +1862,7 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { // Operands are evaluated right-to-left. child = this.getRightOperand() and result = this.getLoadedLeftOperand().getFirstInstruction(kind) @@ -1900,20 +2033,26 @@ class TranslatedConstantAllocationSize extends TranslatedAllocationSize { result = this.getInstruction(AllocationSizeTag()) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(AllocationSizeTag()) + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = AllocationSizeTag() and opcode instanceof Opcode::Constant and resultType = getTypeForPRValue(expr.getAllocator().getParameter(0).getType()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = AllocationSizeTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override TranslatedElement getChild(int id) { none() } + final override TranslatedElement getChildInternal(int id) { none() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override string getInstructionConstantValue(InstructionTag tag) { tag = AllocationSizeTag() and @@ -1937,6 +2076,10 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { result = this.getExtent().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(AllocationSizeTag()) + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { resultType = getTypeForPRValue(expr.getAllocator().getParameter(0).getType()) and ( @@ -1951,7 +2094,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { ) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( this.extentNeedsConversion() and @@ -1966,9 +2109,9 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { result = this.getParent().getChildSuccessor(this, kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getExtent() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExtent() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getExtent() and kind instanceof GotoEdge and if this.extentNeedsConversion() @@ -2102,8 +2245,8 @@ class TranslatedDeleteOrDeleteArrayExpr extends TranslatedNonConstantExpr, Trans else opcode instanceof Opcode::VirtualDeleteFunctionAddress } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedCall.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedCall.super.getInstructionSuccessorInternal(tag, kind) or tag = CallTargetTag() and result = this.getFirstArgumentOrCallInstruction(kind) @@ -2167,7 +2310,11 @@ abstract class StructorCallContext extends TranslatedElement { class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, StructorCallContext { override DestructorFieldDestruction expr; - final override TranslatedElement getChild(int id) { id = 0 and result = this.getDestructorCall() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getDestructorCall() + } + + override TranslatedElement getLastChild() { result = this.getDestructorCall() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -2175,12 +2322,12 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St resultType = getTypeForGLValue(expr.getTarget().getType()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getDestructorCall().getFirstInstruction(kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getDestructorCall() and result = this.getParent().getChildSuccessor(this, kind) } @@ -2192,6 +2339,10 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = OnlyInstructionTag() and operandTag instanceof UnaryOperandTag and @@ -2208,6 +2359,47 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St private TranslatedExpr getDestructorCall() { result = getTranslatedExpr(expr.getExpr()) } } +/** + * The IR translation of a vacuous destructor call. That is, an expression that + * looks like a destructor call, but has no effect. + * + * Note that, even though there's no destructor call, we should still evaluate + * the qualifier. + */ +class TranslatedVacuousDestructorCall extends TranslatedNonConstantExpr { + override VacuousDestructorCall expr; + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } + + final TranslatedExpr getQualifier() { + result = getTranslatedExpr(expr.getQualifier().getFullyConverted()) + } + + override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getQualifier().getFirstInstruction(kind) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + child = this.getQualifier() and + result = this.getParent().getChildSuccessor(this, kind) + } + + override TranslatedElement getChildInternal(int id) { + id = 0 and + result = this.getQualifier() + } + + override Instruction getResult() { none() } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + none() + } + + override Instruction getALastInstructionInternal() { + result = this.getQualifier().getALastInstruction() + } +} + /** * The IR translation of the `?:` operator. This class has the portions of the implementation that * are shared between the standard three-operand form (`a ? b : c`) and the GCC-extension @@ -2216,6 +2408,17 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { override ConditionalExpr expr; + override Instruction getALastInstructionInternal() { + if this.elseIsVoid() + then result = this.getElse().getALastInstruction() + else + if exists(this.getInstruction(ConditionValueResultLoadTag())) + then result = this.getInstruction(ConditionValueResultLoadTag()) + else result = this.getInstruction(ConditionValueResultTempAddressTag()) + } + + override TranslatedElement getLastChild() { this.elseIsVoid() and result = this.getElse() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // Note that the ternary flavor needs no explicit `ConditionalBranch` instruction here, because // the condition is a `TranslatedCondition`, which will simply connect the successor edges of @@ -2260,7 +2463,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { not this.resultIsVoid() and ( not this.thenIsVoid() and @@ -2368,7 +2571,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { else result = this.getInstruction(ConditionValueResultLoadTag()) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getElse() and if this.elseIsVoid() then result = this.getParent().getChildSuccessor(this, kind) @@ -2415,7 +2618,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, ConditionContext { TranslatedTernaryConditionalExpr() { not expr.isTwoOperand() } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getCondition() or id = 1 and result = this.getThen() @@ -2427,8 +2630,8 @@ class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, Condit result = this.getCondition().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { - result = TranslatedConditionalExpr.super.getChildSuccessor(child, kind) + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = TranslatedConditionalExpr.super.getChildSuccessorInternal(child, kind) or ( child = this.getThen() and @@ -2470,7 +2673,7 @@ class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, Condit class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { TranslatedBinaryConditionalExpr() { expr.isTwoOperand() } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { // We only truly have two children, because our "condition" and "then" are the same as far as // the extractor is concerned. id = 0 and result = this.getCondition() @@ -2491,8 +2694,8 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = super.getInstructionSuccessorInternal(tag, kind) or tag = ValueConditionConditionalBranchTag() and ( @@ -2512,8 +2715,8 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { result = this.getCondition().getResult() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { - result = super.getChildSuccessor(child, kind) + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = super.getChildSuccessorInternal(child, kind) or kind instanceof GotoEdge and child = this.getCondition() and @@ -2554,6 +2757,16 @@ class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, override Type getTargetType() { result = expr.getType() } + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + + final override Instruction getChildSuccessorInternal(TranslatedElement elem, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(elem, kind) + } + + final override TranslatedElement getLastChild() { result = this.getInitialization() } + final override TranslatedInitialization getInitialization() { result = getTranslatedInitialization(expr.getExpr()) } @@ -2581,7 +2794,7 @@ abstract class TranslatedThrowExpr extends TranslatedNonConstantExpr { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = ThrowTag() and kind instanceof ExceptionEdge and result = this.getParent().getExceptionSuccessorInstruction(any(GotoEdge edge)) @@ -2599,16 +2812,24 @@ abstract class TranslatedThrowExpr extends TranslatedNonConstantExpr { class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableInitialization { TranslatedThrowValueExpr() { not expr instanceof ReThrowExpr } + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + + final override Instruction getChildSuccessorInternal(TranslatedElement elem, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(elem, kind) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { TranslatedThrowExpr.super.hasInstruction(opcode, tag, resultType) or TranslatedVariableInitialization.super.hasInstruction(opcode, tag, resultType) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedThrowExpr.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedThrowExpr.super.getInstructionSuccessorInternal(tag, kind) or - result = TranslatedVariableInitialization.super.getInstructionSuccessor(tag, kind) + result = TranslatedVariableInitialization.super.getInstructionSuccessorInternal(tag, kind) } final override Instruction getInitializationSuccessor(EdgeKind kind) { @@ -2658,14 +2879,16 @@ class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableIn class TranslatedReThrowExpr extends TranslatedThrowExpr { override ReThrowExpr expr; - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(ThrowTag()) and kind instanceof GotoEdge } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getALastInstructionInternal() { result = this.getInstruction(ThrowTag()) } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } final override Opcode getThrowOpcode() { result instanceof Opcode::ReThrow } } @@ -2696,16 +2919,20 @@ class TranslatedBuiltInOperation extends TranslatedNonConstantExpr { ) } - final override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + final override TranslatedElement getChildInternal(int id) { result = getTranslatedExpr(expr.getChild(id).getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) | result = this.getChild(id + 1).getFirstInstruction(kind) or @@ -2810,15 +3037,19 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(VarArgsVAListStoreTag()) + } + final override Instruction getResult() { none() } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } private TranslatedExpr getVAList() { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = VarArgsStartEllipsisAddressTag() and kind instanceof GotoEdge and result = this.getInstruction(VarArgsStartTag()) @@ -2830,7 +3061,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getVAList() and result = this.getInstruction(VarArgsVAListStoreTag()) and kind instanceof GotoEdge @@ -2883,15 +3114,19 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(VarArgsVAListStoreTag()) + } + final override Instruction getResult() { result = this.getInstruction(VarArgsArgAddressTag()) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } private TranslatedExpr getVAList() { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = VarArgsVAListLoadTag() and kind instanceof GotoEdge and result = this.getInstruction(VarArgsArgAddressTag()) @@ -2908,7 +3143,7 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getVAList() and result = this.getInstruction(VarArgsVAListLoadTag()) and kind instanceof GotoEdge @@ -2955,20 +3190,24 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + final override Instruction getResult() { none() } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } private TranslatedExpr getVAList() { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getVAList() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -3001,9 +3240,13 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = this.getSourceVAList().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(VarArgsVAListStoreTag()) + } + final override Instruction getResult() { result = this.getInstruction(VarArgsVAListStoreTag()) } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getDestinationVAList() or id = 1 and result = this.getSourceVAList() @@ -3017,7 +3260,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getSourceVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = VarArgsVAListLoadTag() and result = this.getDestinationVAList().getFirstInstruction(kind) or @@ -3025,7 +3268,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { kind instanceof GotoEdge and ( child = this.getSourceVAList() and @@ -3059,7 +3302,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, InitializationContext { override NewOrNewArrayExpr expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getAllocatorCall() or id = 1 and result = this.getInitialization() @@ -3075,16 +3318,24 @@ abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, In result = this.getAllocatorCall().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + if exists(this.getInitialization()) + then result = this.getInitialization().getALastInstruction() + else result = this.getInstruction(OnlyInstructionTag()) + } + + override TranslatedElement getLastChild() { result = this.getInitialization() } + final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and if exists(this.getInitialization()) then result = this.getInitialization().getFirstInstruction(kind) else result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { kind instanceof GotoEdge and child = this.getAllocatorCall() and result = this.getInstruction(OnlyInstructionTag()) @@ -3149,17 +3400,23 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr { result = this.getDecl().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { + result = this.getConditionExpr().getALastInstruction() + } + + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getDecl() or id = 1 and result = this.getConditionExpr() } + override TranslatedElement getLastChild() { result = this.getConditionExpr() } + override Instruction getResult() { result = this.getConditionExpr().getResult() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getDecl() and result = this.getConditionExpr().getFirstInstruction(kind) or @@ -3189,11 +3446,15 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() } + override Instruction getALastInstructionInternal() { result = this.getInstruction(LoadTag()) } + + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getInitialization() + } override Instruction getResult() { result = this.getInstruction(LoadTag()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = InitializerVariableAddressTag() and kind instanceof GotoEdge and result = this.getInstruction(InitializerStoreTag()) @@ -3211,7 +3472,7 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getInstruction(LoadTag()) and kind instanceof GotoEdge @@ -3280,14 +3541,20 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr { result = this.getStmt().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getStmt() } + override Instruction getALastInstructionInternal() { + result = this.getStmt().getALastInstruction() + } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getStmt() } + + override TranslatedElement getLastChild() { result = this.getStmt() } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag instanceof OnlyInstructionTag and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getStmt() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -3318,14 +3585,20 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { none() } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override TranslatedElement getChildInternal(int id) { none() } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() @@ -3412,12 +3685,18 @@ class TranslatedAssumeExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { none() } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override TranslatedElement getChildInternal(int id) { none() } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index a8f10f75d16..3e4e83965e2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -114,7 +114,11 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction { kind instanceof GotoEdge } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getInstruction(ExitFunctionTag()) + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = EnterFunctionTag() and @@ -150,7 +154,7 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction { ) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int paramIndex | child = this.getParameter(paramIndex) | if exists(func.getParameter(paramIndex + 1)) or @@ -379,7 +383,13 @@ abstract class TranslatedParameter extends TranslatedElement { kind instanceof GotoEdge } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + if this.hasIndirection() + then result = this.getInstruction(InitializerIndirectStoreTag()) + else result = this.getInstruction(InitializerStoreTag()) + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = InitializerVariableAddressTag() and result = this.getInstruction(InitializerStoreTag()) @@ -397,7 +407,9 @@ abstract class TranslatedParameter extends TranslatedElement { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerVariableAddressTag() and @@ -611,15 +623,23 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon else result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getALastInstructionInternal() { + result = this.getLastChild().getALastInstruction() + } + + override TranslatedElement getLastChild() { + result = this.getChild(max(int id | exists(this.getChild(id)))) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } override Function getFunction() { result = func } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) and if exists(this.getChild(id + 1)) @@ -678,15 +698,23 @@ class TranslatedDestructorDestructionList extends TranslatedElement, else result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getALastInstructionInternal() { + result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() + } + + override TranslatedElement getLastChild() { + result = this.getChild(max(int id | exists(this.getChild(id)))) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } override Function getFunction() { result = func } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) and if exists(this.getChild(id + 1)) @@ -728,7 +756,20 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + if exists(this.getAChild()) + then + result = + max(TranslatedElement child, int id | child = this.getChild(id) | child order by id) + .getFirstInstruction(any(GotoEdge goto)) + else result = this.getParent().getChildSuccessor(this, any(GotoEdge goto)) + } + + override TranslatedElement getLastChild() { + result = this.getChild(max(int id | exists(this.getChild(id)))) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) | if exists(TranslatedReadEffect child2, int id2 | id2 > id and child2 = this.getChild(id2)) then @@ -746,7 +787,7 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } } private TranslatedThisReadEffect getTranslatedThisReadEffect(Function func) { @@ -760,9 +801,9 @@ private TranslatedParameterReadEffect getTranslatedParameterReadEffect(Parameter abstract class TranslatedReadEffect extends TranslatedElement { override TranslatedElement getChild(int id) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } @@ -772,6 +813,10 @@ abstract class TranslatedReadEffect extends TranslatedElement { kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { opcode instanceof Opcode::ReturnIndirection and tag = OnlyInstructionTag() and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll index d14adfa80e8..50322927af9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll @@ -27,6 +27,10 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(ExitFunctionTag()) + } + override TranslatedElement getChild(int n) { n = 1 and result = getTranslatedInitialization(var.getInitializer().getExpr().getFullyConverted()) @@ -58,7 +62,7 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, type = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = EnterFunctionTag() and @@ -81,7 +85,7 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getChild(1) and result = this.getInstruction(ReturnTag()) and kind instanceof GotoEdge diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index fcff4a838eb..9b6165d0782 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -35,13 +35,19 @@ abstract class InitializationContext extends TranslatedElement { * declarations, `return` statements, and `throw` expressions. */ abstract class TranslatedVariableInitialization extends TranslatedElement, InitializationContext { - final override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() } + TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() } final override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(InitializerVariableAddressTag()) and kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInitialization().getALastInstruction() + or + not exists(this.getInitialization()) and result = this.getInstruction(OnlyInstructionTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerVariableAddressTag() and opcode instanceof Opcode::VariableAddress and @@ -53,7 +59,7 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi resultType = getTypeForPRValue(this.getTargetType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { ( tag = InitializerVariableAddressTag() and if this.hasUninitializedInstruction() @@ -71,7 +77,7 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi ) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getInitializationSuccessor(kind) } @@ -177,7 +183,11 @@ abstract class TranslatedListInitialization extends TranslatedInitialization, In result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getChild(max(int i | exists(this.getChild(i)))).getALastInstruction() + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getChild(index) and if exists(this.getChild(index + 1)) @@ -190,7 +200,9 @@ abstract class TranslatedListInitialization extends TranslatedInitialization, In none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } override Instruction getTargetAddress() { result = this.getContext().getTargetAddress() } @@ -260,18 +272,22 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio not expr instanceof StringLiteral } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(InitializerStoreTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerStoreTag() and opcode instanceof Opcode::Store and resultType = getTypeForPRValue(this.getContext().getTargetType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = InitializerStoreTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitializer() and result = this.getInstruction(InitializerStoreTag()) and kind instanceof GotoEdge @@ -296,6 +312,12 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio class TranslatedStringLiteralInitialization extends TranslatedDirectInitialization { override StringLiteral expr; + override Instruction getALastInstructionInternal() { + if this.zeroInitRange(_, _) + then result = this.getInstruction(ZeroPadStringStoreTag()) + else result = this.getInstruction(InitializerStoreTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // Load the string literal to make it a prvalue of type `char[len]` tag = InitializerLoadStringTag() and @@ -337,7 +359,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = InitializerLoadStringTag() and result = this.getInstruction(InitializerStoreTag()) @@ -367,7 +389,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitializer() and result = this.getInstruction(InitializerLoadStringTag()) and kind instanceof GotoEdge @@ -457,16 +479,22 @@ class TranslatedConstructorInitialization extends TranslatedDirectInitialization { override ConstructorCall expr; + override Instruction getALastInstructionInternal() { + result = this.getInitializer().getALastInstruction() + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitializer() and result = this.getParent().getChildSuccessor(this, kind) } + override TranslatedElement getLastChild() { result = this.getInitializer() } + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() } @@ -558,23 +586,29 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio this = TTranslatedExplicitFieldInitialization(ast, field, expr, position) } + override Instruction getALastInstructionInternal() { + result = this.getInitialization().getALastInstruction() + } + override Instruction getTargetAddress() { result = this.getInstruction(this.getFieldAddressTag()) } override Type getTargetType() { result = field.getUnspecifiedType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = this.getFieldAddressTag() and result = this.getInitialization().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getParent().getChildSuccessor(this, kind) } override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() } + override TranslatedElement getLastChild() { result = this.getInitialization() } + private TranslatedInitialization getInitialization() { result = getTranslatedInitialization(expr) } @@ -595,6 +629,10 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, { TranslatedFieldValueInitialization() { this = TTranslatedFieldValueInitialization(ast, field) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(this.getFieldDefaultValueStoreTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { TranslatedFieldInitialization.super.hasInstruction(opcode, tag, resultType) or @@ -607,7 +645,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, resultType = getTypeForPRValue(field.getUnspecifiedType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = this.getFieldAddressTag() and @@ -639,7 +677,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override TranslatedElement getChild(int id) { none() } @@ -689,7 +727,7 @@ abstract class TranslatedElementInitialization extends TranslatedElement { resultType = getTypeForGLValue(this.getElementType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = this.getElementIndexTag() and result = this.getInstruction(this.getElementAddressTag()) and kind instanceof GotoEdge @@ -743,20 +781,24 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ this = TTranslatedExplicitElementInitialization(initList, elementIndex, position) } + override Instruction getALastInstructionInternal() { + result = this.getInitialization().getALastInstruction() + } + override Instruction getTargetAddress() { result = this.getInstruction(this.getElementAddressTag()) } override Type getTargetType() { result = this.getElementType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedElementInitialization.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedElementInitialization.super.getInstructionSuccessorInternal(tag, kind) or tag = this.getElementAddressTag() and result = this.getInitialization().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getParent().getChildSuccessor(this, kind) } @@ -788,6 +830,10 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati this = TTranslatedElementValueInitialization(initList, elementIndex, elementCount) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(this.getElementDefaultValueStoreTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { TranslatedElementInitialization.super.hasInstruction(opcode, tag, resultType) or @@ -800,8 +846,8 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati resultType = this.getDefaultValueType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedElementInitialization.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedElementInitialization.super.getInstructionSuccessorInternal(tag, kind) or kind instanceof GotoEdge and ( @@ -836,7 +882,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override TranslatedElement getChild(int id) { none() } @@ -876,11 +922,13 @@ abstract class TranslatedStructorCallFromStructor extends TranslatedElement, Str final override Function getFunction() { result = getEnclosingFunction(call) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getStructorCall() and result = this.getParent().getChildSuccessor(this, kind) } + override TranslatedElement getLastChild() { result = this.getStructorCall() } + final TranslatedExpr getStructorCall() { result = getTranslatedExpr(call) } } @@ -894,13 +942,17 @@ abstract class TranslatedBaseStructorCall extends TranslatedStructorCallFromStru kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getStructorCall().getALastInstruction() + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::ConvertToNonVirtualBase and resultType = getTypeForGLValue(call.getTarget().getDeclaringType()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getStructorCall().getFirstInstruction(kind) } @@ -947,11 +999,17 @@ class TranslatedConstructorDelegationInit extends TranslatedConstructorCallFromC result = this.getStructorCall().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getStructorCall().getALastInstruction() + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } final override Instruction getReceiver() { result = getTranslatedFunction(this.getFunction()).getInitializeThisInstruction() @@ -1009,6 +1067,8 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getALastInstructionInternal() { none() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } @@ -1017,9 +1077,9 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr override Declaration getFunction() { result = this.getParent().getFunction() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } TranslatedConstructorBareInit getTranslatedConstructorBareInit(ConstructorInit init) { 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 a7d12052392..d8ec66a2ee7 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 @@ -138,7 +138,7 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, result = "1" } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { // Generate -1 -> Compare condition tag = TryExceptGenerateNegativeOne() and kind instanceof GotoEdge and @@ -202,7 +202,7 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { kind instanceof GotoEdge and child = this.getTranslatedCondition() and result = this.getInstruction(TryExceptGenerateNegativeOne()) @@ -211,6 +211,14 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, result = this.getParent().getChildSuccessor(this, kind) } + override TranslatedElement getLastChild() { result = this.getTranslatedHandler() } + + override Instruction getALastInstructionInternal() { + result = this.getTranslatedHandler().getALastInstruction() + or + result = this.getInstruction(UnwindTag()) + } + private TranslatedExpr getTranslatedCondition() { result = getTranslatedExpr(tryExcept.getCondition()) } @@ -235,6 +243,27 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { TranslatedStmt() { this = TTranslatedStmt(stmt) } + abstract TranslatedElement getChildInternal(int id); + + final override TranslatedElement getChild(int id) { + result = this.getChildInternal(id) + or + exists(int destructorIndex | + result.(TranslatedExpr).getExpr() = stmt.getImplicitDestructorCall(destructorIndex) and + id = this.getFirstDestructorCallIndex() + destructorIndex + ) + } + + final override int getFirstDestructorCallIndex() { + result = max(int childId | exists(this.getChildInternal(childId))) + 1 + or + not exists(this.getChildInternal(_)) and result = 0 + } + + final override predicate hasAnImplicitDestructorCall() { + exists(stmt.getAnImplicitDestructorCall()) + } + final override string toString() { result = stmt.toString() } final override Locatable getAst() { result = stmt } @@ -252,25 +281,29 @@ class TranslatedEmptyStmt extends TranslatedStmt { stmt instanceof SwitchCase } - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::NoOp and resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } /** @@ -281,7 +314,7 @@ class TranslatedEmptyStmt extends TranslatedStmt { class TranslatedDeclStmt extends TranslatedStmt { override DeclStmt stmt; - override TranslatedElement getChild(int id) { result = this.getDeclarationEntry(id) } + override TranslatedElement getChildInternal(int id) { result = this.getDeclarationEntry(id) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -294,6 +327,12 @@ class TranslatedDeclStmt extends TranslatedStmt { result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getALastInstructionInternal() { + result = this.getChild(this.getChildCount() - 1).getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getChild(this.getChildCount() - 1) } + private int getChildCount() { result = count(this.getDeclarationEntry(_)) } IRDeclarationEntry getIRDeclarationEntry(int index) { @@ -318,9 +357,9 @@ class TranslatedDeclStmt extends TranslatedStmt { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getDeclarationEntry(index) and if index = (this.getChildCount() - 1) @@ -335,7 +374,7 @@ class TranslatedExprStmt extends TranslatedStmt { TranslatedExpr getExpr() { result = getTranslatedExpr(stmt.getExpr().getFullyConverted()) } - override TranslatedElement getChild(int id) { id = 0 and result = this.getExpr() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExpr() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -345,9 +384,15 @@ class TranslatedExprStmt extends TranslatedStmt { result = this.getExpr().getFirstInstruction(kind) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getALastInstructionInternal() { + result = this.getExpr().getALastInstruction() + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override TranslatedElement getLastChild() { result = this.getExpr() } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getExpr() and result = this.getParent().getChildSuccessor(this, kind) } @@ -359,6 +404,21 @@ abstract class TranslatedReturnStmt extends TranslatedStmt { final TranslatedFunction getEnclosingFunction() { result = getTranslatedFunction(stmt.getEnclosingFunction()) } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + exists(int id | + child = this.getChild(id) and + id >= this.getFirstDestructorCallIndex() and + ( + result = this.getChild(id + 1).getFirstInstruction(kind) + or + not exists(this.getChild(id + 1)) and + result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + ) + ) + } + + final override predicate handlesDestructorsExplicitly() { any() } } /** @@ -368,7 +428,19 @@ class TranslatedReturnValueStmt extends TranslatedReturnStmt, TranslatedVariable TranslatedReturnValueStmt() { stmt.hasExpr() and hasReturnValue(stmt.getEnclosingFunction()) } final override Instruction getInitializationSuccessor(EdgeKind kind) { - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + if this.hasAnImplicitDestructorCall() + then result = this.getChild(1).getFirstInstruction(kind) + else result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(child, kind) + or + result = TranslatedReturnStmt.super.getChildSuccessorInternal(child, kind) + } + + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) } final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() } @@ -390,7 +462,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { stmt.hasExpr() and not hasReturnValue(stmt.getEnclosingFunction()) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExpr() } @@ -399,21 +471,31 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { result = this.getExpr().getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + if this.hasAnImplicitDestructorCall() + then result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() + else result = this.getInstruction(OnlyInstructionTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::NoOp and resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + if this.hasAnImplicitDestructorCall() + then result = this.getChild(1).getFirstInstruction(kind) + else result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getExpr() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge + or + result = TranslatedReturnStmt.super.getChildSuccessorInternal(child, kind) } private TranslatedExpr getExpr() { result = getTranslatedExpr(stmt.getExpr()) } @@ -428,25 +510,43 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { not stmt.hasExpr() and not hasReturnValue(stmt.getEnclosingFunction()) } - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + if this.hasAnImplicitDestructorCall() + then result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() + else result = this.getInstruction(OnlyInstructionTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::NoOp and resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + if this.hasAnImplicitDestructorCall() + then result = this.getChild(0).getFirstInstruction(kind) + else result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + exists(int id | + this.getChild(id) = child and + ( + result = this.getChild(id + 1).getFirstInstruction(kind) + or + not exists(this.getChild(id + 1)) and + result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + ) + ) + } } /** @@ -464,6 +564,16 @@ class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariab result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(child, kind) + or + result = TranslatedReturnStmt.super.getChildSuccessorInternal(child, kind) + } + final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() } final override TranslatedInitialization getInitialization() { none() } @@ -518,7 +628,7 @@ private class TryOrMicrosoftTryStmt extends Stmt { class TranslatedTryStmt extends TranslatedStmt { override TryOrMicrosoftTryStmt stmt; - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getBody() or result = this.getHandler(id - 1) @@ -531,13 +641,23 @@ class TranslatedTryStmt extends TranslatedStmt { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getBody().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getLastChild().getALastInstruction() + } + + override TranslatedElement getLastChild() { + if exists(this.getFinally()) + then result = this.getFinally() + else result = [this.getBody(), this.getHandler(_)] + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { // All non-finally children go to the successor of the `try` if // there is no finally block, but if there is a finally block // then we go to that one. @@ -581,7 +701,7 @@ class TranslatedTryStmt extends TranslatedStmt { class TranslatedBlock extends TranslatedStmt { override BlockStmt stmt; - override TranslatedElement getChild(int id) { result = this.getStmt(id) } + override TranslatedElement getChildInternal(int id) { result = this.getStmt(id) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { this.isEmpty() and @@ -596,18 +716,26 @@ class TranslatedBlock extends TranslatedStmt { else result = this.getStmt(0).getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + if this.isEmpty() + then result = this.getInstruction(OnlyInstructionTag()) + else result = this.getStmt(this.getStmtCount() - 1).getFirstInstruction(any(GotoEdge goto)) + } + + override TranslatedElement getLastChild() { result = this.getStmt(this.getStmtCount() - 1) } + private predicate isEmpty() { not exists(stmt.getStmt(0)) } private TranslatedStmt getStmt(int index) { result = getTranslatedStmt(stmt.getStmt(index)) } private int getStmtCount() { result = stmt.getNumStmt() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getStmt(index) and if index = (this.getStmtCount() - 1) @@ -623,14 +751,20 @@ class TranslatedBlock extends TranslatedStmt { abstract class TranslatedHandler extends TranslatedStmt { override Handler stmt; - override TranslatedElement getChild(int id) { id = 1 and result = this.getBlock() } + override TranslatedElement getChildInternal(int id) { id = 1 and result = this.getBlock() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(CatchTag()) and kind instanceof GotoEdge } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getBlock().getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getBlock() } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBlock() and result = this.getParent().getChildSuccessor(this, kind) } @@ -656,20 +790,20 @@ class TranslatedCatchByTypeHandler extends TranslatedHandler { resultType = getVoidType() } - override TranslatedElement getChild(int id) { - result = super.getChild(id) + override TranslatedElement getChildInternal(int id) { + result = super.getChildInternal(id) or id = 0 and result = this.getParameter() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { - result = super.getChildSuccessor(child, kind) + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = super.getChildSuccessorInternal(child, kind) or child = this.getParameter() and result = this.getBlock().getFirstInstruction(kind) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = CatchTag() and ( kind instanceof GotoEdge and @@ -702,7 +836,7 @@ class TranslatedCatchAnyHandler extends TranslatedHandler { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = CatchTag() and result = this.getBlock().getFirstInstruction(kind) } @@ -717,7 +851,13 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { else result = this.getFirstConditionInstruction(kind) } - override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { + result = this.getElse().getALastInstruction() or result = this.getThen().getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getElse() or result = this.getThen() } + + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getCondition() @@ -747,7 +887,7 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { private predicate hasElse() { exists(stmt.getElse()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and @@ -761,7 +901,7 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstConditionInstruction(kind) or @@ -783,7 +923,7 @@ class TranslatedConstExprIfStmt extends TranslatedStmt, ConditionContext { else result = this.getFirstConditionInstruction(kind) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getCondition() @@ -813,7 +953,7 @@ class TranslatedConstExprIfStmt extends TranslatedStmt, ConditionContext { private predicate hasElse() { exists(stmt.getElse()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and @@ -827,7 +967,7 @@ class TranslatedConstExprIfStmt extends TranslatedStmt, ConditionContext { else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstConditionInstruction(kind) or @@ -838,11 +978,23 @@ class TranslatedConstExprIfStmt extends TranslatedStmt, ConditionContext { override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } + + override Instruction getALastInstructionInternal() { + result = this.getThen().getALastInstruction() + or + result = this.getElse().getALastInstruction() + } } abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { override Loop stmt; + override Instruction getALastInstructionInternal() { + result = this.getCondition().getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getCondition() } + final TranslatedCondition getCondition() { result = getTranslatedCondition(stmt.getCondition().getFullyConverted()) } @@ -857,7 +1009,7 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { final predicate hasCondition() { exists(stmt.getCondition()) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getCondition() or id = 1 and result = this.getBody() @@ -867,13 +1019,15 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } final override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and result = this.getBody().getFirstInstruction(kind) } - final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { + override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and result = this.getParent().getChildSuccessor(this, kind) } @@ -882,13 +1036,36 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { class TranslatedWhileStmt extends TranslatedLoop { TranslatedWhileStmt() { stmt instanceof WhileStmt } + override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getCondition() + or + id = 1 and result = this.getBody() + or + exists(int n | + result.getAst() = stmt.getImplicitDestructorCall(n) and + id = 2 + n + ) + } + + override predicate handlesDestructorsExplicitly() { any() } + + final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { + child = this.getCondition() and + if this.hasAnImplicitDestructorCall() + then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) + else result = this.getParent().getChildSuccessor(this, kind) + } + override Instruction getFirstInstruction(EdgeKind kind) { result = this.getFirstConditionInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBody() and result = this.getFirstConditionInstruction(kind) + or + child = this.getChild(this.getFirstDestructorCallIndex()) and + result = this.getParent().getChildSuccessor(this, kind) } } @@ -899,7 +1076,7 @@ class TranslatedDoStmt extends TranslatedLoop { result = this.getBody().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBody() and result = this.getFirstConditionInstruction(kind) } @@ -908,7 +1085,16 @@ class TranslatedDoStmt extends TranslatedLoop { class TranslatedForStmt extends TranslatedLoop { override ForStmt stmt; - override TranslatedElement getChild(int id) { + override predicate handlesDestructorsExplicitly() { any() } + + final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { + child = this.getCondition() and + if this.hasAnImplicitDestructorCall() + then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) + else result = this.getParent().getChildSuccessor(this, kind) + } + + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getCondition() @@ -916,6 +1102,11 @@ class TranslatedForStmt extends TranslatedLoop { id = 2 and result = this.getUpdate() or id = 3 and result = this.getBody() + or + exists(int n | + result.getAst() = stmt.getImplicitDestructorCall(n) and + id = 4 + n + ) } private TranslatedStmt getInitialization() { @@ -934,7 +1125,7 @@ class TranslatedForStmt extends TranslatedLoop { else result = this.getFirstConditionInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstConditionInstruction(kind) or @@ -946,6 +1137,19 @@ class TranslatedForStmt extends TranslatedLoop { ) or child = this.getUpdate() and result = this.getFirstConditionInstruction(kind) + or + exists(int destructorId | + destructorId >= this.getFirstDestructorCallIndex() and + child = this.getChild(destructorId) and + result = this.getChild(destructorId + 1).getFirstInstruction(kind) + ) + or + exists(int lastDestructorIndex | + lastDestructorIndex = + max(int n | exists(this.getChild(n)) and n >= this.getFirstDestructorCallIndex()) and + child = this.getChild(lastDestructorIndex) and + result = this.getParent().getChildSuccessor(this, kind) + ) } } @@ -959,7 +1163,7 @@ class TranslatedForStmt extends TranslatedLoop { class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { override RangeBasedForStmt stmt; - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getRangeVariableDeclStmt() @@ -988,7 +1192,13 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { else result = this.getFirstRangeVariableDeclStmtInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getALastInstructionInternal() { + result = this.getCondition().getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getCondition() } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstRangeVariableDeclStmtInstruction(kind) or @@ -1012,7 +1222,7 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and @@ -1070,7 +1280,11 @@ class TranslatedJumpStmt extends TranslatedStmt { kind instanceof GotoEdge } - override TranslatedElement getChild(int id) { none() } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + override TranslatedElement getChildInternal(int id) { none() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -1078,12 +1292,12 @@ class TranslatedJumpStmt extends TranslatedStmt { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = getTranslatedStmt(stmt.getTarget()).getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } private EdgeKind getCaseEdge(SwitchCase switchCase) { @@ -1114,7 +1328,13 @@ class TranslatedSwitchStmt extends TranslatedStmt { else result = this.getFirstExprInstruction(kind) } - override TranslatedElement getChild(int id) { + override Instruction getALastInstructionInternal() { + result = this.getBody().getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getBody() } + + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getExpr() @@ -1140,7 +1360,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { result = this.getExpr().getResult() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = SwitchBranchTag() and exists(SwitchCase switchCase | switchCase = stmt.getASwitchCase() and @@ -1154,7 +1374,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { result = this.getParent().getChildSuccessor(this, any(GotoEdge edge)) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstExprInstruction(kind) or @@ -1169,7 +1389,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { class TranslatedAsmStmt extends TranslatedStmt { override AsmStmt stmt; - override TranslatedExpr getChild(int id) { + override TranslatedExpr getChildInternal(int id) { result = getTranslatedExpr(stmt.getChild(id).(Expr).getFullyConverted()) } @@ -1181,6 +1401,8 @@ class TranslatedAsmStmt extends TranslatedStmt { ) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(AsmTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = AsmTag() and opcode instanceof Opcode::InlineAsm and @@ -1191,7 +1413,7 @@ class TranslatedAsmStmt extends TranslatedStmt { exists(int index | tag = AsmTag() and operandTag = asmOperand(index) and - result = this.getChild(index).getResult() + result = this.getChildInternal(index).getResult() ) } @@ -1203,12 +1425,12 @@ class TranslatedAsmStmt extends TranslatedStmt { result = getUnknownType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = AsmTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getChild(index) and if exists(this.getChild(index + 1)) @@ -1223,7 +1445,7 @@ class TranslatedAsmStmt extends TranslatedStmt { class TranslatedVlaDimensionStmt extends TranslatedStmt { override VlaDimensionStmt stmt; - override TranslatedExpr getChild(int id) { + override TranslatedExpr getChildInternal(int id) { id = 0 and result = getTranslatedExpr(stmt.getDimensionExpr().getFullyConverted()) } @@ -1232,13 +1454,19 @@ class TranslatedVlaDimensionStmt extends TranslatedStmt { result = this.getChild(0).getFirstInstruction(kind) } + override Instruction getALastInstructionInternal() { + result = this.getChild(0).getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getChild(0) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getChild(0) and result = this.getParent().getChildSuccessor(this, kind) } @@ -1247,13 +1475,17 @@ class TranslatedVlaDimensionStmt extends TranslatedStmt { class TranslatedVlaDeclarationStmt extends TranslatedStmt { override VlaDeclStmt stmt; - override TranslatedExpr getChild(int id) { none() } + override TranslatedExpr getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // TODO: This needs a new kind of instruction that represents initialization of a VLA. // For now we just emit a `NoOp` instruction so that the CFG isn't incomplete. @@ -1262,10 +1494,10 @@ class TranslatedVlaDeclarationStmt extends TranslatedStmt { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll index c1d97d36360..f61a3a52c6b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll @@ -11,7 +11,7 @@ private int getTypeSizeWorkaround(Type type) { exists(Type unspecifiedType | unspecifiedType = type.getUnspecifiedType() and ( - unspecifiedType instanceof FunctionReferenceType and + (unspecifiedType instanceof FunctionReferenceType or unspecifiedType instanceof RoutineType) and result = getPointerSize() or exists(PointerToMemberType ptmType | @@ -176,7 +176,7 @@ private IRType getIRTypeForPRValue(Type type) { isPointerIshType(unspecifiedType) and result.(IRAddressType).getByteSize() = getTypeSize(unspecifiedType) or - unspecifiedType instanceof FunctionPointerIshType and + (unspecifiedType instanceof FunctionPointerIshType or unspecifiedType instanceof RoutineType) and result.(IRFunctionAddressType).getByteSize() = getTypeSize(type) or unspecifiedType instanceof VoidType and result instanceof IRVoidType diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll index 4415dd0c3fc..9689c2f8a3b 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll @@ -15,6 +15,8 @@ private class GetDelimFunction extends TaintFunction, AliasFunction, SideEffectF i.isParameter(3) and o.isParameterDeref(0) } + override predicate isPartialWrite(FunctionOutput o) { o.isParameterDeref(3) } + override predicate parameterNeverEscapes(int index) { index = [0, 1, 3] } override predicate parameterEscapesOnlyViaReturn(int index) { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll index 1c227684e4f..c0e2c0c4538 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll @@ -27,6 +27,8 @@ private class FgetsFunction extends DataFlowFunction, TaintFunction, ArrayFuncti output.isReturnValue() } + override predicate isPartialWrite(FunctionOutput output) { output.isParameterDeref(2) } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { input.isParameter(2) and output.isParameterDeref(0) diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll index e75c38216f4..f61b13dc568 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll @@ -20,6 +20,8 @@ private class InetAton extends TaintFunction, ArrayFunction { output.isParameterDeref(1) } + override predicate isPartialWrite(FunctionOutput output) { output.isParameterDeref(1) } + override predicate hasArrayInput(int bufParam) { bufParam = 0 } override predicate hasArrayOutput(int bufParam) { bufParam = 1 } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll index 883596a8532..fe5448812fd 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll @@ -168,3 +168,57 @@ private class SmartPtrSetterFunction extends MemberFunction, AliasFunction, Side ) } } + +/** A destructor assocaited with a smart pointer. */ +private class SmartPtrDestructor extends Destructor, SideEffectFunction, AliasFunction { + SmartPtr declaringType; + + SmartPtrDestructor() { + declaringType = this.getDeclaringType() and not this.isFromUninstantiatedTemplate(_) + } + + /** + * Gets the destructor associated with the base type of this smart pointer. + */ + private Destructor getBaseTypeDestructor() { + result.getDeclaringType() = declaringType.getBaseType() + } + + override predicate hasOnlySpecificReadSideEffects() { + this.getBaseTypeDestructor().(SideEffectFunction).hasOnlySpecificReadSideEffects() + or + // If there's no declared destructor for the base type then it won't have + // any strange read side effects. + not exists(this.getBaseTypeDestructor()) + } + + override predicate hasOnlySpecificWriteSideEffects() { + this.getBaseTypeDestructor().(SideEffectFunction).hasOnlySpecificWriteSideEffects() + or + // If there's no declared destructor for the base type then it won't have + // any strange write side effects. + not exists(this.getBaseTypeDestructor()) + } + + override predicate hasSpecificReadSideEffect(ParameterIndex i, boolean buffer) { + i = -1 and buffer = false + } + + override predicate hasSpecificWriteSideEffect(ParameterIndex i, boolean buffer, boolean mustWrite) { + i = -1 and buffer = false and mustWrite = true + } + + override predicate parameterNeverEscapes(int index) { + this.getBaseTypeDestructor().(AliasFunction).parameterNeverEscapes(index) + or + // If there's no declared destructor for the base type then it won't cause + // anything to escape. + not exists(this.getBaseTypeDestructor()) and + index = -1 + } + + override predicate parameterEscapesOnlyViaReturn(int index) { + // A destructor call does not have a return value + none() + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll index 1fb42010caf..877dc5d3ac4 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll @@ -118,6 +118,8 @@ private class StdSequenceContainerData extends TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -147,6 +149,8 @@ private class StdSequenceContainerPushModel extends StdSequenceContainerPush, Ta input.isParameterDeref(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -207,6 +211,8 @@ private class StdSequenceContainerInsertModel extends StdSequenceContainerInsert output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -263,6 +269,8 @@ private class StdSequenceContainerAt extends TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -297,6 +305,8 @@ private class StdSequenceEmplaceModel extends StdSequenceEmplace, TaintFunction output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -335,6 +345,8 @@ private class StdSequenceEmplaceBackModel extends StdSequenceEmplaceBack, TaintF input.isParameterDeref([0 .. this.getNumberOfParameters() - 1]) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll index 9dc220e79af..b6d869d7bea 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll @@ -3,6 +3,7 @@ */ import semmle.code.cpp.models.interfaces.Taint +import semmle.code.cpp.models.interfaces.DataFlow import semmle.code.cpp.models.interfaces.Iterator /** @@ -53,6 +54,8 @@ private class StdMapInsert extends TaintFunction { output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -75,6 +78,8 @@ private class StdMapEmplace extends TaintFunction { input.isQualifierObject() and output.isReturnValue() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -102,6 +107,8 @@ private class StdMapTryEmplace extends TaintFunction { input.isQualifierObject() and output.isReturnValue() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -115,6 +122,8 @@ private class StdMapMerge extends TaintFunction { input.isParameterDeref(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -132,6 +141,8 @@ private class StdMapAt extends TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll index bd2ba99aff0..8fe7fb930c2 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll @@ -61,6 +61,8 @@ private class StdSetInsert extends TaintFunction { output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -82,6 +84,8 @@ private class StdSetEmplace extends TaintFunction { input.isQualifierObject() and output.isReturnValue() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -95,6 +99,8 @@ private class StdSetMerge extends TaintFunction { input.isParameterDeref(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll index 9ddf87085df..e2246874579 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll @@ -129,6 +129,8 @@ private class StdStringDataModel extends StdStringData, StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -142,6 +144,8 @@ private class StdStringPush extends StdStringTaintFunction { input.isParameter(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -204,6 +208,8 @@ private class StdStringAppend extends StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -237,6 +243,8 @@ private class StdStringInsert extends StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -305,6 +313,8 @@ private class StdStringAt extends StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -338,6 +348,8 @@ private class StdIStreamIn extends DataFlowFunction, TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -358,6 +370,8 @@ private class StdIStreamInNonMember extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from first parameter to second parameter input.isParameterDeref(0) and @@ -403,6 +417,8 @@ private class StdIStreamRead extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from qualifier to first parameter input.isQualifierObject() and @@ -442,6 +458,8 @@ private class StdIStreamPutBack extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from first parameter (value or pointer) to qualifier input.isParameter(0) and @@ -478,6 +496,8 @@ private class StdIStreamGetLine extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from qualifier to first parameter input.isQualifierObject() and @@ -540,6 +560,8 @@ private class StdOStreamOut extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from first parameter (value or pointer) to qualifier input.isParameter(0) and @@ -579,6 +601,8 @@ private class StdOStreamOutNonMember extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isParameterDeref(0) } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from second parameter to first parameter input.isParameterDeref(1) and @@ -672,6 +696,8 @@ private class StdStreamFunction extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // reverse flow from returned reference to the qualifier input.isReturnValueDeref() and diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll index 8f6c17aae54..a4070c2f907 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll @@ -36,6 +36,8 @@ private class Strcrement extends ArrayFunction, TaintFunction, SideEffectFunctio input.isParameter(index) and output.isReturnValue() or input.isParameterDeref(index) and output.isReturnValueDeref() + or + input.isParameterDeref(index) and output.isParameterDeref(index) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll index b30861254dc..7b78a0787b8 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll @@ -10,6 +10,7 @@ import semmle.code.cpp.Function import FunctionInputsAndOutputs import semmle.code.cpp.models.Models +import PartialFlow /** * A library function for which a value is or may be copied from a parameter @@ -18,7 +19,7 @@ import semmle.code.cpp.models.Models * Note that this does not include partial copying of values or partial writes * to destinations; that is covered by `TaintModel.qll`. */ -abstract class DataFlowFunction extends Function { +abstract class DataFlowFunction extends PartialFlowFunction { /** * Holds if data can be copied from the argument, qualifier, or buffer * represented by `input` to the return value or buffer represented by diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll new file mode 100644 index 00000000000..0afa8943d67 --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll @@ -0,0 +1,31 @@ +/** + * Provides an abstract class to override the implicit assumption that a + * dataflow/taint-tracking model always fully override the parameters they are + * are modeled as writing to. To use this QL library, create a QL class + * extending `PartialFlowFunction` with a characteristic predicate that selects + * the function or set of functions you are modeling and override the + * `isPartialWrite` predicate. + * + * Note: Since both `DataFlowFunction` and `TaintFunction` extend this class + * you don't need to explicitly add this as a base class if your QL class + * already extends either `DataFlowFunction` or `TaintFunction`. + */ + +import semmle.code.cpp.Function +import FunctionInputsAndOutputs +import semmle.code.cpp.models.Models + +/** + * A function that may update part of a `FunctionOutput`. + * + * For example, the destination argument of `strcat` only updates part of the + * argument. + */ +abstract class PartialFlowFunction extends Function { + /** + * Holds if the write to output does not overwrite the entire value that was + * there before, or does not do so reliably. For example the destination + * argument of `strcat` is modified but not overwritten. + */ + predicate isPartialWrite(FunctionOutput output) { none() } +} diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll index 05a5d9f1c28..e7b507a2f7e 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll @@ -10,6 +10,7 @@ import semmle.code.cpp.Function import FunctionInputsAndOutputs import semmle.code.cpp.models.Models +import PartialFlow /** * A library function for which a taint-tracking library should propagate taint @@ -23,7 +24,7 @@ import semmle.code.cpp.models.Models * altered (for example copying a string with `strncpy`), this is also considered * data flow. */ -abstract class TaintFunction extends Function { +abstract class TaintFunction extends PartialFlowFunction { /** * Holds if data passed into the argument, qualifier, or buffer represented by * `input` influences the return value or buffer represented by `output` diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index ffcd73ff5d7..f6acd424bb0 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.9.6 + +### Minor Analysis Improvements + +* The "non-constant format string" query (`cpp/non-constant-format`) has been converted to a `path-problem` query. +* The new C/C++ dataflow and taint-tracking libraries (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`) now implicitly assume that dataflow and taint modelled via `DataFlowFunction` and `TaintFunction` always fully overwrite their buffers and thus act as flow barriers. As a result, many dataflow and taint-tracking queries now produce fewer false positives. To remove this assumption and go back to the previous behavior for a given model, one can override the new `isPartialWrite` predicate. + ## 0.9.5 ### Minor Analysis Improvements diff --git a/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql b/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql index 2a50e7ae358..0d1cc7bcf39 100644 --- a/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql +++ b/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql @@ -8,7 +8,7 @@ * type `const char*` it is still considered non-constant if the value is not coming from a string * literal. For example, for a parameter with type `const char*` of an exported function that is * used as a format string, there is no way to ensure the originating value was a string literal. - * @kind problem + * @kind path-problem * @problem.severity recommendation * @security-severity 9.3 * @precision high @@ -26,6 +26,7 @@ import semmle.code.cpp.ir.dataflow.internal.ModelUtil import semmle.code.cpp.models.interfaces.DataFlow import semmle.code.cpp.models.interfaces.Taint import semmle.code.cpp.ir.IR +import NonConstFlow::PathGraph class UncalledFunction extends Function { UncalledFunction() { @@ -68,7 +69,10 @@ predicate isNonConst(DataFlow::Node node) { // Parameters of uncalled functions that aren't const exists(UncalledFunction f, Parameter p | f.getAParameter() = p and - p = node.asParameter() + p = node.asParameter() and + // Ignore main's argv parameter as it is already considered a `FlowSource` + // not ignoring it will result in path redundancies + (f.getName() = "main" implies p != f.getParameter(1)) ) or // Consider as an input any out arg of a function or a function's return where the function is not: @@ -127,11 +131,13 @@ module NonConstFlowConfig implements DataFlow::ConfigSig { module NonConstFlow = TaintTracking::Global; -from FormattingFunctionCall call, Expr formatString, DataFlow::Node sink +from + FormattingFunctionCall call, Expr formatString, NonConstFlow::PathNode sink, + NonConstFlow::PathNode source where + isSinkImpl(sink.getNode(), formatString) and call.getArgument(call.getFormatParameterIndex()) = formatString and - NonConstFlow::flowTo(sink) and - isSinkImpl(sink, formatString) -select formatString, - "The format string argument to " + call.getTarget().getName() + - " should be constant to prevent security issues and other potential errors." + NonConstFlow::flowPath(source, sink) +select sink.getNode(), source, sink, + "The format string argument to $@ has a source which cannot be " + + "verified to originate from a string literal.", call, call.getTarget().getName() diff --git a/cpp/ql/src/change-notes/released/0.9.6.md b/cpp/ql/src/change-notes/released/0.9.6.md new file mode 100644 index 00000000000..0c85f3f9f0f --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.9.6.md @@ -0,0 +1,6 @@ +## 0.9.6 + +### Minor Analysis Improvements + +* The "non-constant format string" query (`cpp/non-constant-format`) has been converted to a `path-problem` query. +* The new C/C++ dataflow and taint-tracking libraries (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`) now implicitly assume that dataflow and taint modelled via `DataFlowFunction` and `TaintFunction` always fully overwrite their buffers and thus act as flow barriers. As a result, many dataflow and taint-tracking queries now produce fewer false positives. To remove this assumption and go back to the previous behavior for a given model, one can override the new `isPartialWrite` predicate. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 460240feaff..19139c132b2 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.9.5 +lastReleaseVersion: 0.9.6 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 371648a28fd..4052647bb97 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.9.5 +version: 0.9.6 groups: - cpp - queries diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected index bb062dac218..96f5e711fd5 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected @@ -33,11 +33,14 @@ edges | test.cpp:76:20:76:29 | *call to mk_array_p [p] | test.cpp:83:9:83:11 | *arr [p] | provenance | | | test.cpp:79:9:79:11 | *arr [p] | test.cpp:79:14:79:14 | p | provenance | | | test.cpp:83:9:83:11 | *arr [p] | test.cpp:83:14:83:14 | p | provenance | | +| test.cpp:87:28:87:30 | *arr [p] | test.cpp:87:28:87:30 | *arr [p] | provenance | | | test.cpp:87:28:87:30 | *arr [p] | test.cpp:89:9:89:11 | *arr [p] | provenance | | | test.cpp:87:28:87:30 | *arr [p] | test.cpp:93:9:93:11 | *arr [p] | provenance | | | test.cpp:89:9:89:11 | *arr [p] | test.cpp:89:14:89:14 | p | provenance | | | test.cpp:93:9:93:11 | *arr [p] | test.cpp:93:14:93:14 | p | provenance | | | test.cpp:98:18:98:27 | *call to mk_array_p [p] | test.cpp:87:28:87:30 | *arr [p] | provenance | | +| test.cpp:98:18:98:27 | *call to mk_array_p [p] | test.cpp:98:18:98:27 | test6_callee output argument [p] | provenance | | +| test.cpp:98:18:98:27 | test6_callee output argument [p] | test.cpp:98:18:98:27 | *call to mk_array_p [p] | provenance | | nodes | test.cpp:4:17:4:22 | call to malloc | semmle.label | call to malloc | | test.cpp:6:9:6:11 | arr | semmle.label | arr | @@ -77,12 +80,15 @@ nodes | test.cpp:83:9:83:11 | *arr [p] | semmle.label | *arr [p] | | test.cpp:83:14:83:14 | p | semmle.label | p | | test.cpp:87:28:87:30 | *arr [p] | semmle.label | *arr [p] | +| test.cpp:87:28:87:30 | *arr [p] | semmle.label | *arr [p] | | test.cpp:89:9:89:11 | *arr [p] | semmle.label | *arr [p] | | test.cpp:89:14:89:14 | p | semmle.label | p | | test.cpp:93:9:93:11 | *arr [p] | semmle.label | *arr [p] | | test.cpp:93:14:93:14 | p | semmle.label | p | | test.cpp:98:18:98:27 | *call to mk_array_p [p] | semmle.label | *call to mk_array_p [p] | +| test.cpp:98:18:98:27 | test6_callee output argument [p] | semmle.label | test6_callee output argument [p] | subpaths +| test.cpp:98:18:98:27 | *call to mk_array_p [p] | test.cpp:87:28:87:30 | *arr [p] | test.cpp:87:28:87:30 | *arr [p] | test.cpp:98:18:98:27 | test6_callee output argument [p] | #select | test.cpp:10:9:10:11 | arr | test.cpp:4:17:4:22 | call to malloc | test.cpp:10:9:10:11 | arr | Off-by one error allocated at $@ bounded by $@. | test.cpp:4:17:4:22 | call to malloc | call to malloc | test.cpp:4:24:4:27 | size | size | | test.cpp:10:9:10:11 | arr | test.cpp:4:17:4:22 | call to malloc | test.cpp:10:9:10:11 | arr | Off-by one error allocated at $@ bounded by $@. | test.cpp:4:17:4:22 | call to malloc | call to malloc | test.cpp:4:24:4:27 | size | size | diff --git a/cpp/ql/test/include/iterator.h b/cpp/ql/test/include/iterator.h index 77758bfa8da..5cd7f231284 100644 --- a/cpp/ql/test/include/iterator.h +++ b/cpp/ql/test/include/iterator.h @@ -65,7 +65,7 @@ namespace std { }; template - constexpr back_insert_iterator back_inserter(Container& x) { + constexpr back_insert_iterator back_inserter(Container& x) { // $ ir-def=*x return back_insert_iterator(x); } @@ -89,7 +89,7 @@ namespace std { constexpr front_insert_iterator operator++(int); }; template - constexpr front_insert_iterator front_inserter(Container& x) { + constexpr front_insert_iterator front_inserter(Container& x) { // $ ir-def=*x return front_insert_iterator(x); } } diff --git a/cpp/ql/test/library-tests/arguments/arguments.expected b/cpp/ql/test/library-tests/arguments/arguments.expected index efaf3cf81c0..9d0d85857ef 100644 --- a/cpp/ql/test/library-tests/arguments/arguments.expected +++ b/cpp/ql/test/library-tests/arguments/arguments.expected @@ -3,7 +3,7 @@ | arguments.c | 3 | --edg | | arguments.c | 4 | --disable_system_macros | | arguments.c | 5 | --edg | -| arguments.c | 6 | --verbosity | +| arguments.c | 6 | --codeql-verbosity | | arguments.c | 7 | --edg | | arguments.c | 8 | 2 | | arguments.c | 9 | --edg | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp index 74cc86e5c14..0e9c9f1bc77 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp @@ -56,7 +56,7 @@ void bg_stackstruct(XY s1, XY s2) { } } -void bg_structptr(XY *p1, XY *p2) { // $ ast-def=p1 ast-def=p2 +void bg_structptr(XY *p1, XY *p2) { // $ ast-def=p1 ast-def=p2 ir-def=*p1 ir-def=*p2 p1->x = source(); if (guarded(p1->x)) { sink(p1->x); // $ SPURIOUS: ast diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp index 499e8b8a62b..7b4759ec0bf 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp @@ -8,7 +8,7 @@ struct twoIntFields { int getFirst() { return m1; } }; -void following_pointers( // $ ast-def=sourceStruct1_ptr +void following_pointers( // $ ast-def=sourceStruct1_ptr ir-def=*cleanArray1 ir-def=*sourceArray1 ir-def=*sourceStruct1_ptr int sourceArray1[], int cleanArray1[], twoIntFields sourceStruct1, diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp index ff22b0d12b7..105212ccca6 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp @@ -25,7 +25,7 @@ struct Bottom : Middle { void notSink(int x) override { } }; -void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef +void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef ir-def=*bottomPtr ir-def=*bottomRef Top *topPtr = bottomPtr, &topRef = bottomRef; sink(topPtr->isSource1()); // $ ir MISSING: ast @@ -65,11 +65,11 @@ Top *allocateBottom() { return new Bottom(); } -void callSinkByPointer(Top *top) { // $ ast-def=top +void callSinkByPointer(Top *top) { // $ ast-def=top ir-def=*top top->isSink(source()); // leads to MISSING from ast } -void callSinkByReference(Top &top) { // $ ast-def=top +void callSinkByReference(Top &top) { // $ ast-def=top ir-def=*top top.isSink(source()); // leads to MISSING from ast } @@ -81,11 +81,11 @@ void globalVirtualDispatch() { x->isSink(source()); // $ MISSING: ast,ir } -Top *identity(Top *top) { // $ ast-def=top +Top *identity(Top *top) { // $ ast-def=top ir-def=*top return top; } -void callIdentityFunctions(Top *top, Bottom *bottom) { // $ ast-def=bottom ast-def=top +void callIdentityFunctions(Top *top, Bottom *bottom) { // $ ast-def=bottom ast-def=top ir-def=*bottom ir-def=*top identity(bottom)->isSink(source()); // $ MISSING: ast,ir identity(top)->isSink(source()); // no flow } @@ -120,7 +120,7 @@ namespace virtual_inheritance { struct Bottom : Middle { }; - void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef + void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef ir-def=*bottomPtr ir-def=*bottomRef // Because the inheritance from `Top` is virtual, the following casts go // directly from `Bottom` to `Top`, skipping `Middle`. That means we don't // get flow from a `Middle` value to the call qualifier. diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c b/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c index ad01145cde7..6e80ec61972 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c @@ -12,7 +12,7 @@ typedef struct char isTrue; } MyBool; -void myTest_with_local_flow(MyBool *b, int pos) // $ ast-def=b +void myTest_with_local_flow(MyBool *b, int pos) // $ ast-def=b ir-def=*b { MyCoords coords = {0}; diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp index 826fc542503..d6a06361524 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp @@ -7,7 +7,7 @@ void source_ref(int *toTaint) { // $ ir-def=*toTaint ast-def=toTaint void source_ref(char *toTaint) { // $ ir-def=*toTaint ast-def=toTaint *toTaint = source(); } -void modify_copy(int* ptr) { // $ ast-def=ptr +void modify_copy(int* ptr) { // $ ast-def=ptr ir-def=*ptr int deref = *ptr; int* other = &deref; source_ref(other); @@ -19,7 +19,7 @@ void test_output_copy() { sink(x); // clean } -void modify(int* ptr) { // $ ast-def=ptr +void modify(int* ptr) { // $ ast-def=ptr ir-def=*ptr int* deref = ptr; int* other = &*deref; source_ref(other); @@ -31,7 +31,7 @@ void test_output() { sink(x); // $ ir MISSING: ast } -void modify_copy_of_pointer(int* p, unsigned len) { // $ ast-def=p +void modify_copy_of_pointer(int* p, unsigned len) { // $ ast-def=p ir-def=*p int* p2 = new int[len]; for(unsigned i = 0; i < len; ++i) { p2[i] = p[i]; @@ -46,7 +46,7 @@ void test_modify_copy_of_pointer() { sink(x[0]); // $ SPURIOUS: ast // clean } -void modify_pointer(int* p, unsigned len) { // $ ast-def=p +void modify_pointer(int* p, unsigned len) { // $ ast-def=p ir-def=*p int** p2 = &p; for(unsigned i = 0; i < len; ++i) { *p2[i] = p[i]; @@ -63,17 +63,17 @@ void test_modify_of_pointer() { char* strdup(const char* p); -void modify_copy_via_strdup(char* p) { // $ ast-def=p +void modify_copy_via_strdup(char* p) { // $ ast-def=p ir-def=*p char* p2 = strdup(p); source_ref(p2); } -void test_modify_copy_via_strdup(char* p) { // $ ast-def=p +void test_modify_copy_via_strdup(char* p) { // $ ast-def=p ir-def=*p modify_copy_via_strdup(p); sink(*p); // clean } -int* deref(int** p) { // $ ast-def=p +int* deref(int** p) { // $ ast-def=p ir-def=*p ir-def=**p int* q = *p; return q; } @@ -90,7 +90,7 @@ void addtaint1(int* q) { // $ ast-def=q ir-def=*q *q = source(); } -void addtaint2(int** p) { // $ ast-def=p +void addtaint2(int** p) { // $ ast-def=p ir-def=*p ir-def=**p int* q = *p; addtaint1(q); } @@ -106,13 +106,13 @@ using size_t = decltype(sizeof(int)); void* memcpy(void* dest, const void* src, size_t); -void modify_copy_via_memcpy(char* p) { // $ ast-def=p +void modify_copy_via_memcpy(char* p) { // $ ast-def=p ir-def=*p char* dest; char* p2 = (char*)memcpy(dest, p, 10); source_ref(p2); } -void test_modify_copy_via_memcpy(char* p) { // $ ast-def=p +void test_modify_copy_via_memcpy(char* p) { // $ ast-def=p ir-def=*p modify_copy_via_memcpy(p); sink(*p); // clean } @@ -134,14 +134,14 @@ void source_ref_ref(char** toTaint) { // $ ast-def=toTaint ir-def=*toTaint ir-de // This function copies the value of **p into a new location **p2 and then // taints **p. Thus, **p does not contain tainted data after returning from // this function. -void modify_copy_via_strdup_ptr_001(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_001(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2 char** p2 = strdup_ptr_001(p); // source -> **p2 source_ref_ref(p2); } -void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_001(p); sink(**p); // clean } @@ -149,14 +149,14 @@ void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p // This function copies the value of *p into a new location *p2 and then // taints **p2. Thus, **p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_011(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_011(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2 and *p -> *p2 char** p2 = strdup_ptr_011(p); // source -> **p2 source_ref_ref(p2); } -void test_modify_copy_via_strdup_011(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_011(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_011(p); sink(**p); // $ ir MISSING: ast } @@ -171,7 +171,7 @@ void source_ref_2(char** toTaint) { // $ ast-def=toTaint ir-def=*toTaint ir-def= // This function copies the value of p into a new location p2 and then // taints *p2. Thus, *p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2, *p -> *p2, and p -> p2 char** p2 = strdup_ptr_111(p); // source -> *p2 @@ -180,7 +180,7 @@ void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p void sink(char*); -void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_111_taint_ind(p); sink(*p); // $ ir MISSING: ast } @@ -188,7 +188,7 @@ void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p // This function copies the value of p into a new location p2 and then // taints **p2. Thus, **p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2, *p -> *p2, and p -> p2 char** p2 = strdup_ptr_111(p); // source -> **p2 @@ -197,7 +197,7 @@ void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p void sink(char*); -void test_modify_copy_via_strdup_111_taint_ind_ind(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_111_taint_ind_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_111_taint_ind_ind(p); sink(**p); // $ ir MISSING: ast } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp index 645c41896c4..d0687994b45 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp @@ -37,7 +37,7 @@ void test_lambdas() }; d(t, u); - auto e = [](int &a, int &b, int &c) { // $ ast-def=a ast-def=b ast-def=c ir-def=*c + auto e = [](int &a, int &b, int &c) { // $ ast-def=a ast-def=b ast-def=c ir-def=*c ir-def=*a ir-def=*b sink(a); // $ ast,ir sink(b); c = source(); diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp index 1fda792dd26..3f8d77a7b2b 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp @@ -12,7 +12,7 @@ namespace withoutFields { } template - void assignWrapper(T &lhs, T rhs) { // $ ast-def=lhs ast-def=lhs + void assignWrapper(T &lhs, T rhs) { // $ ast-def=lhs ast-def=lhs ir-def=*lhs assign(lhs, rhs); } @@ -71,15 +71,15 @@ namespace withFields { int val; }; - void assign(Int &lhs, int rhs) { // $ ast-def=lhs + void assign(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs lhs.val = rhs; } - void assignWrapper(Int &lhs, int rhs) { // $ ast-def=lhs + void assignWrapper(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs assign(lhs, rhs); } - void notAssign(Int &lhs, int rhs) { // $ ast-def=lhs + void notAssign(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs lhs.val = rhs; // Field flow ignores that the field is subsequently overwritten, leading // to false flow here. @@ -90,14 +90,14 @@ namespace withFields { } } - void sourceToParam(Int &out) { // $ ast-def=out + void sourceToParam(Int &out) { // $ ast-def=out ir-def=*out out.val = source(); if (arbitrary) { out.val = 1; } } - void sourceToParamWrapper(Int &out) { // $ ast-def=out + void sourceToParamWrapper(Int &out) { // $ ast-def=out ir-def=*out if (arbitrary) { sourceToParam(out); } else { @@ -105,7 +105,7 @@ namespace withFields { } } - void notSource(Int &out) { // $ ast-def=out + void notSource(Int &out) { // $ ast-def=out ir-def=*out out.val = source(); // Field flow ignores that the field is subsequently overwritten, leading // to false flow here. diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp index 2298e644b05..fe415ebab77 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp @@ -3,12 +3,12 @@ void incr(unsigned char **ps) // $ ast-def=ps ir-def=*ps ir-def=**ps *ps += 1; } -void callincr(unsigned char *s) // $ ast-def=s +void callincr(unsigned char *s) // $ ast-def=s ir-def=*s { incr(&s); } -void test(unsigned char *s) // $ ast-def=s +void test(unsigned char *s) // $ ast-def=s ir-def=*s { callincr(s); // $ flow } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected index 2d33f47ba60..c9f90a60b6e 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected @@ -238,8 +238,6 @@ irFlow | test.cpp:382:48:382:54 | source1 | test.cpp:385:8:385:10 | tmp | | test.cpp:388:53:388:59 | source1 | test.cpp:392:8:392:10 | tmp | | test.cpp:388:53:388:59 | source1 | test.cpp:394:10:394:12 | tmp | -| test.cpp:399:7:399:9 | definition of tmp | test.cpp:401:8:401:10 | tmp | -| test.cpp:405:7:405:9 | definition of tmp | test.cpp:408:8:408:10 | tmp | | test.cpp:416:7:416:11 | definition of local | test.cpp:418:8:418:12 | local | | test.cpp:417:16:417:20 | intRefSource output argument | test.cpp:418:8:418:12 | local | | test.cpp:422:7:422:11 | definition of local | test.cpp:424:8:424:12 | local | @@ -266,6 +264,7 @@ irFlow | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:568:10:568:19 | * ... | | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:572:10:572:19 | * ... | | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:578:10:578:19 | * ... | +| test.cpp:583:11:583:16 | call to source | test.cpp:590:8:590:8 | x | | test.cpp:594:12:594:26 | *call to indirect_source | test.cpp:597:8:597:13 | * ... | | test.cpp:601:20:601:20 | intPointerSource output argument | test.cpp:603:8:603:9 | * ... | | test.cpp:607:20:607:20 | intPointerSource output argument | test.cpp:609:8:609:9 | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp index e29619a6800..b36c289aaf1 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -63,7 +63,7 @@ namespace std { template T&& move(T& t) noexcept; // simplified signature } -void identityOperations(int* source1) { // $ ast-def=source1 +void identityOperations(int* source1) { // $ ast-def=source1 ir-def=*source1 const int *x1 = std::move(source1); int* x2 = const_cast(x1); int* x3 = (x2); @@ -398,14 +398,14 @@ void flowThroughMemcpy_blockvar_with_local_flow(int source1, int b) { void cleanedByMemcpy_ssa(int clean1) { // currently modeled with BlockVar, not SSA int tmp; memcpy(&tmp, &clean1, sizeof tmp); - sink(tmp); // $ SPURIOUS: ast,ir + sink(tmp); // $ SPURIOUS: ast } void cleanedByMemcpy_blockvar(int clean1) { int tmp; int *capture = &tmp; memcpy(&tmp, &clean1, sizeof tmp); - sink(tmp); // $ SPURIOUS: ast,ir + sink(tmp); // $ SPURIOUS: ast } void intRefSource(int &ref_source); @@ -484,7 +484,7 @@ struct MyStruct { int* content; }; -void local_field_flow_def_by_ref_steps_with_local_flow(MyStruct * s) { // $ ast-def=s +void local_field_flow_def_by_ref_steps_with_local_flow(MyStruct * s) { // $ ast-def=s ir-def=*s writes_to_content(s->content); int* p_content = s->content; sink(*p_content); @@ -521,12 +521,12 @@ void uncertain_definition() { sink(stackArray[0]); // $ ast=519:19 ir SPURIOUS: ast=517:7 } -void set_through_const_pointer(int x, const int **e) // $ ast-def=e ir-def=**e ir-def=*e +void set_through_const_pointer(int x, const int **e) // $ ast-def=e ir-def=*e ir-def=**e { *e = &x; } -void test_set_through_const_pointer(int *e) // $ ast-def=e +void test_set_through_const_pointer(int *e) // $ ast-def=e ir-def=*e { set_through_const_pointer(source(), &e); sink(*e); // $ ir MISSING: ast @@ -579,7 +579,7 @@ namespace IndirectFlowThroughGlobals { } } -void write_to_param(int* x) { // $ ast-def=x +void write_to_param(int* x) { // $ ast-def=x ir-def=*x int s = source(); x = &s; } @@ -587,7 +587,7 @@ void write_to_param(int* x) { // $ ast-def=x void test_write_to_param() { int x = 0; write_to_param(&x); - sink(x); // $ SPURIOUS: ast + sink(x); // $ SPURIOUS: ast,ir } void test_indirect_flow_to_array() { @@ -609,7 +609,7 @@ void test_def_by_ref_followed_by_uncertain_write_pointer(int* p) { // $ ast-def= sink(*p); // $ ir MISSING: ast } -void test_flow_through_void_double_pointer(int *p) // $ ast-def=p +void test_flow_through_void_double_pointer(int *p) // $ ast-def=p ir-def=*p { intPointerSource(p); void* q = (void*)&p; @@ -695,11 +695,11 @@ void increment_buf(int** buf) { // $ ast-def=buf ir-def=*buf ir-def=**buf sink(buf); // $ SPURIOUS: ast } -void call_increment_buf(int** buf) { // $ ast-def=buf +void call_increment_buf(int** buf) { // $ ast-def=buf ir-def=*buf ir-def=**buf increment_buf(buf); } -void test_conflation_regression(int* source) { // $ ast-def=source +void test_conflation_regression(int* source) { // $ ast-def=source ir-def=*source int* buf = source; call_increment_buf(&buf); } @@ -709,13 +709,13 @@ void write_to_star_star_p(unsigned char **p) // $ ast-def=p ir-def=**p ir-def=*p **p = 0; } -void write_to_star_buf(unsigned char *buf) // $ ast-def=buf +void write_to_star_buf(unsigned char *buf) // $ ast-def=buf ir-def=*buf { unsigned char *c = buf; write_to_star_star_p(&c); } -void test_write_to_star_buf(unsigned char *source) // $ ast-def=source +void test_write_to_star_buf(unsigned char *source) // $ ast-def=source ir-def=*source { write_to_star_buf(source); sink(*source); // clean @@ -1041,7 +1041,7 @@ namespace test_gettext { void* memset(void*, int, size_t); -void memset_test(char* buf) { // $ ast-def=buf +void memset_test(char* buf) { // $ ast-def=buf ir-def=*buf memset(buf, source(), 10); sink(*buf); // $ ir MISSING: ast } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected index 770a70f2a1d..2fff7b5403c 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected @@ -52,13 +52,17 @@ edges | A.cpp:103:14:103:14 | *c [a] | A.cpp:120:12:120:13 | *c1 [a] | provenance | | | A.cpp:107:12:107:13 | *c1 [a] | A.cpp:107:12:107:16 | a | provenance | | | A.cpp:120:12:120:13 | *c1 [a] | A.cpp:120:12:120:16 | a | provenance | | +| A.cpp:124:14:124:14 | *b [c] | A.cpp:131:8:131:8 | f7 output argument [c] | provenance | | +| A.cpp:126:5:126:5 | set output argument [c] | A.cpp:124:14:124:14 | *b [c] | provenance | | | A.cpp:126:5:126:5 | set output argument [c] | A.cpp:131:8:131:8 | f7 output argument [c] | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:27:17:27:17 | c | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:126:5:126:5 | set output argument [c] | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:126:12:126:18 | new | provenance | | | A.cpp:131:8:131:8 | f7 output argument [c] | A.cpp:132:10:132:10 | *b [c] | provenance | | | A.cpp:132:10:132:10 | *b [c] | A.cpp:132:10:132:13 | c | provenance | | +| A.cpp:140:13:140:13 | *b [c] | A.cpp:151:18:151:18 | D output argument [c] | provenance | | | A.cpp:140:13:140:13 | b | A.cpp:143:7:143:31 | ... = ... | provenance | | +| A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:140:13:140:13 | *b [c] | provenance | | | A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:143:7:143:31 | *... = ... [c] | provenance | | | A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:151:18:151:18 | D output argument [c] | provenance | | | A.cpp:142:7:142:20 | ... = ... | A.cpp:142:7:142:7 | *b [post update] [c] | provenance | | @@ -70,12 +74,20 @@ edges | A.cpp:143:7:143:31 | ... = ... | A.cpp:143:7:143:10 | *this [post update] [b] | provenance | | | A.cpp:143:25:143:31 | new | A.cpp:143:7:143:31 | ... = ... | provenance | | | A.cpp:150:12:150:18 | new | A.cpp:151:18:151:18 | b | provenance | | +| A.cpp:151:12:151:24 | call to D [*b, c] | A.cpp:152:10:152:10 | *d [*b, c] | provenance | | | A.cpp:151:12:151:24 | call to D [*b, c] | A.cpp:153:10:153:10 | *d [*b, c] | provenance | | | A.cpp:151:12:151:24 | call to D [b] | A.cpp:152:10:152:10 | *d [b] | provenance | | | A.cpp:151:18:151:18 | D output argument [c] | A.cpp:154:10:154:10 | *b [c] | provenance | | | A.cpp:151:18:151:18 | b | A.cpp:140:13:140:13 | b | provenance | | | A.cpp:151:18:151:18 | b | A.cpp:151:12:151:24 | call to D [b] | provenance | | +| A.cpp:152:10:152:10 | *d [*b, c] | A.cpp:152:10:152:13 | *b [c] | provenance | | +| A.cpp:152:10:152:10 | *d [*b, c] | A.cpp:152:13:152:13 | *b [c] | provenance | | | A.cpp:152:10:152:10 | *d [b] | A.cpp:152:10:152:13 | b | provenance | | +| A.cpp:152:10:152:10 | *d [post update] [*b, c] | A.cpp:153:10:153:10 | *d [*b, c] | provenance | | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:152:10:152:13 | sink output argument [c] | provenance | | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:173:26:173:26 | *o [c] | provenance | | +| A.cpp:152:10:152:13 | sink output argument [c] | A.cpp:152:10:152:10 | *d [post update] [*b, c] | provenance | | +| A.cpp:152:13:152:13 | *b [c] | A.cpp:152:10:152:13 | *b [c] | provenance | | | A.cpp:153:10:153:10 | *d [*b, c] | A.cpp:153:13:153:13 | *b [c] | provenance | | | A.cpp:153:13:153:13 | *b [c] | A.cpp:153:10:153:16 | c | provenance | | | A.cpp:154:10:154:10 | *b [c] | A.cpp:154:10:154:13 | c | provenance | | @@ -98,6 +110,7 @@ edges | A.cpp:167:47:167:50 | *next [*next, head] | A.cpp:167:44:167:44 | *l [*next, head] | provenance | | | A.cpp:167:47:167:50 | *next [head] | A.cpp:169:12:169:12 | *l [head] | provenance | | | A.cpp:169:12:169:12 | *l [head] | A.cpp:169:12:169:18 | head | provenance | | +| A.cpp:173:26:173:26 | *o [c] | A.cpp:173:26:173:26 | *o [c] | provenance | | | A.cpp:181:15:181:21 | newHead | A.cpp:183:7:183:20 | ... = ... | provenance | | | A.cpp:181:32:181:35 | *next [*next, head] | A.cpp:184:7:184:23 | *... = ... [*next, head] | provenance | | | A.cpp:181:32:181:35 | *next [head] | A.cpp:184:7:184:23 | *... = ... [head] | provenance | | @@ -200,9 +213,13 @@ edges | E.cpp:30:23:30:26 | *data [post update] [*buffer] | E.cpp:30:21:30:21 | *p [post update] [data, *buffer] | provenance | | | E.cpp:32:10:32:10 | *b [*buffer] | E.cpp:32:13:32:18 | *buffer | provenance | | | E.cpp:33:18:33:19 | *& ... [data, *buffer] | E.cpp:19:27:19:27 | *p [data, *buffer] | provenance | | +| aliasing.cpp:8:23:8:23 | *s [m1] | aliasing.cpp:25:17:25:19 | pointerSetter output argument [m1] | provenance | | +| aliasing.cpp:9:3:9:3 | *s [post update] [m1] | aliasing.cpp:8:23:8:23 | *s [m1] | provenance | | | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | aliasing.cpp:25:17:25:19 | pointerSetter output argument [m1] | provenance | | | aliasing.cpp:9:3:9:22 | ... = ... | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | provenance | | | aliasing.cpp:9:11:9:20 | call to user_input | aliasing.cpp:9:3:9:22 | ... = ... | provenance | | +| aliasing.cpp:12:25:12:25 | *s [m1] | aliasing.cpp:26:19:26:20 | referenceSetter output argument [m1] | provenance | | +| aliasing.cpp:13:3:13:3 | *s [post update] [m1] | aliasing.cpp:12:25:12:25 | *s [m1] | provenance | | | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | aliasing.cpp:26:19:26:20 | referenceSetter output argument [m1] | provenance | | | aliasing.cpp:13:3:13:21 | ... = ... | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | provenance | | | aliasing.cpp:13:10:13:19 | call to user_input | aliasing.cpp:13:3:13:21 | ... = ... | provenance | | @@ -313,6 +330,7 @@ edges | arrays.cpp:50:10:50:17 | *indirect [*ptr, data] | arrays.cpp:50:20:50:22 | *ptr [data] | provenance | | | arrays.cpp:50:20:50:22 | *ptr [data] | arrays.cpp:50:8:50:25 | *access to array [data] | provenance | | | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:16 | ... = ... | provenance | | +| by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:11:39:11:39 | *s [a] | provenance | | | by_reference.cpp:12:5:12:16 | ... = ... | by_reference.cpp:12:5:12:5 | *s [post update] [a] | provenance | | | by_reference.cpp:15:26:15:30 | value | by_reference.cpp:16:5:16:19 | ... = ... | provenance | | | by_reference.cpp:16:5:16:19 | ... = ... | by_reference.cpp:16:5:16:8 | *this [post update] [a] | provenance | | @@ -356,12 +374,22 @@ edges | by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | provenance | | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:31:46:31:46 | *s [a] | provenance | | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:102:21:102:39 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:103:27:103:35 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:106:21:106:41 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:107:29:107:37 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:83:31:83:35 | *inner [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:102:21:102:39 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:103:27:103:35 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:106:21:106:41 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:107:29:107:37 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:25 | ... = ... | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | provenance | | | by_reference.cpp:84:14:84:23 | call to user_input | by_reference.cpp:84:3:84:25 | ... = ... | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:122:21:122:38 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:123:21:123:36 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:126:21:126:40 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:127:21:127:38 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:87:31:87:35 | *inner [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:122:21:122:38 | taint_inner_a_ref output argument [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:123:21:123:36 | taint_inner_a_ref output argument [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:126:21:126:40 | taint_inner_a_ref output argument [a] | provenance | | @@ -614,8 +642,10 @@ edges | qualifiers.cpp:9:21:9:25 | value | qualifiers.cpp:9:30:9:44 | ... = ... | provenance | | | qualifiers.cpp:9:30:9:44 | ... = ... | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | provenance | | | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:49:12:64 | ... = ... | provenance | | +| qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | qualifiers.cpp:12:27:12:31 | *inner [a] | provenance | | | qualifiers.cpp:12:49:12:64 | ... = ... | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | provenance | | | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:51:13:65 | ... = ... | provenance | | +| qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | qualifiers.cpp:13:29:13:33 | *inner [a] | provenance | | | qualifiers.cpp:13:51:13:65 | ... = ... | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | provenance | | | qualifiers.cpp:22:5:22:9 | getInner output argument [*inner, a] | qualifiers.cpp:23:10:23:14 | *outer [*inner, a] | provenance | | | qualifiers.cpp:22:5:22:38 | ... = ... | qualifiers.cpp:22:11:22:18 | *call to getInner [post update] [a] | provenance | | @@ -716,6 +746,7 @@ edges | simple.cpp:103:24:103:24 | x | simple.cpp:104:14:104:14 | x | provenance | | | simple.cpp:108:17:108:26 | call to user_input | simple.cpp:109:43:109:43 | x | provenance | | | simple.cpp:109:43:109:43 | x | simple.cpp:103:24:103:24 | x | provenance | | +| struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:14:24:14:25 | *ab [a] | provenance | | | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:15:8:15:9 | *ab [a] | provenance | | | struct_init.c:15:8:15:9 | *ab [a] | struct_init.c:15:12:15:12 | a | provenance | | | struct_init.c:20:13:20:14 | *definition of ab [a] | struct_init.c:22:8:22:9 | *ab [a] | provenance | | @@ -726,6 +757,8 @@ edges | struct_init.c:20:20:20:29 | call to user_input | struct_init.c:20:20:20:29 | call to user_input | provenance | | | struct_init.c:22:8:22:9 | *ab [a] | struct_init.c:22:11:22:11 | a | provenance | | | struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:14:24:14:25 | *ab [a] | provenance | | +| struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:24:10:24:12 | absink output argument [a] | provenance | | +| struct_init.c:24:10:24:12 | absink output argument [a] | struct_init.c:28:5:28:7 | *& ... [a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | struct_init.c:31:8:31:12 | *outer [nestedAB, a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | struct_init.c:36:11:36:15 | *outer [nestedAB, a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [post update] [*pointerAB, a] | struct_init.c:33:8:33:12 | *outer [*pointerAB, a] | provenance | | @@ -805,12 +838,14 @@ nodes | A.cpp:107:12:107:16 | a | semmle.label | a | | A.cpp:120:12:120:13 | *c1 [a] | semmle.label | *c1 [a] | | A.cpp:120:12:120:16 | a | semmle.label | a | +| A.cpp:124:14:124:14 | *b [c] | semmle.label | *b [c] | | A.cpp:126:5:126:5 | set output argument [c] | semmle.label | set output argument [c] | | A.cpp:126:12:126:18 | new | semmle.label | new | | A.cpp:126:12:126:18 | new | semmle.label | new | | A.cpp:131:8:131:8 | f7 output argument [c] | semmle.label | f7 output argument [c] | | A.cpp:132:10:132:10 | *b [c] | semmle.label | *b [c] | | A.cpp:132:10:132:13 | c | semmle.label | c | +| A.cpp:140:13:140:13 | *b [c] | semmle.label | *b [c] | | A.cpp:140:13:140:13 | b | semmle.label | b | | A.cpp:142:7:142:7 | *b [post update] [c] | semmle.label | *b [post update] [c] | | A.cpp:142:7:142:20 | ... = ... | semmle.label | ... = ... | @@ -827,8 +862,13 @@ nodes | A.cpp:151:12:151:24 | call to D [b] | semmle.label | call to D [b] | | A.cpp:151:18:151:18 | D output argument [c] | semmle.label | D output argument [c] | | A.cpp:151:18:151:18 | b | semmle.label | b | +| A.cpp:152:10:152:10 | *d [*b, c] | semmle.label | *d [*b, c] | | A.cpp:152:10:152:10 | *d [b] | semmle.label | *d [b] | +| A.cpp:152:10:152:10 | *d [post update] [*b, c] | semmle.label | *d [post update] [*b, c] | +| A.cpp:152:10:152:13 | *b [c] | semmle.label | *b [c] | | A.cpp:152:10:152:13 | b | semmle.label | b | +| A.cpp:152:10:152:13 | sink output argument [c] | semmle.label | sink output argument [c] | +| A.cpp:152:13:152:13 | *b [c] | semmle.label | *b [c] | | A.cpp:153:10:153:10 | *d [*b, c] | semmle.label | *d [*b, c] | | A.cpp:153:10:153:16 | c | semmle.label | c | | A.cpp:153:13:153:13 | *b [c] | semmle.label | *b [c] | @@ -851,6 +891,8 @@ nodes | A.cpp:167:47:167:50 | *next [head] | semmle.label | *next [head] | | A.cpp:169:12:169:12 | *l [head] | semmle.label | *l [head] | | A.cpp:169:12:169:18 | head | semmle.label | head | +| A.cpp:173:26:173:26 | *o [c] | semmle.label | *o [c] | +| A.cpp:173:26:173:26 | *o [c] | semmle.label | *o [c] | | A.cpp:181:15:181:21 | newHead | semmle.label | newHead | | A.cpp:181:32:181:35 | *next [*next, head] | semmle.label | *next [*next, head] | | A.cpp:181:32:181:35 | *next [head] | semmle.label | *next [head] | @@ -964,9 +1006,11 @@ nodes | E.cpp:32:10:32:10 | *b [*buffer] | semmle.label | *b [*buffer] | | E.cpp:32:13:32:18 | *buffer | semmle.label | *buffer | | E.cpp:33:18:33:19 | *& ... [data, *buffer] | semmle.label | *& ... [data, *buffer] | +| aliasing.cpp:8:23:8:23 | *s [m1] | semmle.label | *s [m1] | | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | semmle.label | *s [post update] [m1] | | aliasing.cpp:9:3:9:22 | ... = ... | semmle.label | ... = ... | | aliasing.cpp:9:11:9:20 | call to user_input | semmle.label | call to user_input | +| aliasing.cpp:12:25:12:25 | *s [m1] | semmle.label | *s [m1] | | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | semmle.label | *s [post update] [m1] | | aliasing.cpp:13:3:13:21 | ... = ... | semmle.label | ... = ... | | aliasing.cpp:13:10:13:19 | call to user_input | semmle.label | call to user_input | @@ -1084,6 +1128,7 @@ nodes | arrays.cpp:50:10:50:17 | *indirect [*ptr, data] | semmle.label | *indirect [*ptr, data] | | arrays.cpp:50:20:50:22 | *ptr [data] | semmle.label | *ptr [data] | | arrays.cpp:50:27:50:30 | data | semmle.label | data | +| by_reference.cpp:11:39:11:39 | *s [a] | semmle.label | *s [a] | | by_reference.cpp:11:48:11:52 | value | semmle.label | value | | by_reference.cpp:12:5:12:5 | *s [post update] [a] | semmle.label | *s [post update] [a] | | by_reference.cpp:12:5:12:16 | ... = ... | semmle.label | ... = ... | @@ -1128,9 +1173,11 @@ nodes | by_reference.cpp:68:21:68:30 | call to user_input | semmle.label | call to user_input | | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | semmle.label | call to nonMemberGetA | | by_reference.cpp:69:22:69:23 | *& ... [a] | semmle.label | *& ... [a] | +| by_reference.cpp:83:31:83:35 | *inner [a] | semmle.label | *inner [a] | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | by_reference.cpp:84:3:84:25 | ... = ... | semmle.label | ... = ... | | by_reference.cpp:84:14:84:23 | call to user_input | semmle.label | call to user_input | +| by_reference.cpp:87:31:87:35 | *inner [a] | semmle.label | *inner [a] | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | by_reference.cpp:88:3:88:24 | ... = ... | semmle.label | ... = ... | | by_reference.cpp:88:13:88:22 | call to user_input | semmle.label | call to user_input | @@ -1393,9 +1440,11 @@ nodes | qualifiers.cpp:9:21:9:25 | value | semmle.label | value | | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | semmle.label | *this [post update] [a] | | qualifiers.cpp:9:30:9:44 | ... = ... | semmle.label | ... = ... | +| qualifiers.cpp:12:27:12:31 | *inner [a] | semmle.label | *inner [a] | | qualifiers.cpp:12:40:12:44 | value | semmle.label | value | | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | qualifiers.cpp:12:49:12:64 | ... = ... | semmle.label | ... = ... | +| qualifiers.cpp:13:29:13:33 | *inner [a] | semmle.label | *inner [a] | | qualifiers.cpp:13:42:13:46 | value | semmle.label | value | | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | qualifiers.cpp:13:51:13:65 | ... = ... | semmle.label | ... = ... | @@ -1507,6 +1556,7 @@ nodes | simple.cpp:108:17:108:26 | call to user_input | semmle.label | call to user_input | | simple.cpp:109:43:109:43 | x | semmle.label | x | | struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] | +| struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:15:8:15:9 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:15:12:15:12 | a | semmle.label | a | | struct_init.c:20:13:20:14 | *definition of ab [a] | semmle.label | *definition of ab [a] | @@ -1516,6 +1566,7 @@ nodes | struct_init.c:22:8:22:9 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:22:11:22:11 | a | semmle.label | a | | struct_init.c:24:10:24:12 | *& ... [a] | semmle.label | *& ... [a] | +| struct_init.c:24:10:24:12 | absink output argument [a] | semmle.label | absink output argument [a] | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | semmle.label | *definition of outer [nestedAB, a] | | struct_init.c:26:16:26:20 | *definition of outer [post update] [*pointerAB, a] | semmle.label | *definition of outer [post update] [*pointerAB, a] | | struct_init.c:26:16:26:20 | *definition of outer [post update] [nestedAB, a] | semmle.label | *definition of outer [post update] [nestedAB, a] | @@ -1552,6 +1603,7 @@ subpaths | A.cpp:90:15:90:15 | c | A.cpp:27:17:27:17 | c | A.cpp:27:22:27:25 | *this [post update] [c] | A.cpp:90:7:90:8 | set output argument [c] | | A.cpp:126:12:126:18 | new | A.cpp:27:17:27:17 | c | A.cpp:27:22:27:25 | *this [post update] [c] | A.cpp:126:5:126:5 | set output argument [c] | | A.cpp:151:18:151:18 | b | A.cpp:140:13:140:13 | b | A.cpp:143:7:143:10 | *this [post update] [b] | A.cpp:151:12:151:24 | call to D [b] | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:173:26:173:26 | *o [c] | A.cpp:173:26:173:26 | *o [c] | A.cpp:152:10:152:13 | sink output argument [c] | | A.cpp:160:29:160:29 | b | A.cpp:181:15:181:21 | newHead | A.cpp:183:7:183:10 | *this [post update] [head] | A.cpp:160:18:160:60 | call to MyList [head] | | A.cpp:161:38:161:39 | *l1 [head] | A.cpp:181:32:181:35 | *next [head] | A.cpp:184:7:184:10 | *this [post update] [*next, head] | A.cpp:161:18:161:40 | call to MyList [*next, head] | | A.cpp:162:38:162:39 | *l2 [*next, head] | A.cpp:181:32:181:35 | *next [*next, head] | A.cpp:184:7:184:10 | *this [post update] [*next, *next, head] | A.cpp:162:18:162:40 | call to MyList [*next, *next, head] | @@ -1564,6 +1616,7 @@ subpaths | D.cpp:37:21:37:21 | e | D.cpp:11:24:11:24 | e | D.cpp:11:29:11:32 | *this [post update] [elem] | D.cpp:37:8:37:10 | setElem output argument [elem] | | D.cpp:51:27:51:27 | e | D.cpp:11:24:11:24 | e | D.cpp:11:29:11:32 | *this [post update] [elem] | D.cpp:51:8:51:14 | setElem output argument [elem] | | by_reference.cpp:20:23:20:27 | value | by_reference.cpp:15:26:15:30 | value | by_reference.cpp:16:5:16:8 | *this [post update] [a] | by_reference.cpp:20:5:20:8 | setDirectly output argument [a] | +| by_reference.cpp:24:25:24:29 | value | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:11:39:11:39 | *s [a] | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | | by_reference.cpp:24:25:24:29 | value | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | | by_reference.cpp:40:12:40:15 | *this [a] | by_reference.cpp:35:9:35:19 | *this [a] | by_reference.cpp:35:9:35:19 | *getDirectly | by_reference.cpp:40:18:40:28 | call to getDirectly | | by_reference.cpp:44:26:44:29 | *this [a] | by_reference.cpp:31:46:31:46 | *s [a] | by_reference.cpp:31:16:31:28 | *nonMemberGetA | by_reference.cpp:44:12:44:24 | call to nonMemberGetA | @@ -1573,6 +1626,7 @@ subpaths | by_reference.cpp:57:8:57:8 | *s [a] | by_reference.cpp:39:9:39:21 | *this [a] | by_reference.cpp:39:9:39:21 | *getIndirectly | by_reference.cpp:57:10:57:22 | call to getIndirectly | | by_reference.cpp:62:25:62:34 | call to user_input | by_reference.cpp:23:34:23:38 | value | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | by_reference.cpp:62:3:62:3 | setThroughNonMember output argument [a] | | by_reference.cpp:63:8:63:8 | *s [a] | by_reference.cpp:43:9:43:27 | *this [a] | by_reference.cpp:43:9:43:27 | *getThroughNonMember | by_reference.cpp:63:10:63:28 | call to getThroughNonMember | +| by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:11:39:11:39 | *s [a] | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | | by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:31:46:31:46 | *s [a] | by_reference.cpp:31:16:31:28 | *nonMemberGetA | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | | complex.cpp:42:16:42:16 | *f [a_] | complex.cpp:9:7:9:7 | *this [a_] | complex.cpp:9:7:9:7 | *a | complex.cpp:42:18:42:18 | call to a | @@ -1588,7 +1642,9 @@ subpaths | constructors.cpp:36:11:36:20 | call to user_input | constructors.cpp:23:13:23:13 | a | constructors.cpp:23:5:23:7 | *this [post update] [a_] | constructors.cpp:36:9:36:9 | call to Foo [a_] | | constructors.cpp:36:25:36:34 | call to user_input | constructors.cpp:23:20:23:20 | b | constructors.cpp:23:5:23:7 | *this [post update] [b_] | constructors.cpp:36:9:36:9 | call to Foo [b_] | | qualifiers.cpp:27:28:27:37 | call to user_input | qualifiers.cpp:9:21:9:25 | value | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | qualifiers.cpp:27:11:27:18 | setA output argument [a] | +| qualifiers.cpp:32:35:32:44 | call to user_input | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:27:12:31 | *inner [a] | qualifiers.cpp:32:23:32:30 | pointerSetA output argument [a] | | qualifiers.cpp:32:35:32:44 | call to user_input | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | qualifiers.cpp:32:23:32:30 | pointerSetA output argument [a] | +| qualifiers.cpp:37:38:37:47 | call to user_input | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:29:13:33 | *inner [a] | qualifiers.cpp:37:19:37:35 | referenceSetA output argument [a] | | qualifiers.cpp:37:38:37:47 | call to user_input | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | qualifiers.cpp:37:19:37:35 | referenceSetA output argument [a] | | simple.cpp:28:10:28:10 | *f [a_] | simple.cpp:18:9:18:9 | *this [a_] | simple.cpp:18:9:18:9 | *a | simple.cpp:28:12:28:12 | call to a | | simple.cpp:29:10:29:10 | *f [b_] | simple.cpp:19:9:19:9 | *this [b_] | simple.cpp:19:9:19:9 | *b | simple.cpp:29:12:29:12 | call to b | @@ -1597,6 +1653,7 @@ subpaths | simple.cpp:41:12:41:21 | call to user_input | simple.cpp:20:19:20:19 | a | simple.cpp:20:24:20:25 | *this [post update] [a_] | simple.cpp:41:5:41:5 | setA output argument [a_] | | simple.cpp:42:12:42:21 | call to user_input | simple.cpp:21:19:21:19 | b | simple.cpp:21:24:21:25 | *this [post update] [b_] | simple.cpp:42:5:42:5 | setB output argument [b_] | | simple.cpp:84:14:84:20 | *this [f2, f1] | simple.cpp:78:9:78:15 | *this [f2, f1] | simple.cpp:78:9:78:15 | *getf2f1 | simple.cpp:84:14:84:20 | call to getf2f1 | +| struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:24:10:24:12 | absink output argument [a] | #select | A.cpp:43:10:43:12 | *& ... | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | *& ... | *& ... flows from $@ | A.cpp:41:15:41:21 | new | new | | A.cpp:49:10:49:13 | c | A.cpp:47:12:47:18 | new | A.cpp:49:10:49:13 | c | c flows from $@ | A.cpp:47:12:47:18 | new | new | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected index cebf91d6f59..54fd7cd8883 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -6490,6 +6490,7 @@ WARNING: Module TaintTracking has been deprecated and may be removed in future ( | taint.cpp:607:10:607:16 | call to _strinc | taint.cpp:609:8:609:12 | dest1 | | | taint.cpp:607:18:607:23 | source | taint.cpp:607:10:607:16 | call to _strinc | TAINT | | taint.cpp:607:26:607:31 | locale | taint.cpp:607:10:607:16 | call to _strinc | TAINT | +| taint.cpp:607:26:607:31 | locale | taint.cpp:607:26:607:31 | ref arg locale | TAINT | | taint.cpp:607:26:607:31 | ref arg locale | taint.cpp:606:82:606:87 | locale | | | taint.cpp:607:26:607:31 | ref arg locale | taint.cpp:611:25:611:30 | locale | | | taint.cpp:608:7:608:11 | ref arg dest1 | taint.cpp:606:52:606:56 | dest1 | | @@ -6501,6 +6502,7 @@ WARNING: Module TaintTracking has been deprecated and may be removed in future ( | taint.cpp:611:10:611:16 | call to _strinc | taint.cpp:613:8:613:12 | dest2 | | | taint.cpp:611:18:611:22 | clean | taint.cpp:611:10:611:16 | call to _strinc | TAINT | | taint.cpp:611:25:611:30 | locale | taint.cpp:611:10:611:16 | call to _strinc | TAINT | +| taint.cpp:611:25:611:30 | locale | taint.cpp:611:25:611:30 | ref arg locale | TAINT | | taint.cpp:611:25:611:30 | ref arg locale | taint.cpp:606:82:606:87 | locale | | | taint.cpp:612:7:612:11 | ref arg dest2 | taint.cpp:606:65:606:69 | dest2 | | | taint.cpp:612:7:612:11 | ref arg dest2 | taint.cpp:613:8:613:12 | dest2 | | @@ -6657,6 +6659,23 @@ WARNING: Module TaintTracking has been deprecated and may be removed in future ( | taint.cpp:745:27:745:32 | buffer | taint.cpp:745:19:745:25 | call to realloc | TAINT | | taint.cpp:746:9:746:15 | * ... | taint.cpp:746:8:746:15 | * ... | TAINT | | taint.cpp:746:10:746:15 | buffer | taint.cpp:746:9:746:15 | * ... | TAINT | +| taint.cpp:751:31:751:34 | path | taint.cpp:751:31:751:34 | path | | +| taint.cpp:751:31:751:34 | path | taint.cpp:752:10:752:13 | path | | +| taint.cpp:751:31:751:34 | path | taint.cpp:753:10:753:13 | path | | +| taint.cpp:751:43:751:46 | data | taint.cpp:751:43:751:46 | data | | +| taint.cpp:751:43:751:46 | data | taint.cpp:753:22:753:25 | data | | +| taint.cpp:752:10:752:13 | ref arg path | taint.cpp:751:31:751:34 | path | | +| taint.cpp:752:10:752:13 | ref arg path | taint.cpp:753:10:753:13 | path | | +| taint.cpp:752:16:752:19 | %s | taint.cpp:752:10:752:13 | ref arg path | TAINT | +| taint.cpp:752:22:752:26 | abc | taint.cpp:752:10:752:13 | ref arg path | TAINT | +| taint.cpp:753:10:753:13 | ref arg path | taint.cpp:751:31:751:34 | path | | +| taint.cpp:753:16:753:19 | %s | taint.cpp:753:10:753:13 | ref arg path | TAINT | +| taint.cpp:753:22:753:25 | data | taint.cpp:753:10:753:13 | ref arg path | TAINT | +| taint.cpp:753:22:753:25 | ref arg data | taint.cpp:751:43:751:46 | data | | +| taint.cpp:757:7:757:10 | path | taint.cpp:758:21:758:24 | path | | +| taint.cpp:757:7:757:10 | path | taint.cpp:759:8:759:11 | path | | +| taint.cpp:758:21:758:24 | ref arg path | taint.cpp:759:8:759:11 | path | | +| taint.cpp:759:8:759:11 | path | taint.cpp:759:7:759:11 | * ... | | | vector.cpp:16:43:16:49 | source1 | vector.cpp:17:26:17:32 | source1 | | | vector.cpp:16:43:16:49 | source1 | vector.cpp:31:38:31:44 | source1 | | | vector.cpp:17:21:17:33 | call to vector | vector.cpp:19:14:19:14 | v | | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp index 8eeb80a0f83..555f39779bf 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp @@ -71,11 +71,11 @@ void test_pair() sink(i.second); // $ MISSING: ast,ir sink(i); // $ ast,ir sink(j.first); - sink(j.second); // $ SPURIOUS: ast,ir - sink(j); // $ SPURIOUS: ast,ir + sink(j.second); // $ SPURIOUS: ast + sink(j); // $ SPURIOUS: ast sink(k.first); - sink(k.second); // $ SPURIOUS: ast,ir - sink(k); // $ SPURIOUS: ast,ir + sink(k.second); // $ SPURIOUS: ast + sink(k); // $ SPURIOUS: ast sink(l.first); sink(l.second); // $ MISSING: ast,ir sink(l); // $ ast,ir @@ -196,10 +196,10 @@ void test_map() sink(m18); // $ ast,ir m15.swap(m16); m17.swap(m18); - sink(m15); // $ SPURIOUS: ast,ir + sink(m15); // $ SPURIOUS: ast sink(m16); // $ ast,ir sink(m17); // $ ast,ir - sink(m18); // $ SPURIOUS: ast,ir + sink(m18); // $ SPURIOUS: ast // merge std::map m19, m20, m21, m22; @@ -345,10 +345,10 @@ void test_unordered_map() sink(m18); // $ ast,ir m15.swap(m16); m17.swap(m18); - sink(m15); // $ SPURIOUS: ast,ir + sink(m15); // $ SPURIOUS: ast sink(m16); // $ ast,ir sink(m17); // $ ast,ir - sink(m18); // $ SPURIOUS: ast,ir + sink(m18); // $ SPURIOUS: ast // merge std::unordered_map m19, m20, m21, m22; diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp index c6c19d90089..7c906fb72d2 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp @@ -81,10 +81,10 @@ void test_set() sink(s15); // $ ast,ir s12.swap(s13); s14.swap(s15); - sink(s12); // $ SPURIOUS: ast,ir + sink(s12); // $ SPURIOUS: ast sink(s13); // $ ast,ir sink(s14); // $ ast,ir - sink(s15); // $ SPURIOUS: ast,ir + sink(s15); // $ SPURIOUS: ast // merge std::set s16, s17, s18, s19; @@ -193,10 +193,10 @@ void test_unordered_set() sink(s15); // $ ast,ir s12.swap(s13); s14.swap(s15); - sink(s12); // $ SPURIOUS: ast,ir + sink(s12); // $ SPURIOUS: ast sink(s13); // $ ast,ir sink(s14); // $ ast,ir - sink(s15); // $ SPURIOUS: ast,ir + sink(s15); // $ SPURIOUS: ast // merge std::unordered_set s16, s17, s18, s19; diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp index e2b99945724..dc92a0664be 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp @@ -203,7 +203,7 @@ void test_string_assign() { sink(s5); // $ ast,ir sink(s6.assign(s1)); - sink(s6); // $ SPURIOUS: ast,ir + sink(s6); // $ SPURIOUS: ast } void test_string_insert() { @@ -280,9 +280,9 @@ void test_string_swap() { s4.swap(s3); sink(s1); // $ ast,ir - sink(s2); // $ SPURIOUS: ast,ir + sink(s2); // $ SPURIOUS: ast sink(s3); // $ ast,ir - sink(s4); // $ SPURIOUS: ast,ir + sink(s4); // $ SPURIOUS: ast } void test_string_clear() { @@ -495,7 +495,7 @@ void test_string_iterator_methods() sink(h); // $ ast,ir sink(s6.assign(s5.cbegin(), s5.cend())); - sink(s6); // $ SPURIOUS: ast,ir + sink(s6); // $ SPURIOUS: ast } } diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp index a84b3606f92..ca17fb4b3e7 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp @@ -50,7 +50,7 @@ void test_stringstream_string(int amount) ss7.str(source()); ss7.str("abc"); // (overwrites) sink(ss6); // $ ast,ir - sink(ss7); // $ SPURIOUS: ast,ir + sink(ss7); // $ SPURIOUS: ast sink(ss8.put('a')); sink(ss9.put(ns_char::source())); // $ ast,ir @@ -118,9 +118,9 @@ void test_stringstream_swap() ss4.swap(ss3); sink(ss1); // $ ast,ir - sink(ss2); // $ SPURIOUS: ast,ir + sink(ss2); // $ SPURIOUS: ast sink(ss3); // $ ast,ir - sink(ss4); // $ SPURIOUS: ast,ir + sink(ss4); // $ SPURIOUS: ast } void test_stringstream_in() @@ -217,7 +217,7 @@ void test_getline() sink(ss1.getline(b3, 1000)); sink(b1); sink(b2); // $ ast,ir - sink(b3); // $ SPURIOUS: ast,ir + sink(b3); // $ SPURIOUS: ast sink(ss1.getline(b4, 1000, ' ')); sink(ss2.getline(b5, 1000, ' ')); // $ ast,ir @@ -225,7 +225,7 @@ void test_getline() sink(ss1.getline(b6, 1000, ' ')); sink(b4); sink(b5); // $ ast,ir - sink(b6); // $ SPURIOUS: ast,ir + sink(b6); // $ SPURIOUS: ast sink(ss2.getline(b7, 1000).getline(b8, 1000)); // $ ast,ir sink(b7); // $ ast,ir @@ -237,7 +237,7 @@ void test_getline() sink(getline(ss1, s3)); sink(s1); sink(s2); // $ ast,ir - sink(s3); // $ SPURIOUS: ast,ir + sink(s3); // $ SPURIOUS: ast sink(getline(ss1, s4, ' ')); sink(getline(ss2, s5, ' ')); // $ ast,ir @@ -245,7 +245,7 @@ void test_getline() sink(getline(ss1, s6, ' ')); sink(s4); sink(s5); // $ ast,ir - sink(s6); // $ SPURIOUS: ast,ir + sink(s6); // $ SPURIOUS: ast sink(getline(getline(ss2, s7), s8)); // $ ast,ir sink(s7); // $ ast,ir diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp index eeefa6dd427..0ba45b6f30a 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp @@ -212,7 +212,7 @@ void test_swap() { std::swap(x, y); - sink(x); // $ SPURIOUS: ast,ir + sink(x); // $ SPURIOUS: ast sink(y); // $ ast,ir } @@ -744,4 +744,17 @@ void test_realloc_2_indirections(int **buffer) { **buffer = source(); buffer = (int**)realloc(buffer, 16); sink(**buffer); // $ ir MISSING: ast +} + +int sprintf(char *, const char *, ...); + +void call_sprintf_twice(char* path, char* data) { + sprintf(path, "%s", "abc"); + sprintf(path, "%s", data); +} + +void test_call_sprintf() { + char path[10]; + call_sprintf_twice(path, indirect_source()); + sink(*path); // $ ast,ir } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp index a26ac8f0513..2728be23e2e 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp @@ -114,10 +114,10 @@ void test_vector_swap() { v1.swap(v2); v3.swap(v4); - sink(v1); // $ SPURIOUS: ast,ir + sink(v1); // $ SPURIOUS: ast sink(v2); // $ ast,ir sink(v3); // $ ast,ir - sink(v4); // $ SPURIOUS: ast,ir + sink(v4); // $ SPURIOUS: ast } void test_vector_clear() { @@ -138,7 +138,7 @@ void test_vector_clear() { sink(v1); // $ SPURIOUS: ast,ir sink(v2); // $ ast,ir - sink(v3); // $ ast,ir + sink(v3); // $ SPURIOUS: ast sink(v4); } diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index a7cd4689ff9..24501a4bcae 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -4316,8 +4316,6 @@ ir.cpp: # 365| ValueCategory = prvalue # 361| getStmt(2): [LabelStmt] label ...: # 367| getStmt(1): [ReturnStmt] return ... -# 369| [TopLevelFunction] void VoidFunc() -# 369| : # 370| [TopLevelFunction] int Add(int, int) # 370| : # 370| getParameter(0): [Parameter] x @@ -5553,6 +5551,8 @@ ir.cpp: # 605| Type = [RValueReferenceType] String && # 607| [ConstMemberFunction] char const* String::c_str() const # 607| : +# 608| [MemberFunction] char String::pop_back() +# 608| : # 613| [TopLevelFunction] String ReturnObject() # 613| : # 615| [TopLevelFunction] void DeclareObject() @@ -9386,6 +9386,10 @@ ir.cpp: # 1059| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const vector & +# 1059| [CopyAssignmentOperator] vector& vector::operator=(vector const&) +# 1059| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const vector & # 1059| [CopyAssignmentOperator] vector& vector::operator=(vector const&) # 1059| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) @@ -9394,6 +9398,10 @@ ir.cpp: # 1059| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const vector & +# 1059| [CopyConstructor] void vector::vector(vector const&) +# 1059| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const vector & # 1059| [CopyConstructor] void vector::vector(vector const&) # 1059| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) @@ -9406,6 +9414,14 @@ ir.cpp: # 1060| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] iterator && +# 1060| [CopyAssignmentOperator] vector::iterator& vector::iterator::operator=(vector::iterator const public&) +# 1060| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const iterator & +# 1060| [MoveAssignmentOperator] vector::iterator& vector::iterator::operator=(vector::iterator&&) +# 1060| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] iterator && # 1060| [CopyAssignmentOperator] vector::iterator& vector::iterator::operator=(vector::iterator const public&) # 1060| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) @@ -9416,12 +9432,16 @@ ir.cpp: #-----| Type = [RValueReferenceType] iterator && # 1062| [MemberFunction] vector::iterator& vector::iterator::operator++() # 1062| : +# 1062| [MemberFunction] vector::iterator& vector::iterator::operator++() +# 1062| : # 1062| [MemberFunction] vector::iterator& vector::iterator::operator++() # 1062| : # 1062| [MemberFunction] vector::iterator& vector::iterator::operator++() # 1062| : # 1063| [ConstMemberFunction] ClassWithDestructor& vector::iterator::operator*() const # 1063| : +# 1063| [ConstMemberFunction] String& vector::iterator::operator*() const +# 1063| : # 1063| [ConstMemberFunction] T& vector::iterator::operator*() const # 1063| : # 1063| [ConstMemberFunction] int& vector::iterator::operator*() const @@ -9430,6 +9450,10 @@ ir.cpp: # 1065| : # 1065| getParameter(0): [Parameter] right # 1065| Type = [NestedStruct] iterator +# 1065| [ConstMemberFunction] bool vector::iterator::operator!=(vector::iterator) const +# 1065| : +# 1065| getParameter(0): [Parameter] right +# 1065| Type = [NestedStruct] iterator # 1065| [ConstMemberFunction] bool vector::iterator::operator!=(vector::iterator) const # 1065| : # 1065| getParameter(0): [Parameter] right @@ -9442,6 +9466,10 @@ ir.cpp: # 1068| : # 1068| getParameter(0): [Parameter] (unnamed parameter 0) # 1068| Type = [Class] ClassWithDestructor +# 1068| [Constructor] void vector::vector(String) +# 1068| : +# 1068| getParameter(0): [Parameter] (unnamed parameter 0) +# 1068| Type = [Struct] String # 1068| [Constructor] void vector::vector(T) # 1068| : # 1068| getParameter(0): [Parameter] (unnamed parameter 0) @@ -9450,16 +9478,24 @@ ir.cpp: # 1068| : # 1068| getParameter(0): [Parameter] (unnamed parameter 0) # 1068| Type = [IntType] int +# 1069| [Destructor] void vector::~vector() +# 1069| : # 1069| [Destructor] void vector::~vector() # 1069| : +# 1069| [Destructor] void vector::~vector() +# 1069| : # 1070| [ConstMemberFunction] vector::iterator vector::begin() const # 1070| : +# 1070| [ConstMemberFunction] vector::iterator vector::begin() const +# 1070| : # 1070| [ConstMemberFunction] vector::iterator vector::begin() const # 1070| : # 1070| [ConstMemberFunction] vector::iterator vector::begin() const # 1070| : # 1071| [ConstMemberFunction] vector::iterator vector::end() const # 1071| : +# 1071| [ConstMemberFunction] vector::iterator vector::end() const +# 1071| : # 1071| [ConstMemberFunction] vector::iterator vector::end() const # 1071| : # 1071| [ConstMemberFunction] vector::iterator vector::end() const @@ -10404,24 +10440,6 @@ ir.cpp: # 1245| Type = [PointerType] const char * # 1245| ValueCategory = prvalue(load) # 1246| getStmt(3): [ReturnStmt] return ... -# 1246| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 1246| Type = [VoidType] void -# 1246| ValueCategory = prvalue -# 1246| getQualifier(): [VariableAccess] c -# 1246| Type = [Struct] String -# 1246| ValueCategory = lvalue -# 1246| getImplicitDestructorCall(1): [DestructorCall] call to ~String -# 1246| Type = [VoidType] void -# 1246| ValueCategory = prvalue -# 1246| getQualifier(): [VariableAccess] b -# 1246| Type = [Struct] String -# 1246| ValueCategory = lvalue -# 1246| getImplicitDestructorCall(2): [DestructorCall] call to ~String -# 1246| Type = [VoidType] void -# 1246| ValueCategory = prvalue -# 1246| getQualifier(): [VariableAccess] a -# 1246| Type = [Struct] String -# 1246| ValueCategory = lvalue # 1250| [TopLevelFunction] char* strcpy(char*, char const*) # 1250| : # 1250| getParameter(0): [Parameter] destination @@ -16640,6 +16658,18 @@ ir.cpp: # 2155| Type = [PlainCharType] char # 2155| Value = [CharLiteral] 97 # 2155| ValueCategory = prvalue +# 2154| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2154| Type = [VoidType] void +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] y +# 2154| Type = [Class] ClassWithDestructor +# 2154| ValueCategory = lvalue +# 2154| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2154| Type = [VoidType] void +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] ys +# 2154| Type = [ClassTemplateInstantiation,Struct] vector +# 2154| ValueCategory = lvalue # 2154| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2154| Type = [NestedStruct] iterator # 2154| ValueCategory = lvalue @@ -16772,12 +16802,36 @@ ir.cpp: # 2159| Value = [CStyleCast] 98 # 2159| ValueCategory = prvalue # 2160| getThen(): [ReturnStmt] return ... -# 2167| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor -# 2167| Type = [VoidType] void -# 2167| ValueCategory = prvalue -# 2167| getQualifier(): [VariableAccess] x -# 2167| Type = [Class] ClassWithDestructor -# 2167| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] y +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(1): [DestructorCall] call to ~vector +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| ValueCategory = lvalue +# 2172| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor +# 2172| Type = [VoidType] void +# 2172| ValueCategory = prvalue +# 2172| getQualifier(): [VariableAccess] x +# 2172| Type = [Class] ClassWithDestructor +# 2172| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] y +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| ValueCategory = lvalue # 2157| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2157| Type = [NestedStruct] iterator # 2157| ValueCategory = lvalue @@ -16885,22 +16939,1162 @@ ir.cpp: # 2164| Value = [Literal] 1 # 2164| ValueCategory = prvalue # 2165| getThen(): [ReturnStmt] return ... -# 2167| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor -# 2167| Type = [VoidType] void -# 2167| ValueCategory = prvalue -# 2167| getQualifier(): [VariableAccess] x -# 2167| Type = [Class] ClassWithDestructor -# 2167| ValueCategory = lvalue +# 2163| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2163| Type = [VoidType] void +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| ValueCategory = lvalue +# 2172| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor +# 2172| Type = [VoidType] void +# 2172| ValueCategory = prvalue +# 2172| getQualifier(): [VariableAccess] x +# 2172| Type = [Class] ClassWithDestructor +# 2172| ValueCategory = lvalue +# 2163| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2163| Type = [VoidType] void +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| ValueCategory = lvalue # 2163| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2163| Type = [NestedStruct] iterator # 2163| ValueCategory = lvalue -# 2167| getStmt(8): [ReturnStmt] return ... -# 2167| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor -# 2167| Type = [VoidType] void -# 2167| ValueCategory = prvalue -# 2167| getQualifier(): [VariableAccess] x -# 2167| Type = [Class] ClassWithDestructor -# 2167| ValueCategory = lvalue +# 2168| getStmt(8): [RangeBasedForStmt] for(...:...) ... +# 2168| getInitialization(): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys +# 2168| Type = [ClassTemplateInstantiation,Struct] vector +# 2168| getVariable().getInitializer(): [Initializer] initializer for ys +# 2168| getExpr(): [ConstructorCall] call to vector +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getArgument(0): [VariableAccess] x +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = prvalue(load) +# 2168| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = lvalue +# 2168| getChild(1): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 2168| Type = [LValueReferenceType] vector & +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 2168| getExpr(): [VariableAccess] ys +# 2168| Type = [ClassTemplateInstantiation,Struct] vector +# 2168| ValueCategory = lvalue +# 2168| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2168| Type = [LValueReferenceType] vector & +# 2168| ValueCategory = prvalue +# 2168| getBeginEndDeclaration(): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 2168| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 2168| getExpr(): [FunctionCall] call to begin +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__range) +# 2168| Type = [LValueReferenceType] vector & +# 2168| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2168| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 2168| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 2168| getExpr(): [FunctionCall] call to end +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__range) +# 2168| Type = [LValueReferenceType] vector & +# 2168| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2168| getCondition(): [FunctionCall] call to operator!= +# 2168| Type = [BoolType] bool +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__begin) +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = lvalue +# 2168| getArgument(0): [VariableAccess] (__end) +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2168| getUpdate(): [FunctionCall] call to operator++ +# 2168| Type = [LValueReferenceType] iterator & +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__begin) +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = lvalue +# 2168| getChild(5): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2168| Type = [Class] ClassWithDestructor +# 2168| getVariable().getInitializer(): [Initializer] initializer for y +# 2168| getExpr(): [OverloadedPointerDereferenceExpr] call to operator* +# 2168| Type = [LValueReferenceType] ClassWithDestructor & +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__begin) +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2168| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = prvalue(load) +# 2168| getStmt(): [BlockStmt] { ... } +# 2169| getStmt(0): [DeclStmt] declaration +# 2169| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z1 +# 2169| Type = [Class] ClassWithDestructor +# 2169| getVariable().getInitializer(): [Initializer] initializer for z1 +# 2169| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2169| Type = [VoidType] void +# 2169| ValueCategory = prvalue +# 2170| getStmt(1): [DeclStmt] declaration +# 2170| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z2 +# 2170| Type = [Class] ClassWithDestructor +# 2170| getVariable().getInitializer(): [Initializer] initializer for z2 +# 2170| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2170| Type = [VoidType] void +# 2170| ValueCategory = prvalue +# 2171| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2171| Type = [VoidType] void +# 2171| ValueCategory = prvalue +# 2171| getQualifier(): [VariableAccess] z2 +# 2171| Type = [Class] ClassWithDestructor +# 2171| ValueCategory = lvalue +# 2171| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor +# 2171| Type = [VoidType] void +# 2171| ValueCategory = prvalue +# 2171| getQualifier(): [VariableAccess] z1 +# 2171| Type = [Class] ClassWithDestructor +# 2171| ValueCategory = lvalue +# 2168| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] y +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = lvalue +# 2168| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] ys +# 2168| Type = [ClassTemplateInstantiation,Struct] vector +# 2168| ValueCategory = lvalue +# 2168| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = lvalue +# 2172| getStmt(9): [ReturnStmt] return ... +# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2172| Type = [VoidType] void +# 2172| ValueCategory = prvalue +# 2172| getQualifier(): [VariableAccess] x +# 2172| Type = [Class] ClassWithDestructor +# 2172| ValueCategory = lvalue +# 2174| [TopLevelFunction] void static_variable_with_destructor_1() +# 2174| : +# 2174| getEntryPoint(): [BlockStmt] { ... } +# 2175| getStmt(0): [DeclStmt] declaration +# 2175| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a +# 2175| Type = [Class] ClassWithDestructor +# 2175| getVariable().getInitializer(): [Initializer] initializer for a +# 2175| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2175| Type = [VoidType] void +# 2175| ValueCategory = prvalue +# 2176| getStmt(1): [DeclStmt] declaration +# 2176| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b +# 2176| Type = [Class] ClassWithDestructor +#-----| getVariable().getInitializer(): [Initializer] initializer for b +#-----| getExpr(): [ConstructorCall] call to ClassWithDestructor +#-----| Type = [VoidType] void +#-----| ValueCategory = prvalue +# 2177| getStmt(2): [ReturnStmt] return ... +# 2177| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2177| Type = [VoidType] void +# 2177| ValueCategory = prvalue +# 2177| getQualifier(): [VariableAccess] a +# 2177| Type = [Class] ClassWithDestructor +# 2177| ValueCategory = lvalue +# 2179| [TopLevelFunction] void static_variable_with_destructor_2() +# 2179| : +# 2179| getEntryPoint(): [BlockStmt] { ... } +# 2180| getStmt(0): [DeclStmt] declaration +# 2180| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a +# 2180| Type = [Class] ClassWithDestructor +#-----| getVariable().getInitializer(): [Initializer] initializer for a +#-----| getExpr(): [ConstructorCall] call to ClassWithDestructor +#-----| Type = [VoidType] void +#-----| ValueCategory = prvalue +# 2181| getStmt(1): [DeclStmt] declaration +# 2181| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b +# 2181| Type = [Class] ClassWithDestructor +# 2181| getVariable().getInitializer(): [Initializer] initializer for b +# 2181| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2181| Type = [VoidType] void +# 2181| ValueCategory = prvalue +# 2182| getStmt(2): [ReturnStmt] return ... +# 2182| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2182| Type = [VoidType] void +# 2182| ValueCategory = prvalue +# 2182| getQualifier(): [VariableAccess] b +# 2182| Type = [Class] ClassWithDestructor +# 2182| ValueCategory = lvalue +# 2184| [TopLevelFunction] void static_variable_with_destructor_3() +# 2184| : +# 2184| getEntryPoint(): [BlockStmt] { ... } +# 2185| getStmt(0): [DeclStmt] declaration +# 2185| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a +# 2185| Type = [Class] ClassWithDestructor +# 2185| getVariable().getInitializer(): [Initializer] initializer for a +# 2185| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2185| Type = [VoidType] void +# 2185| ValueCategory = prvalue +# 2186| getStmt(1): [DeclStmt] declaration +# 2186| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b +# 2186| Type = [Class] ClassWithDestructor +# 2186| getVariable().getInitializer(): [Initializer] initializer for b +# 2186| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2186| Type = [VoidType] void +# 2186| ValueCategory = prvalue +# 2187| getStmt(2): [DeclStmt] declaration +# 2187| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 2187| Type = [Class] ClassWithDestructor +#-----| getVariable().getInitializer(): [Initializer] initializer for c +#-----| getExpr(): [ConstructorCall] call to ClassWithDestructor +#-----| Type = [VoidType] void +#-----| ValueCategory = prvalue +# 2188| getStmt(3): [ReturnStmt] return ... +# 2188| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2188| Type = [VoidType] void +# 2188| ValueCategory = prvalue +# 2188| getQualifier(): [VariableAccess] b +# 2188| Type = [Class] ClassWithDestructor +# 2188| ValueCategory = lvalue +# 2188| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor +# 2188| Type = [VoidType] void +# 2188| ValueCategory = prvalue +# 2188| getQualifier(): [VariableAccess] a +# 2188| Type = [Class] ClassWithDestructor +# 2188| ValueCategory = lvalue +# 2190| [GlobalVariable] ClassWithDestructor global_class_with_destructor +# 2190| getInitializer(): [Initializer] initializer for global_class_with_destructor +# 2190| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2190| Type = [VoidType] void +# 2190| ValueCategory = prvalue +# 2194| [FunctionTemplateInstantiation,TopLevelFunction] ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&) +# 2194| : +# 2194| getParameter(0): [Parameter] t +# 2194| Type = [LValueReferenceType] ClassWithDestructor & +# 2194| getEntryPoint(): [BlockStmt] { ... } +# 2194| getStmt(0): [ReturnStmt] return ... +# 2194| getExpr(): [VariableAccess] t +# 2194| Type = [LValueReferenceType] ClassWithDestructor & +# 2194| ValueCategory = prvalue(load) +# 2194| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2194| Type = [LValueReferenceType] ClassWithDestructor & +# 2194| ValueCategory = prvalue +# 2194| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2194| Type = [Class] ClassWithDestructor +# 2194| ValueCategory = lvalue +# 2194| [TemplateFunction,TopLevelFunction] T& vacuous_destructor_call::get(T&) +# 2194| : +# 2194| getParameter(0): [Parameter] t +# 2194| Type = [LValueReferenceType] T & +# 2194| getEntryPoint(): [BlockStmt] { ... } +# 2194| getStmt(0): [ReturnStmt] return ... +# 2194| getExpr(): [VariableAccess] t +# 2194| Type = [LValueReferenceType] T & +# 2194| ValueCategory = prvalue(load) +# 2194| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2194| Type = [TemplateParameter] T +# 2194| ValueCategory = lvalue +# 2194| [FunctionTemplateInstantiation,TopLevelFunction] int& vacuous_destructor_call::get(int&) +# 2194| : +# 2194| getParameter(0): [Parameter] t +# 2194| Type = [LValueReferenceType] int & +# 2194| getEntryPoint(): [BlockStmt] { ... } +# 2194| getStmt(0): [ReturnStmt] return ... +# 2194| getExpr(): [VariableAccess] t +# 2194| Type = [LValueReferenceType] int & +# 2194| ValueCategory = prvalue(load) +# 2194| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2194| Type = [LValueReferenceType] int & +# 2194| ValueCategory = prvalue +# 2194| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2194| Type = [IntType] int +# 2194| ValueCategory = lvalue +# 2197| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(ClassWithDestructor&) +# 2197| : +# 2197| getParameter(0): [Parameter] t +# 2197| Type = [LValueReferenceType] ClassWithDestructor & +# 2197| getEntryPoint(): [BlockStmt] { ... } +# 2198| getStmt(0): [ExprStmt] ExprStmt +# 2198| getExpr(): [DestructorCall] call to ~ClassWithDestructor +# 2198| Type = [VoidType] void +# 2198| ValueCategory = prvalue +# 2198| getQualifier(): [FunctionCall] call to get +# 2198| Type = [LValueReferenceType] ClassWithDestructor & +# 2198| ValueCategory = prvalue +# 2198| getArgument(0): [VariableAccess] t +# 2198| Type = [LValueReferenceType] ClassWithDestructor & +# 2198| ValueCategory = prvalue(load) +# 2198| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2198| Type = [LValueReferenceType] ClassWithDestructor & +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [Class] ClassWithDestructor +# 2198| ValueCategory = lvalue +# 2198| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [Class] ClassWithDestructor +# 2198| ValueCategory = lvalue +# 2199| getStmt(1): [ReturnStmt] return ... +# 2197| [TemplateFunction,TopLevelFunction] void vacuous_destructor_call::call_destructor(T&) +# 2197| : +# 2197| getParameter(0): [Parameter] t +# 2197| Type = [LValueReferenceType] T & +# 2197| getEntryPoint(): [BlockStmt] { ... } +# 2198| getStmt(0): [ExprStmt] ExprStmt +# 2198| getExpr(): [ExprCall] call to expression +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [Literal] Unknown literal +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getChild(-1): [ExprCall] call to expression +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [Literal] Unknown literal +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getArgument(0): [VariableAccess] t +# 2198| Type = [LValueReferenceType] T & +# 2198| ValueCategory = prvalue(load) +# 2198| getArgument(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [TemplateParameter] T +# 2198| ValueCategory = lvalue +# 2199| getStmt(1): [ReturnStmt] return ... +# 2197| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(int&) +# 2197| : +# 2197| getParameter(0): [Parameter] t +# 2197| Type = [LValueReferenceType] int & +# 2197| getEntryPoint(): [BlockStmt] { ... } +# 2198| getStmt(0): [ExprStmt] ExprStmt +# 2198| getExpr(): [VacuousDestructorCall] (vacuous destructor call) +# 2198| Type = [VoidType] void +# 2198| ValueCategory = prvalue +# 2198| getChild(0): [FunctionCall] call to get +# 2198| Type = [LValueReferenceType] int & +# 2198| ValueCategory = prvalue +# 2198| getArgument(0): [VariableAccess] t +# 2198| Type = [LValueReferenceType] int & +# 2198| ValueCategory = prvalue(load) +# 2198| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2198| Type = [LValueReferenceType] int & +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [IntType] int +# 2198| ValueCategory = lvalue +# 2198| getChild(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [IntType] int +# 2198| ValueCategory = lvalue +# 2199| getStmt(1): [ReturnStmt] return ... +# 2201| [TopLevelFunction] void vacuous_destructor_call::non_vacuous_destructor_call() +# 2201| : +# 2201| getEntryPoint(): [BlockStmt] { ... } +# 2202| getStmt(0): [DeclStmt] declaration +# 2202| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 2202| Type = [Class] ClassWithDestructor +# 2202| getVariable().getInitializer(): [Initializer] initializer for c +# 2202| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2202| Type = [VoidType] void +# 2202| ValueCategory = prvalue +# 2203| getStmt(1): [ExprStmt] ExprStmt +# 2203| getExpr(): [FunctionCall] call to call_destructor +# 2203| Type = [VoidType] void +# 2203| ValueCategory = prvalue +# 2203| getArgument(0): [VariableAccess] c +# 2203| Type = [Class] ClassWithDestructor +# 2203| ValueCategory = lvalue +# 2203| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2203| Type = [LValueReferenceType] ClassWithDestructor & +# 2203| ValueCategory = prvalue +# 2204| getStmt(2): [ReturnStmt] return ... +# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2204| Type = [VoidType] void +# 2204| ValueCategory = prvalue +# 2204| getQualifier(): [VariableAccess] c +# 2204| Type = [Class] ClassWithDestructor +# 2204| ValueCategory = lvalue +# 2206| [TopLevelFunction] void vacuous_destructor_call::vacuous_destructor_call() +# 2206| : +# 2206| getEntryPoint(): [BlockStmt] { ... } +# 2207| getStmt(0): [DeclStmt] declaration +# 2207| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 2207| Type = [IntType] int +# 2208| getStmt(1): [ExprStmt] ExprStmt +# 2208| getExpr(): [FunctionCall] call to call_destructor +# 2208| Type = [VoidType] void +# 2208| ValueCategory = prvalue +# 2208| getArgument(0): [VariableAccess] i +# 2208| Type = [IntType] int +# 2208| ValueCategory = lvalue +# 2208| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2208| Type = [LValueReferenceType] int & +# 2208| ValueCategory = prvalue +# 2209| getStmt(2): [ReturnStmt] return ... +# 2212| [TopLevelFunction] void TryCatchDestructors(bool) +# 2212| : +# 2212| getParameter(0): [Parameter] b +# 2212| Type = [BoolType] bool +# 2212| getEntryPoint(): [BlockStmt] { ... } +# 2213| getStmt(0): [TryStmt] try { ... } +# 2213| getStmt(): [BlockStmt] { ... } +# 2214| getStmt(0): [DeclStmt] declaration +# 2214| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2214| Type = [Struct] String +# 2214| getVariable().getInitializer(): [Initializer] initializer for s +# 2214| getExpr(): [ConstructorCall] call to String +# 2214| Type = [VoidType] void +# 2214| ValueCategory = prvalue +# 2215| getStmt(1): [IfStmt] if (...) ... +# 2215| getCondition(): [VariableAccess] b +# 2215| Type = [BoolType] bool +# 2215| ValueCategory = prvalue(load) +# 2215| getThen(): [BlockStmt] { ... } +# 2216| getStmt(0): [ExprStmt] ExprStmt +# 2216| getExpr(): [ThrowExpr] throw ... +# 2216| Type = [PointerType] const char * +# 2216| ValueCategory = prvalue +# 2216| getExpr(): string literal +# 2216| Type = [ArrayType] const char[15] +# 2216| Value = [StringLiteral] "string literal" +# 2216| ValueCategory = lvalue +# 2219| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2219| Type = [VoidType] void +# 2219| ValueCategory = prvalue +# 2219| getQualifier(): [VariableAccess] s +# 2219| Type = [Struct] String +# 2219| ValueCategory = lvalue +# 2216| getExpr().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2216| Type = [PointerType] const char * +# 2216| ValueCategory = prvalue +# 2218| getStmt(2): [DeclStmt] declaration +# 2218| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2218| Type = [Struct] String +# 2218| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2218| getExpr(): [ConstructorCall] call to String +# 2218| Type = [VoidType] void +# 2218| ValueCategory = prvalue +# 2219| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2219| Type = [VoidType] void +# 2219| ValueCategory = prvalue +# 2219| getQualifier(): [VariableAccess] s2 +# 2219| Type = [Struct] String +# 2219| ValueCategory = lvalue +# 2219| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2219| Type = [VoidType] void +# 2219| ValueCategory = prvalue +# 2219| getQualifier(): [VariableAccess] s +# 2219| Type = [Struct] String +# 2219| ValueCategory = lvalue +# 2220| getChild(1): [Handler] +# 2220| getBlock(): [CatchBlock] { ... } +# 2221| getStmt(0): [ExprStmt] ExprStmt +# 2221| getExpr(): [ThrowExpr] throw ... +# 2221| Type = [Struct] String +# 2221| ValueCategory = prvalue +# 2221| getExpr(): [ConstructorCall] call to String +# 2221| Type = [VoidType] void +# 2221| ValueCategory = prvalue +# 2221| getArgument(0): [VariableAccess] s +# 2221| Type = [PointerType] const char * +# 2221| ValueCategory = prvalue(load) +# 2223| getChild(2): [Handler] +# 2223| getBlock(): [CatchBlock] { ... } +# 2225| getChild(3): [Handler] +# 2225| getBlock(): [CatchAnyBlock] { ... } +# 2226| getStmt(0): [ExprStmt] ExprStmt +# 2226| getExpr(): [ReThrowExpr] re-throw exception +# 2226| Type = [VoidType] void +# 2226| ValueCategory = prvalue +# 2228| getStmt(1): [ReturnStmt] return ... +# 2230| [TopLevelFunction] void IfDestructors(bool) +# 2230| : +# 2230| getParameter(0): [Parameter] b +# 2230| Type = [BoolType] bool +# 2230| getEntryPoint(): [BlockStmt] { ... } +# 2231| getStmt(0): [DeclStmt] declaration +# 2231| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1 +# 2231| Type = [Struct] String +# 2231| getVariable().getInitializer(): [Initializer] initializer for s1 +# 2231| getExpr(): [ConstructorCall] call to String +# 2231| Type = [VoidType] void +# 2231| ValueCategory = prvalue +# 2232| getStmt(1): [IfStmt] if (...) ... +# 2232| getCondition(): [VariableAccess] b +# 2232| Type = [BoolType] bool +# 2232| ValueCategory = prvalue(load) +# 2232| getThen(): [BlockStmt] { ... } +# 2233| getStmt(0): [DeclStmt] declaration +# 2233| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2233| Type = [Struct] String +# 2233| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2233| getExpr(): [ConstructorCall] call to String +# 2233| Type = [VoidType] void +# 2233| ValueCategory = prvalue +# 2234| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2234| Type = [VoidType] void +# 2234| ValueCategory = prvalue +# 2234| getQualifier(): [VariableAccess] s2 +# 2234| Type = [Struct] String +# 2234| ValueCategory = lvalue +# 2234| getElse(): [BlockStmt] { ... } +# 2235| getStmt(0): [DeclStmt] declaration +# 2235| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s3 +# 2235| Type = [Struct] String +# 2235| getVariable().getInitializer(): [Initializer] initializer for s3 +# 2235| getExpr(): [ConstructorCall] call to String +# 2235| Type = [VoidType] void +# 2235| ValueCategory = prvalue +# 2236| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2236| Type = [VoidType] void +# 2236| ValueCategory = prvalue +# 2236| getQualifier(): [VariableAccess] s3 +# 2236| Type = [Struct] String +# 2236| ValueCategory = lvalue +# 2237| getStmt(2): [DeclStmt] declaration +# 2237| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s4 +# 2237| Type = [Struct] String +# 2237| getVariable().getInitializer(): [Initializer] initializer for s4 +# 2237| getExpr(): [ConstructorCall] call to String +# 2237| Type = [VoidType] void +# 2237| ValueCategory = prvalue +# 2238| getStmt(3): [ReturnStmt] return ... +# 2238| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2238| Type = [VoidType] void +# 2238| ValueCategory = prvalue +# 2238| getQualifier(): [VariableAccess] s4 +# 2238| Type = [Struct] String +# 2238| ValueCategory = lvalue +# 2238| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2238| Type = [VoidType] void +# 2238| ValueCategory = prvalue +# 2238| getQualifier(): [VariableAccess] s1 +# 2238| Type = [Struct] String +# 2238| ValueCategory = lvalue +# 2240| [TopLevelFunction] void ForDestructors() +# 2240| : +# 2240| getEntryPoint(): [BlockStmt] { ... } +# 2241| getStmt(0): [DeclStmt] declaration +# 2241| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 2241| Type = [PlainCharType] char +# 2241| getVariable().getInitializer(): [Initializer] initializer for c +# 2241| getExpr(): [CharLiteral] 97 +# 2241| Type = [PlainCharType] char +# 2241| Value = [CharLiteral] 97 +# 2241| ValueCategory = prvalue +# 2242| getStmt(1): [ForStmt] for(...;...;...) ... +# 2242| getInitialization(): [DeclStmt] declaration +# 2242| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2242| Type = [Struct] String +# 2242| getVariable().getInitializer(): [Initializer] initializer for s +# 2242| getExpr(): [ConstructorCall] call to String +# 2242| Type = [VoidType] void +# 2242| ValueCategory = prvalue +# 2242| getArgument(0): hello +# 2242| Type = [ArrayType] const char[6] +# 2242| Value = [StringLiteral] "hello" +# 2242| ValueCategory = lvalue +# 2242| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2242| Type = [PointerType] const char * +# 2242| ValueCategory = prvalue +# 2242| getCondition(): [NEExpr] ... != ... +# 2242| Type = [BoolType] bool +# 2242| ValueCategory = prvalue +# 2242| getLeftOperand(): [VariableAccess] c +# 2242| Type = [PlainCharType] char +# 2242| ValueCategory = prvalue(load) +# 2242| getRightOperand(): [Literal] 0 +# 2242| Type = [IntType] int +# 2242| Value = [Literal] 0 +# 2242| ValueCategory = prvalue +# 2242| getLeftOperand().getFullyConverted(): [CStyleCast] (int)... +# 2242| Conversion = [IntegralConversion] integral conversion +# 2242| Type = [IntType] int +# 2242| ValueCategory = prvalue +# 2242| getUpdate(): [AssignExpr] ... = ... +# 2242| Type = [PlainCharType] char +# 2242| ValueCategory = lvalue +# 2242| getLValue(): [VariableAccess] c +# 2242| Type = [PlainCharType] char +# 2242| ValueCategory = lvalue +# 2242| getRValue(): [FunctionCall] call to pop_back +# 2242| Type = [PlainCharType] char +# 2242| ValueCategory = prvalue +# 2242| getQualifier(): [VariableAccess] s +# 2242| Type = [Struct] String +# 2242| ValueCategory = lvalue +# 2242| getStmt(): [BlockStmt] { ... } +# 2243| getStmt(0): [DeclStmt] declaration +# 2243| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2243| Type = [Struct] String +# 2243| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2243| getExpr(): [ConstructorCall] call to String +# 2243| Type = [VoidType] void +# 2243| ValueCategory = prvalue +# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2244| Type = [VoidType] void +# 2244| ValueCategory = prvalue +# 2244| getQualifier(): [VariableAccess] s2 +# 2244| Type = [Struct] String +# 2244| ValueCategory = lvalue +# 2242| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2242| Type = [VoidType] void +# 2242| ValueCategory = prvalue +# 2242| getQualifier(): [VariableAccess] s +# 2242| Type = [Struct] String +# 2242| ValueCategory = lvalue +# 2246| getStmt(2): [RangeBasedForStmt] for(...:...) ... +# 2246| getChild(1): [DeclStmt] declaration +# 2246| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 2246| Type = [RValueReferenceType] vector && +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 2246| getExpr(): [ConstructorCall] call to vector +# 2246| Type = [VoidType] void +# 2246| ValueCategory = prvalue +# 2246| getArgument(0): [ConstructorCall] call to String +# 2246| Type = [VoidType] void +# 2246| ValueCategory = prvalue +# 2246| getArgument(0): hello +# 2246| Type = [ArrayType] const char[6] +# 2246| Value = [StringLiteral] "hello" +# 2246| ValueCategory = lvalue +# 2246| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2246| Type = [PointerType] const char * +# 2246| ValueCategory = prvalue +# 2246| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 2246| Type = [Struct] String +# 2246| ValueCategory = lvalue +# 2246| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2246| Type = [LValueReferenceType] vector & +# 2246| ValueCategory = prvalue +# 2246| getExpr(): [TemporaryObjectExpr] temporary object +# 2246| Type = [ClassTemplateInstantiation,Struct] vector +# 2246| ValueCategory = xvalue +# 2246| getBeginEndDeclaration(): [DeclStmt] declaration +# 2246| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 2246| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 2246| getExpr(): [FunctionCall] call to begin +# 2246| Type = [NestedStruct] iterator +# 2246| ValueCategory = prvalue +# 2246| getQualifier(): [VariableAccess] (__range) +# 2246| Type = [RValueReferenceType] vector && +# 2246| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2246| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 2246| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 2246| getExpr(): [FunctionCall] call to end +# 2246| Type = [NestedStruct] iterator +# 2246| ValueCategory = prvalue +# 2246| getQualifier(): [VariableAccess] (__range) +# 2246| Type = [RValueReferenceType] vector && +# 2246| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2246| getCondition(): [FunctionCall] call to operator!= +# 2246| Type = [BoolType] bool +# 2246| ValueCategory = prvalue +# 2246| getQualifier(): [VariableAccess] (__begin) +# 2246| Type = [NestedStruct] iterator +# 2246| ValueCategory = lvalue +# 2246| getArgument(0): [VariableAccess] (__end) +# 2246| Type = [NestedStruct] iterator +# 2246| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2246| getUpdate(): [FunctionCall] call to operator++ +# 2246| Type = [LValueReferenceType] iterator & +# 2246| ValueCategory = prvalue +# 2246| getQualifier(): [VariableAccess] (__begin) +# 2246| Type = [NestedStruct] iterator +# 2246| ValueCategory = lvalue +# 2246| getChild(5): [DeclStmt] declaration +# 2246| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2246| Type = [Struct] String +# 2246| getVariable().getInitializer(): [Initializer] initializer for s +# 2246| getExpr(): [ConstructorCall] call to String +# 2246| Type = [VoidType] void +# 2246| ValueCategory = prvalue +# 2246| getArgument(0): [OverloadedPointerDereferenceExpr] call to operator* +# 2246| Type = [LValueReferenceType] String & +# 2246| ValueCategory = prvalue +# 2246| getQualifier(): [VariableAccess] (__begin) +# 2246| Type = [NestedStruct] iterator +# 2246| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2246| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2246| Type = [LValueReferenceType] const String & +# 2246| ValueCategory = prvalue +# 2246| getExpr(): [CStyleCast] (const String)... +# 2246| Conversion = [GlvalueConversion] glvalue conversion +# 2246| Type = [SpecifiedType] const String +# 2246| ValueCategory = lvalue +# 2246| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2246| Type = [Struct] String +# 2246| ValueCategory = lvalue +# 2246| getStmt(): [BlockStmt] { ... } +# 2247| getStmt(0): [DeclStmt] declaration +# 2247| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2247| Type = [Struct] String +# 2247| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2247| getExpr(): [ConstructorCall] call to String +# 2247| Type = [VoidType] void +# 2247| ValueCategory = prvalue +# 2248| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2248| Type = [VoidType] void +# 2248| ValueCategory = prvalue +# 2248| getQualifier(): [VariableAccess] s2 +# 2248| Type = [Struct] String +# 2248| ValueCategory = lvalue +# 2246| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2246| Type = [VoidType] void +# 2246| ValueCategory = prvalue +# 2246| getQualifier(): [VariableAccess] s +# 2246| Type = [Struct] String +# 2246| ValueCategory = lvalue +# 2246| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2246| Type = [NestedStruct] iterator +# 2246| ValueCategory = lvalue +# 2250| getStmt(3): [ForStmt] for(...;...;...) ... +# 2250| getInitialization(): [DeclStmt] declaration +# 2250| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2250| Type = [Struct] String +# 2250| getVariable().getInitializer(): [Initializer] initializer for s +# 2250| getExpr(): [ConstructorCall] call to String +# 2250| Type = [VoidType] void +# 2250| ValueCategory = prvalue +# 2250| getArgument(0): hello +# 2250| Type = [ArrayType] const char[6] +# 2250| Value = [StringLiteral] "hello" +# 2250| ValueCategory = lvalue +# 2250| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2250| Type = [PointerType] const char * +# 2250| ValueCategory = prvalue +# 2250| getDeclarationEntry(1): [VariableDeclarationEntry] definition of s2 +# 2250| Type = [Struct] String +# 2250| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2250| getExpr(): [ConstructorCall] call to String +# 2250| Type = [VoidType] void +# 2250| ValueCategory = prvalue +# 2250| getArgument(0): world +# 2250| Type = [ArrayType] const char[6] +# 2250| Value = [StringLiteral] "world" +# 2250| ValueCategory = lvalue +# 2250| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2250| Type = [PointerType] const char * +# 2250| ValueCategory = prvalue +# 2250| getCondition(): [NEExpr] ... != ... +# 2250| Type = [BoolType] bool +# 2250| ValueCategory = prvalue +# 2250| getLeftOperand(): [VariableAccess] c +# 2250| Type = [PlainCharType] char +# 2250| ValueCategory = prvalue(load) +# 2250| getRightOperand(): [Literal] 0 +# 2250| Type = [IntType] int +# 2250| Value = [Literal] 0 +# 2250| ValueCategory = prvalue +# 2250| getLeftOperand().getFullyConverted(): [CStyleCast] (int)... +# 2250| Conversion = [IntegralConversion] integral conversion +# 2250| Type = [IntType] int +# 2250| ValueCategory = prvalue +# 2250| getUpdate(): [AssignExpr] ... = ... +# 2250| Type = [PlainCharType] char +# 2250| ValueCategory = lvalue +# 2250| getLValue(): [VariableAccess] c +# 2250| Type = [PlainCharType] char +# 2250| ValueCategory = lvalue +# 2250| getRValue(): [FunctionCall] call to pop_back +# 2250| Type = [PlainCharType] char +# 2250| ValueCategory = prvalue +# 2250| getQualifier(): [VariableAccess] s +# 2250| Type = [Struct] String +# 2250| ValueCategory = lvalue +# 2250| getStmt(): [BlockStmt] { ... } +# 2251| getStmt(0): [ExprStmt] ExprStmt +# 2251| getExpr(): [AssignExpr] ... = ... +# 2251| Type = [PlainCharType] char +# 2251| ValueCategory = lvalue +# 2251| getLValue(): [VariableAccess] c +# 2251| Type = [PlainCharType] char +# 2251| ValueCategory = lvalue +# 2251| getRValue(): [Literal] 0 +# 2251| Type = [IntType] int +# 2251| Value = [Literal] 0 +# 2251| ValueCategory = prvalue +# 2251| getRValue().getFullyConverted(): [CStyleCast] (char)... +# 2251| Conversion = [IntegralConversion] integral conversion +# 2251| Type = [PlainCharType] char +# 2251| Value = [CStyleCast] 0 +# 2251| ValueCategory = prvalue +# 2250| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2250| Type = [VoidType] void +# 2250| ValueCategory = prvalue +# 2250| getQualifier(): [VariableAccess] s2 +# 2250| Type = [Struct] String +# 2250| ValueCategory = lvalue +# 2250| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2250| Type = [VoidType] void +# 2250| ValueCategory = prvalue +# 2250| getQualifier(): [VariableAccess] s +# 2250| Type = [Struct] String +# 2250| ValueCategory = lvalue +# 2253| getStmt(4): [ReturnStmt] return ... +# 2255| [TopLevelFunction] void IfDestructors2(bool) +# 2255| : +# 2255| getParameter(0): [Parameter] b +# 2255| Type = [BoolType] bool +# 2255| getEntryPoint(): [BlockStmt] { ... } +# 2256| getStmt(0): [IfStmt] if (...) ... +# 2256| getInitialization(): [DeclStmt] declaration +# 2256| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2256| Type = [Struct] String +# 2256| getVariable().getInitializer(): [Initializer] initializer for s +# 2256| getExpr(): [ConstructorCall] call to String +# 2256| Type = [VoidType] void +# 2256| ValueCategory = prvalue +# 2256| getArgument(0): hello +# 2256| Type = [ArrayType] const char[6] +# 2256| Value = [StringLiteral] "hello" +# 2256| ValueCategory = lvalue +# 2256| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2256| Type = [PointerType] const char * +# 2256| ValueCategory = prvalue +# 2256| getCondition(): [VariableAccess] b +# 2256| Type = [BoolType] bool +# 2256| ValueCategory = prvalue(load) +# 2256| getThen(): [BlockStmt] { ... } +# 2257| getStmt(0): [DeclStmt] declaration +# 2257| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2257| Type = [IntType] int +# 2257| getVariable().getInitializer(): [Initializer] initializer for x +# 2257| getExpr(): [Literal] 0 +# 2257| Type = [IntType] int +# 2257| Value = [Literal] 0 +# 2257| ValueCategory = prvalue +# 2258| getElse(): [BlockStmt] { ... } +# 2259| getStmt(0): [DeclStmt] declaration +# 2259| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2259| Type = [IntType] int +# 2259| getVariable().getInitializer(): [Initializer] initializer for y +# 2259| getExpr(): [Literal] 0 +# 2259| Type = [IntType] int +# 2259| Value = [Literal] 0 +# 2259| ValueCategory = prvalue +# 2260| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2260| Type = [VoidType] void +# 2260| ValueCategory = prvalue +# 2260| getQualifier(): [VariableAccess] s +# 2260| Type = [Struct] String +# 2260| ValueCategory = lvalue +# 2261| getStmt(1): [ReturnStmt] return ... +# 2263| [CopyAssignmentOperator] Bool& Bool::operator=(Bool const&) +# 2263| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool & +# 2263| [CopyConstructor] void Bool::Bool(Bool const&) +# 2263| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool & +# 2265| [Constructor] void Bool::Bool(bool) +# 2265| : +# 2265| getParameter(0): [Parameter] b_ +# 2265| Type = [BoolType] bool +# 2266| [ConversionOperator] bool Bool::operator bool() +# 2266| : +# 2267| [Destructor] void Bool::~Bool() +# 2267| : +# 2270| [TopLevelFunction] void IfDestructors3(bool) +# 2270| : +# 2270| getParameter(0): [Parameter] b +# 2270| Type = [BoolType] bool +# 2270| getEntryPoint(): [BlockStmt] { ... } +# 2271| getStmt(0): [IfStmt] if (...) ... +# 2271| getCondition(): [ConditionDeclExpr] (condition decl) +# 2271| Type = [BoolType] bool +# 2271| ValueCategory = prvalue +# 2271| getChild(0): [FunctionCall] call to operator bool +# 2271| Type = [BoolType] bool +# 2271| ValueCategory = prvalue +# 2271| getQualifier(): [VariableAccess] B +# 2271| Type = [Class] Bool +# 2271| ValueCategory = prvalue(load) +# 2271| getThen(): [BlockStmt] { ... } +# 2272| getStmt(0): [DeclStmt] declaration +# 2272| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1 +# 2272| Type = [Struct] String +# 2272| getVariable().getInitializer(): [Initializer] initializer for s1 +# 2272| getExpr(): [ConstructorCall] call to String +# 2272| Type = [VoidType] void +# 2272| ValueCategory = prvalue +# 2273| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2273| Type = [VoidType] void +# 2273| ValueCategory = prvalue +# 2273| getQualifier(): [VariableAccess] s1 +# 2273| Type = [Struct] String +# 2273| ValueCategory = lvalue +# 2273| getElse(): [BlockStmt] { ... } +# 2274| getStmt(0): [DeclStmt] declaration +# 2274| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2274| Type = [Struct] String +# 2274| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2274| getExpr(): [ConstructorCall] call to String +# 2274| Type = [VoidType] void +# 2274| ValueCategory = prvalue +# 2275| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2275| Type = [VoidType] void +# 2275| ValueCategory = prvalue +# 2275| getQualifier(): [VariableAccess] s2 +# 2275| Type = [Struct] String +# 2275| ValueCategory = lvalue +# 2275| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2275| Type = [VoidType] void +# 2275| ValueCategory = prvalue +# 2275| getQualifier(): [VariableAccess] B +# 2275| Type = [Class] Bool +# 2275| ValueCategory = lvalue +# 2276| getStmt(1): [ReturnStmt] return ... +# 2278| [TopLevelFunction] void WhileLoopDestructors(bool) +# 2278| : +# 2278| getParameter(0): [Parameter] b +# 2278| Type = [BoolType] bool +# 2278| getEntryPoint(): [BlockStmt] { ... } +# 2279| getStmt(0): [BlockStmt] { ... } +# 2280| getStmt(0): [DeclStmt] declaration +# 2280| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2280| Type = [Struct] String +# 2280| getVariable().getInitializer(): [Initializer] initializer for s +# 2280| getExpr(): [ConstructorCall] call to String +# 2280| Type = [VoidType] void +# 2280| ValueCategory = prvalue +# 2281| getStmt(1): [WhileStmt] while (...) ... +# 2281| getCondition(): [VariableAccess] b +# 2281| Type = [BoolType] bool +# 2281| ValueCategory = prvalue(load) +# 2281| getStmt(): [BlockStmt] { ... } +# 2282| getStmt(0): [ExprStmt] ExprStmt +# 2282| getExpr(): [AssignExpr] ... = ... +# 2282| Type = [BoolType] bool +# 2282| ValueCategory = lvalue +# 2282| getLValue(): [VariableAccess] b +# 2282| Type = [BoolType] bool +# 2282| ValueCategory = lvalue +# 2282| getRValue(): [Literal] 0 +# 2282| Type = [BoolType] bool +# 2282| Value = [Literal] 0 +# 2282| ValueCategory = prvalue +# 2284| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2284| Type = [VoidType] void +# 2284| ValueCategory = prvalue +# 2284| getQualifier(): [VariableAccess] s +# 2284| Type = [Struct] String +# 2284| ValueCategory = lvalue +# 2286| getStmt(1): [BlockStmt] { ... } +# 2287| getStmt(0): [WhileStmt] while (...) ... +# 2287| getCondition(): [ConditionDeclExpr] (condition decl) +# 2287| Type = [BoolType] bool +# 2287| ValueCategory = prvalue +# 2287| getChild(0): [FunctionCall] call to operator bool +# 2287| Type = [BoolType] bool +# 2287| ValueCategory = prvalue +# 2287| getQualifier(): [VariableAccess] B +# 2287| Type = [Class] Bool +# 2287| ValueCategory = prvalue(load) +# 2287| getStmt(): [BlockStmt] { ... } +# 2288| getStmt(0): [ExprStmt] ExprStmt +# 2288| getExpr(): [AssignExpr] ... = ... +# 2288| Type = [BoolType] bool +# 2288| ValueCategory = lvalue +# 2288| getLValue(): [VariableAccess] b +# 2288| Type = [BoolType] bool +# 2288| ValueCategory = lvalue +# 2288| getRValue(): [Literal] 0 +# 2288| Type = [BoolType] bool +# 2288| Value = [Literal] 0 +# 2288| ValueCategory = prvalue +# 2289| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2289| Type = [VoidType] void +# 2289| ValueCategory = prvalue +# 2289| getQualifier(): [VariableAccess] B +# 2289| Type = [Class] Bool +# 2289| ValueCategory = lvalue +# 2289| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2289| Type = [VoidType] void +# 2289| ValueCategory = prvalue +# 2289| getQualifier(): [VariableAccess] B +# 2289| Type = [Class] Bool +# 2289| ValueCategory = lvalue +# 2291| getStmt(2): [ReturnStmt] return ... +# 2293| [TopLevelFunction] void VoidFunc() +# 2293| : +# 2293| getEntryPoint(): [BlockStmt] { ... } +# 2293| getStmt(0): [ReturnStmt] return ... +# 2295| [TopLevelFunction] void IfReturnDestructors(bool) +# 2295| : +# 2295| getParameter(0): [Parameter] b +# 2295| Type = [BoolType] bool +# 2295| getEntryPoint(): [BlockStmt] { ... } +# 2296| getStmt(0): [DeclStmt] declaration +# 2296| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2296| Type = [Struct] String +# 2296| getVariable().getInitializer(): [Initializer] initializer for s +# 2296| getExpr(): [ConstructorCall] call to String +# 2296| Type = [VoidType] void +# 2296| ValueCategory = prvalue +# 2297| getStmt(1): [IfStmt] if (...) ... +# 2297| getCondition(): [VariableAccess] b +# 2297| Type = [BoolType] bool +# 2297| ValueCategory = prvalue(load) +# 2297| getThen(): [BlockStmt] { ... } +# 2298| getStmt(0): [ReturnStmt] return ... +# 2304| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2304| Type = [VoidType] void +# 2304| ValueCategory = prvalue +# 2304| getQualifier(): [VariableAccess] s +# 2304| Type = [Struct] String +# 2304| ValueCategory = lvalue +# 2300| getStmt(2): [IfStmt] if (...) ... +# 2300| getCondition(): [VariableAccess] b +# 2300| Type = [BoolType] bool +# 2300| ValueCategory = prvalue(load) +# 2300| getThen(): [BlockStmt] { ... } +# 2301| getStmt(0): [ReturnStmt] return ... +# 2301| getExpr(): [FunctionCall] call to VoidFunc +# 2301| Type = [VoidType] void +# 2301| ValueCategory = prvalue +# 2304| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2304| Type = [VoidType] void +# 2304| ValueCategory = prvalue +# 2304| getQualifier(): [VariableAccess] s +# 2304| Type = [Struct] String +# 2304| ValueCategory = lvalue +# 2303| getStmt(3): [ExprStmt] ExprStmt +# 2303| getExpr(): [VariableAccess] s +# 2303| Type = [Struct] String +# 2303| ValueCategory = lvalue +# 2304| getStmt(4): [ReturnStmt] return ... +# 2304| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2304| Type = [VoidType] void +# 2304| ValueCategory = prvalue +# 2304| getQualifier(): [VariableAccess] s +# 2304| Type = [Struct] String +# 2304| ValueCategory = lvalue +# 2306| [TopLevelFunction] int IfReturnDestructors3(bool) +# 2306| : +# 2306| getParameter(0): [Parameter] b +# 2306| Type = [BoolType] bool +# 2306| getEntryPoint(): [BlockStmt] { ... } +# 2307| getStmt(0): [DeclStmt] declaration +# 2307| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2307| Type = [Struct] String +# 2307| getVariable().getInitializer(): [Initializer] initializer for s +# 2307| getExpr(): [ConstructorCall] call to String +# 2307| Type = [VoidType] void +# 2307| ValueCategory = prvalue +# 2308| getStmt(1): [IfStmt] if (...) ... +# 2308| getCondition(): [VariableAccess] b +# 2308| Type = [BoolType] bool +# 2308| ValueCategory = prvalue(load) +# 2308| getThen(): [BlockStmt] { ... } +# 2309| getStmt(0): [ReturnStmt] return ... +# 2309| getExpr(): [Literal] 1 +# 2309| Type = [IntType] int +# 2309| Value = [Literal] 1 +# 2309| ValueCategory = prvalue +# 2312| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2312| Type = [VoidType] void +# 2312| ValueCategory = prvalue +# 2312| getQualifier(): [VariableAccess] s +# 2312| Type = [Struct] String +# 2312| ValueCategory = lvalue +# 2311| getStmt(2): [ReturnStmt] return ... +# 2311| getExpr(): [Literal] 0 +# 2311| Type = [IntType] int +# 2311| Value = [Literal] 0 +# 2311| ValueCategory = prvalue +# 2312| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2312| Type = [VoidType] void +# 2312| ValueCategory = prvalue +# 2312| getQualifier(): [VariableAccess] s +# 2312| Type = [Struct] String +# 2312| ValueCategory = lvalue +# 2314| [TopLevelFunction] void VoidReturnDestructors() +# 2314| : +# 2314| getEntryPoint(): [BlockStmt] { ... } +# 2315| getStmt(0): [DeclStmt] declaration +# 2315| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2315| Type = [Struct] String +# 2315| getVariable().getInitializer(): [Initializer] initializer for s +# 2315| getExpr(): [ConstructorCall] call to String +# 2315| Type = [VoidType] void +# 2315| ValueCategory = prvalue +# 2316| getStmt(1): [ReturnStmt] return ... +# 2316| getExpr(): [FunctionCall] call to VoidFunc +# 2316| Type = [VoidType] void +# 2316| ValueCategory = prvalue +# 2317| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2317| Type = [VoidType] void +# 2317| ValueCategory = prvalue +# 2317| getQualifier(): [VariableAccess] s +# 2317| Type = [Struct] String +# 2317| ValueCategory = lvalue +# 2320| [CopyAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc const&) +# 2320| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const HasVoidToIntFunc & +# 2320| [MoveAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc&&) +# 2320| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] HasVoidToIntFunc && +# 2322| [MemberFunction] void return_routine_type::HasVoidToIntFunc::VoidToInt(int) +# 2322| : +# 2322| getParameter(0): [Parameter] (unnamed parameter 0) +# 2322| Type = [IntType] int +# 2327| [TopLevelFunction] return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() +# 2327| : +# 2328| getEntryPoint(): [BlockStmt] { ... } +# 2329| getStmt(0): [ReturnStmt] return ... +# 2329| getExpr(): [FunctionAccess] VoidToInt +# 2329| Type = [RoutineType] ..()(..) +# 2329| ValueCategory = prvalue 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 index 4022128e2bb..510a271b7ac 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -3628,50 +3628,82 @@ ir.cpp: # 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 : +# 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 : +# 620| r620_2(glval) = VariableAddress[s4] : +# 620| r620_3(glval) = FunctionAddress[~String] : +# 620| v620_4(void) = Call[~String] : func:r620_3, this:r620_2 +# 620| m620_5(unknown) = ^CallSideEffect : ~m619_8 +# 620| m620_6(unknown) = Chi : total:m619_8, partial:m620_5 +# 620| v620_7(void) = ^IndirectReadSideEffect[-1] : &:r620_2, m619_11 +# 620| m620_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_2 +# 620| m620_9(String) = Chi : total:m619_11, partial:m620_8 +# 620| r620_10(glval) = VariableAddress[s3] : +# 620| r620_11(glval) = FunctionAddress[~String] : +# 620| v620_12(void) = Call[~String] : func:r620_11, this:r620_10 +# 620| m620_13(unknown) = ^CallSideEffect : ~m620_6 +# 620| m620_14(unknown) = Chi : total:m620_6, partial:m620_13 +# 620| v620_15(void) = ^IndirectReadSideEffect[-1] : &:r620_10, m618_6 +# 620| m620_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_10 +# 620| m620_17(String) = Chi : total:m618_6, partial:m620_16 +# 620| r620_18(glval) = VariableAddress[s2] : +# 620| r620_19(glval) = FunctionAddress[~String] : +# 620| v620_20(void) = Call[~String] : func:r620_19, this:r620_18 +# 620| m620_21(unknown) = ^CallSideEffect : ~m620_14 +# 620| m620_22(unknown) = Chi : total:m620_14, partial:m620_21 +# 620| v620_23(void) = ^IndirectReadSideEffect[-1] : &:r620_18, m617_11 +# 620| m620_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_18 +# 620| m620_25(String) = Chi : total:m617_11, partial:m620_24 +# 620| r620_26(glval) = VariableAddress[s1] : +# 620| r620_27(glval) = FunctionAddress[~String] : +# 620| v620_28(void) = Call[~String] : func:r620_27, this:r620_26 +# 620| m620_29(unknown) = ^CallSideEffect : ~m620_22 +# 620| m620_30(unknown) = Chi : total:m620_22, partial:m620_29 +# 620| v620_31(void) = ^IndirectReadSideEffect[-1] : &:r620_26, m616_8 +# 620| m620_32(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_26 +# 620| m620_33(String) = Chi : total:m616_8, partial:m620_32 +# 615| v615_5(void) = ReturnVoid : +# 615| v615_6(void) = AliasedUse : ~m620_30 +# 615| v615_7(void) = ExitFunction : # 622| void CallMethods(String&, String*, String) # 622| Block 0 @@ -5158,8 +5190,32 @@ ir.cpp: # 839| r839_4(glval) = VariableAddress[pb] : # 839| m839_5(Base *) = Store[pb] : &:r839_4, r839_3 # 840| v840_1(void) = NoOp : +# 840| r840_2(glval) = VariableAddress[d] : +# 840| r840_3(glval) = FunctionAddress[~Derived] : +# 840| v840_4(void) = Call[~Derived] : func:r840_3, this:r840_2 +# 840| m840_5(unknown) = ^CallSideEffect : ~m831_10 +# 840| m840_6(unknown) = Chi : total:m831_10, partial:m840_5 +# 840| v840_7(void) = ^IndirectReadSideEffect[-1] : &:r840_2, m831_14 +# 840| m840_8(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r840_2 +# 840| m840_9(Derived) = Chi : total:m831_14, partial:m840_8 +# 840| r840_10(glval) = VariableAddress[m] : +# 840| r840_11(glval) = FunctionAddress[~Middle] : +# 840| v840_12(void) = Call[~Middle] : func:r840_11, this:r840_10 +# 840| m840_13(unknown) = ^CallSideEffect : ~m840_6 +# 840| m840_14(unknown) = Chi : total:m840_6, partial:m840_13 +# 840| v840_15(void) = ^IndirectReadSideEffect[-1] : &:r840_10, m817_13 +# 840| m840_16(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r840_10 +# 840| m840_17(Middle) = Chi : total:m817_13, partial:m840_16 +# 840| r840_18(glval) = VariableAddress[b] : +# 840| r840_19(glval) = FunctionAddress[~Base] : +# 840| v840_20(void) = Call[~Base] : func:r840_19, this:r840_18 +# 840| m840_21(unknown) = ^CallSideEffect : ~m840_14 +# 840| m840_22(unknown) = Chi : total:m840_14, partial:m840_21 +# 840| v840_23(void) = ^IndirectReadSideEffect[-1] : &:r840_18, m824_24 +# 840| m840_24(Base) = ^IndirectMayWriteSideEffect[-1] : &:r840_18 +# 840| m840_25(Base) = Chi : total:m824_24, partial:m840_24 # 799| v799_5(void) = ReturnVoid : -# 799| v799_6(void) = AliasedUse : ~m831_10 +# 799| v799_6(void) = AliasedUse : ~m840_22 # 799| v799_7(void) = ExitFunction : # 842| void PolymorphicBase::PolymorphicBase() @@ -5224,68 +5280,84 @@ ir.cpp: # 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 : +# 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 : +# 865| r865_2(glval) = VariableAddress[d] : +# 865| r865_3(glval) = FunctionAddress[~PolymorphicDerived] : +# 865| v865_4(void) = Call[~PolymorphicDerived] : func:r865_3, this:r865_2 +# 865| m865_5(unknown) = ^CallSideEffect : ~m851_6 +# 865| m865_6(unknown) = Chi : total:m851_6, partial:m865_5 +# 865| v865_7(void) = ^IndirectReadSideEffect[-1] : &:r865_2, m851_8 +# 865| m865_8(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r865_2 +# 865| m865_9(PolymorphicDerived) = Chi : total:m851_8, partial:m865_8 +# 865| r865_10(glval) = VariableAddress[b] : +# 865| r865_11(glval) = FunctionAddress[~PolymorphicBase] : +# 865| v865_12(void) = Call[~PolymorphicBase] : func:r865_11, this:r865_10 +# 865| m865_13(unknown) = ^CallSideEffect : ~m865_6 +# 865| m865_14(unknown) = Chi : total:m865_6, partial:m865_13 +# 865| v865_15(void) = ^IndirectReadSideEffect[-1] : &:r865_10, m850_8 +# 865| m865_16(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r865_10 +# 865| m865_17(PolymorphicBase) = Chi : total:m850_8, partial:m865_16 +# 849| v849_5(void) = ReturnVoid : +# 849| v849_6(void) = AliasedUse : ~m865_14 +# 849| v849_7(void) = ExitFunction : # 867| void String::String() # 867| Block 0 @@ -6187,184 +6259,200 @@ ir.cpp: # 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 : +# 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 : +# 1056| r1056_2(glval) = VariableAddress[lambda_val_explicit] : +# 1056| r1056_3(glval) = FunctionAddress[~] : +# 1056| v1056_4(void) = Call[~] : func:r1056_3, this:r1056_2 +# 1056| m1056_5(unknown) = ^CallSideEffect : ~m1055_7 +# 1056| m1056_6(unknown) = Chi : total:m1055_7, partial:m1056_5 +# 1056| v1056_7(void) = ^IndirectReadSideEffect[-1] : &:r1056_2, m1049_12 +# 1056| m1056_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_2 +# 1056| m1056_9(decltype([...](...){...})) = Chi : total:m1049_12, partial:m1056_8 +# 1056| r1056_10(glval) = VariableAddress[lambda_val] : +# 1056| r1056_11(glval) = FunctionAddress[~] : +# 1056| v1056_12(void) = Call[~] : func:r1056_11, this:r1056_10 +# 1056| m1056_13(unknown) = ^CallSideEffect : ~m1056_6 +# 1056| m1056_14(unknown) = Chi : total:m1056_6, partial:m1056_13 +# 1056| v1056_15(void) = ^IndirectReadSideEffect[-1] : &:r1056_10, m1045_17 +# 1056| m1056_16(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_10 +# 1056| m1056_17(decltype([...](...){...})) = Chi : total:m1045_17, partial:m1056_16 +# 1040| v1040_11(void) = ReturnIndirection[s] : &:r1040_9, m1040_10 +# 1040| v1040_12(void) = ReturnVoid : +# 1040| v1040_13(void) = AliasedUse : ~m1056_14 +# 1040| v1040_14(void) = ExitFunction : # 1041| void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)&&) # 1041| Block 0 @@ -7717,9 +7805,17 @@ ir.cpp: # 1288| m1288_7(unknown) = ^CallSideEffect : ~m1288_4 # 1288| m1288_8(unknown) = Chi : total:m1288_4, partial:m1288_7 # 1289| v1289_1(void) = NoOp : +# 1289| r1289_2(glval) = VariableAddress[c] : +# 1289| r1289_3(glval) = FunctionAddress[~C] : +# 1289| v1289_4(void) = Call[~C] : func:r1289_3, this:r1289_2 +# 1289| m1289_5(unknown) = ^CallSideEffect : ~m1288_8 +# 1289| m1289_6(unknown) = Chi : total:m1288_8, partial:m1289_5 +# 1289| v1289_7(void) = ^IndirectReadSideEffect[-1] : &:r1289_2, m1273_8 +# 1289| m1289_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r1289_2 +# 1289| m1289_9(C) = Chi : total:m1273_8, partial:m1289_8 # 1272| v1272_11(void) = ReturnIndirection[a_arg] : &:r1272_9, m1283_12 # 1272| v1272_12(void) = ReturnVoid : -# 1272| v1272_13(void) = AliasedUse : ~m1288_8 +# 1272| v1272_13(void) = AliasedUse : ~m1289_6 # 1272| v1272_14(void) = ExitFunction : # 1291| int missingReturnValue(bool, int) @@ -8279,8 +8375,16 @@ ir.cpp: # 1378| m1378_5(unknown) = Chi : total:m1376_11, partial:m1378_4 # 1378| m1378_6(String) = Store[#temp1378:5] : &:r1378_1, r1378_3 # 1379| v1379_1(void) = NoOp : +# 1379| r1379_2(glval) = VariableAddress[s] : +# 1379| r1379_3(glval) = FunctionAddress[~String] : +# 1379| v1379_4(void) = Call[~String] : func:r1379_3, this:r1379_2 +# 1379| m1379_5(unknown) = ^CallSideEffect : ~m1378_5 +# 1379| m1379_6(unknown) = Chi : total:m1378_5, partial:m1379_5 +# 1379| v1379_7(void) = ^IndirectReadSideEffect[-1] : &:r1379_2, m1368_6 +# 1379| m1379_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1379_2 +# 1379| m1379_9(String) = Chi : total:m1368_6, partial:m1379_8 # 1367| v1367_5(void) = ReturnVoid : -# 1367| v1367_6(void) = AliasedUse : ~m1378_5 +# 1367| v1367_6(void) = AliasedUse : ~m1379_6 # 1367| v1367_7(void) = ExitFunction : # 1381| void temporary_destructor_only() @@ -8354,8 +8458,24 @@ ir.cpp: # 1390| m1390_5(unknown) = Chi : total:m1388_10, partial:m1390_4 # 1390| m1390_6(destructor_only) = Store[#temp1390:5] : &:r1390_1, r1390_3 # 1391| v1391_1(void) = NoOp : +# 1391| r1391_2(glval) = VariableAddress[d2] : +# 1391| r1391_3(glval) = FunctionAddress[~destructor_only] : +# 1391| v1391_4(void) = Call[~destructor_only] : func:r1391_3, this:r1391_2 +# 1391| m1391_5(unknown) = ^CallSideEffect : ~m1390_5 +# 1391| m1391_6(unknown) = Chi : total:m1390_5, partial:m1391_5 +# 1391| v1391_7(void) = ^IndirectReadSideEffect[-1] : &:r1391_2, m1384_2 +# 1391| m1391_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1391_2 +# 1391| m1391_9(destructor_only) = Chi : total:m1384_2, partial:m1391_8 +# 1391| r1391_10(glval) = VariableAddress[d] : +# 1391| r1391_11(glval) = FunctionAddress[~destructor_only] : +# 1391| v1391_12(void) = Call[~destructor_only] : func:r1391_11, this:r1391_10 +# 1391| m1391_13(unknown) = ^CallSideEffect : ~m1391_6 +# 1391| m1391_14(unknown) = Chi : total:m1391_6, partial:m1391_13 +# 1391| v1391_15(void) = ^IndirectReadSideEffect[-1] : &:r1391_10, m1382_6 +# 1391| m1391_16(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1391_10 +# 1391| m1391_17(destructor_only) = Chi : total:m1382_6, partial:m1391_16 # 1381| v1381_5(void) = ReturnVoid : -# 1381| v1381_6(void) = AliasedUse : ~m1390_5 +# 1381| v1381_6(void) = AliasedUse : ~m1391_14 # 1381| v1381_7(void) = ExitFunction : # 1393| void temporary_copy_constructor() @@ -11110,8 +11230,16 @@ ir.cpp: # 1927| r1927_6(glval) = VariableAddress[z] : # 1927| m1927_7(int) = Store[z] : &:r1927_6, r1927_3 # 1928| v1928_1(void) = NoOp : +# 1928| r1928_2(glval) = VariableAddress[c] : +# 1928| r1928_3(glval) = FunctionAddress[~C] : +# 1928| v1928_4(void) = Call[~C] : func:r1928_3, this:r1928_2 +# 1928| m1928_5(unknown) = ^CallSideEffect : ~m1927_5 +# 1928| m1928_6(unknown) = Chi : total:m1927_5, partial:m1928_5 +# 1928| v1928_7(void) = ^IndirectReadSideEffect[-1] : &:r1928_2, m1921_8 +# 1928| m1928_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r1928_2 +# 1928| m1928_9(C) = Chi : total:m1921_8, partial:m1928_8 # 1920| v1920_5(void) = ReturnVoid : -# 1920| v1920_6(void) = AliasedUse : ~m1927_5 +# 1920| v1920_6(void) = AliasedUse : ~m1928_6 # 1920| v1920_7(void) = ExitFunction : # 1930| void test_double_assign() @@ -11371,8 +11499,16 @@ ir.cpp: # 1995| r1995_3(glval<..(*)(..)>) = VariableAddress[pfn] : # 1995| m1995_4(..(*)(..)) = Store[pfn] : &:r1995_3, r1995_2 # 1996| v1996_1(void) = NoOp : +# 1996| r1996_2(glval) = VariableAddress[c] : +# 1996| r1996_3(glval) = FunctionAddress[~C] : +# 1996| v1996_4(void) = Call[~C] : func:r1996_3, this:r1996_2 +# 1996| m1996_5(unknown) = ^CallSideEffect : ~m1993_6 +# 1996| m1996_6(unknown) = Chi : total:m1993_6, partial:m1996_5 +# 1996| v1996_7(void) = ^IndirectReadSideEffect[-1] : &:r1996_2, m1993_8 +# 1996| m1996_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r1996_2 +# 1996| m1996_9(C) = Chi : total:m1993_8, partial:m1996_8 # 1992| v1992_5(void) = ReturnVoid : -# 1992| v1992_6(void) = AliasedUse : ~m1993_6 +# 1992| v1992_6(void) = AliasedUse : ~m1996_6 # 1992| v1992_7(void) = ExitFunction : # 1998| void TernaryTestInt(bool, int, int, int) @@ -12641,25 +12777,33 @@ ir.cpp: #-----| True -> Block 2 # 2137| Block 1 -# 2137| m2137_9(unknown) = Phi : from 14:~m2159_5, from 19:~m2163_54, from 20:~m2163_38 +# 2137| m2137_9(unknown) = Phi : from 13:~m2172_5, from 19:~m2172_13, from 23:~m2172_22 # 2137| v2137_10(void) = ReturnVoid : # 2137| v2137_11(void) = AliasedUse : ~m2137_9 # 2137| v2137_12(void) = ExitFunction : # 2139| Block 2 -# 2139| r2139_1(glval) = VariableAddress[x] : -# 2139| r2139_2(glval) = FunctionAddress[set_x] : -# 2139| r2139_3(char) = Constant[97] : -# 2139| v2139_4(void) = Call[set_x] : func:r2139_2, this:r2139_1, 0:r2139_3 -# 2139| m2139_5(unknown) = ^CallSideEffect : ~m2138_6 -# 2139| m2139_6(unknown) = Chi : total:m2138_6, partial:m2139_5 -# 2139| v2139_7(void) = ^IndirectReadSideEffect[-1] : &:r2139_1, m2138_8 -# 2139| m2139_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2139_1 -# 2139| m2139_9(ClassWithDestructor) = Chi : total:m2138_8, partial:m2139_8 +# 2139| r2139_1(glval) = VariableAddress[x] : +# 2139| r2139_2(glval) = FunctionAddress[set_x] : +# 2139| r2139_3(char) = Constant[97] : +# 2139| v2139_4(void) = Call[set_x] : func:r2139_2, this:r2139_1, 0:r2139_3 +# 2139| m2139_5(unknown) = ^CallSideEffect : ~m2138_6 +# 2139| m2139_6(unknown) = Chi : total:m2138_6, partial:m2139_5 +# 2139| v2139_7(void) = ^IndirectReadSideEffect[-1] : &:r2139_1, m2138_8 +# 2139| m2139_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2139_1 +# 2139| m2139_9(ClassWithDestructor) = Chi : total:m2138_8, partial:m2139_8 +# 2139| r2139_10(glval) = VariableAddress[x] : +# 2139| r2139_11(glval) = FunctionAddress[~ClassWithDestructor] : +# 2139| v2139_12(void) = Call[~ClassWithDestructor] : func:r2139_11, this:r2139_10 +# 2139| m2139_13(unknown) = ^CallSideEffect : ~m2139_6 +# 2139| m2139_14(unknown) = Chi : total:m2139_6, partial:m2139_13 +# 2139| v2139_15(void) = ^IndirectReadSideEffect[-1] : &:r2139_10, m2139_9 +# 2139| m2139_16(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2139_10 +# 2139| m2139_17(ClassWithDestructor) = Chi : total:m2139_9, partial:m2139_16 #-----| Goto -> Block 3 # 2141| Block 3 -# 2141| m2141_1(unknown) = Phi : from 0:~m2138_6, from 2:~m2139_6 +# 2141| m2141_1(unknown) = Phi : from 0:~m2138_6, from 2:~m2139_14 # 2141| r2141_2(glval) = VariableAddress[x] : # 2141| m2141_3(ClassWithDestructor) = Uninitialized[x] : &:r2141_2 # 2141| r2141_4(glval) = FunctionAddress[ClassWithDestructor] : @@ -12670,7 +12814,7 @@ ir.cpp: # 2141| m2141_9(ClassWithDestructor) = Chi : total:m2141_3, partial:m2141_8 # 2141| r2141_10(bool) = Constant[1] : # 2141| v2141_11(void) = ConditionalBranch : r2141_10 -#-----| False -> Block 21 +#-----| False -> Block 24 #-----| True -> Block 4 # 2142| Block 4 @@ -12779,8 +12923,8 @@ ir.cpp: #-----| Goto -> Block 8 # 2154| Block 8 -# 2154| m2154_34(iterator) = Phi : from 7:m2154_25, from 9:m2154_59 -# 2154| m2154_35(unknown) = Phi : from 7:~m2154_32, from 9:~m2154_56 +# 2154| m2154_34(iterator) = Phi : from 7:m2154_25, from 9:m2154_67 +# 2154| m2154_35(unknown) = Phi : from 7:~m2154_32, from 9:~m2154_64 # 2154| r2154_36(glval) = VariableAddress[(__begin)] : #-----| r0_7(glval) = Convert : r2154_36 # 2154| r2154_37(glval) = FunctionAddress[operator!=] : @@ -12795,34 +12939,42 @@ ir.cpp: #-----| True -> Block 9 # 2154| Block 9 -# 2154| r2154_44(glval) = VariableAddress[y] : -# 2154| r2154_45(glval) = VariableAddress[(__begin)] : -#-----| r0_9(glval) = Convert : r2154_45 -# 2154| r2154_46(glval) = FunctionAddress[operator*] : -# 2154| r2154_47(ClassWithDestructor &) = Call[operator*] : func:r2154_46, this:r0_9 -# 2154| m2154_48(unknown) = ^CallSideEffect : ~m2154_42 -# 2154| m2154_49(unknown) = Chi : total:m2154_42, partial:m2154_48 -#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2154_34 -# 2154| r2154_50(ClassWithDestructor) = Load[?] : &:r2154_47, ~m2154_49 -# 2154| m2154_51(ClassWithDestructor) = Store[y] : &:r2154_44, r2154_50 -# 2155| r2155_1(glval) = VariableAddress[y] : -# 2155| r2155_2(glval) = FunctionAddress[set_x] : -# 2155| r2155_3(char) = Constant[97] : -# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 -# 2155| m2155_5(unknown) = ^CallSideEffect : ~m2154_49 -# 2155| m2155_6(unknown) = Chi : total:m2154_49, partial:m2155_5 -# 2155| v2155_7(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, m2154_51 -# 2155| m2155_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 -# 2155| m2155_9(ClassWithDestructor) = Chi : total:m2154_51, partial:m2155_8 -# 2154| r2154_52(glval) = VariableAddress[(__begin)] : -# 2154| r2154_53(glval) = FunctionAddress[operator++] : -# 2154| r2154_54(iterator &) = Call[operator++] : func:r2154_53, this:r2154_52 -# 2154| m2154_55(unknown) = ^CallSideEffect : ~m2155_6 -# 2154| m2154_56(unknown) = Chi : total:m2155_6, partial:m2154_55 -# 2154| v2154_57(void) = ^IndirectReadSideEffect[-1] : &:r2154_52, m2154_34 -# 2154| m2154_58(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_52 -# 2154| m2154_59(iterator) = Chi : total:m2154_34, partial:m2154_58 -# 2154| r2154_60(glval) = CopyValue : r2154_54 +# 2154| r2154_44(glval) = VariableAddress[y] : +# 2154| r2154_45(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2154_45 +# 2154| r2154_46(glval) = FunctionAddress[operator*] : +# 2154| r2154_47(ClassWithDestructor &) = Call[operator*] : func:r2154_46, this:r0_9 +# 2154| m2154_48(unknown) = ^CallSideEffect : ~m2154_42 +# 2154| m2154_49(unknown) = Chi : total:m2154_42, partial:m2154_48 +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2154_34 +# 2154| r2154_50(ClassWithDestructor) = Load[?] : &:r2154_47, ~m2154_49 +# 2154| m2154_51(ClassWithDestructor) = Store[y] : &:r2154_44, r2154_50 +# 2155| r2155_1(glval) = VariableAddress[y] : +# 2155| r2155_2(glval) = FunctionAddress[set_x] : +# 2155| r2155_3(char) = Constant[97] : +# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 +# 2155| m2155_5(unknown) = ^CallSideEffect : ~m2154_49 +# 2155| m2155_6(unknown) = Chi : total:m2154_49, partial:m2155_5 +# 2155| v2155_7(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, m2154_51 +# 2155| m2155_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 +# 2155| m2155_9(ClassWithDestructor) = Chi : total:m2154_51, partial:m2155_8 +# 2154| r2154_52(glval) = VariableAddress[y] : +# 2154| r2154_53(glval) = FunctionAddress[~ClassWithDestructor] : +# 2154| v2154_54(void) = Call[~ClassWithDestructor] : func:r2154_53, this:r2154_52 +# 2154| m2154_55(unknown) = ^CallSideEffect : ~m2155_6 +# 2154| m2154_56(unknown) = Chi : total:m2155_6, partial:m2154_55 +# 2154| v2154_57(void) = ^IndirectReadSideEffect[-1] : &:r2154_52, m2155_9 +# 2154| m2154_58(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2154_52 +# 2154| m2154_59(ClassWithDestructor) = Chi : total:m2155_9, partial:m2154_58 +# 2154| r2154_60(glval) = VariableAddress[(__begin)] : +# 2154| r2154_61(glval) = FunctionAddress[operator++] : +# 2154| r2154_62(iterator &) = Call[operator++] : func:r2154_61, this:r2154_60 +# 2154| m2154_63(unknown) = ^CallSideEffect : ~m2154_56 +# 2154| m2154_64(unknown) = Chi : total:m2154_56, partial:m2154_63 +# 2154| v2154_65(void) = ^IndirectReadSideEffect[-1] : &:r2154_60, m2154_34 +# 2154| m2154_66(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_60 +# 2154| m2154_67(iterator) = Chi : total:m2154_34, partial:m2154_66 +# 2154| r2154_68(glval) = CopyValue : r2154_62 #-----| Goto (back edge) -> Block 8 # 2157| Block 10 @@ -12868,8 +13020,8 @@ ir.cpp: #-----| Goto -> Block 11 # 2157| Block 11 -# 2157| m2157_34(iterator) = Phi : from 10:m2157_25, from 12:m2157_51 -# 2157| m2157_35(unknown) = Phi : from 10:~m2157_32, from 12:~m2157_48 +# 2157| m2157_34(iterator) = Phi : from 10:m2157_25, from 14:m2157_83 +# 2157| m2157_35(unknown) = Phi : from 10:~m2157_32, from 14:~m2157_80 # 2157| r2157_36(glval) = VariableAddress[(__begin)] : #-----| r0_17(glval) = Convert : r2157_36 # 2157| r2157_37(glval) = FunctionAddress[operator!=] : @@ -12881,40 +13033,28 @@ ir.cpp: #-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, m2157_34 # 2157| v2157_43(void) = ConditionalBranch : r2157_40 #-----| False -> Block 15 -#-----| True -> Block 13 +#-----| True -> Block 12 # 2157| Block 12 -# 2157| r2157_44(glval) = VariableAddress[(__begin)] : -# 2157| r2157_45(glval) = FunctionAddress[operator++] : -# 2157| r2157_46(iterator &) = Call[operator++] : func:r2157_45, this:r2157_44 -# 2157| m2157_47(unknown) = ^CallSideEffect : ~m2159_5 -# 2157| m2157_48(unknown) = Chi : total:m2159_5, partial:m2157_47 -# 2157| v2157_49(void) = ^IndirectReadSideEffect[-1] : &:r2157_44, m2157_34 -# 2157| m2157_50(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_44 -# 2157| m2157_51(iterator) = Chi : total:m2157_34, partial:m2157_50 -# 2157| r2157_52(glval) = CopyValue : r2157_46 -#-----| Goto (back edge) -> Block 11 - -# 2157| Block 13 -# 2157| r2157_53(glval) = VariableAddress[y] : -# 2157| r2157_54(glval) = VariableAddress[(__begin)] : -#-----| r0_19(glval) = Convert : r2157_54 -# 2157| r2157_55(glval) = FunctionAddress[operator*] : -# 2157| r2157_56(ClassWithDestructor &) = Call[operator*] : func:r2157_55, this:r0_19 -# 2157| m2157_57(unknown) = ^CallSideEffect : ~m2157_42 -# 2157| m2157_58(unknown) = Chi : total:m2157_42, partial:m2157_57 +# 2157| r2157_44(glval) = VariableAddress[y] : +# 2157| r2157_45(glval) = VariableAddress[(__begin)] : +#-----| r0_19(glval) = Convert : r2157_45 +# 2157| r2157_46(glval) = FunctionAddress[operator*] : +# 2157| r2157_47(ClassWithDestructor &) = Call[operator*] : func:r2157_46, this:r0_19 +# 2157| m2157_48(unknown) = ^CallSideEffect : ~m2157_42 +# 2157| m2157_49(unknown) = Chi : total:m2157_42, partial:m2157_48 #-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, m2157_34 -# 2157| r2157_59(ClassWithDestructor) = Load[?] : &:r2157_56, ~m2157_58 -# 2157| m2157_60(ClassWithDestructor) = Store[y] : &:r2157_53, r2157_59 +# 2157| r2157_50(ClassWithDestructor) = Load[?] : &:r2157_47, ~m2157_49 +# 2157| m2157_51(ClassWithDestructor) = Store[y] : &:r2157_44, r2157_50 # 2158| r2158_1(glval) = VariableAddress[y] : # 2158| r2158_2(glval) = FunctionAddress[set_x] : # 2158| r2158_3(char) = Constant[97] : # 2158| v2158_4(void) = Call[set_x] : func:r2158_2, this:r2158_1, 0:r2158_3 -# 2158| m2158_5(unknown) = ^CallSideEffect : ~m2157_58 -# 2158| m2158_6(unknown) = Chi : total:m2157_58, partial:m2158_5 -# 2158| v2158_7(void) = ^IndirectReadSideEffect[-1] : &:r2158_1, m2157_60 +# 2158| m2158_5(unknown) = ^CallSideEffect : ~m2157_49 +# 2158| m2158_6(unknown) = Chi : total:m2157_49, partial:m2158_5 +# 2158| v2158_7(void) = ^IndirectReadSideEffect[-1] : &:r2158_1, m2157_51 # 2158| m2158_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2158_1 -# 2158| m2158_9(ClassWithDestructor) = Chi : total:m2157_60, partial:m2158_8 +# 2158| m2158_9(ClassWithDestructor) = Chi : total:m2157_51, partial:m2158_8 # 2159| r2159_1(glval) = VariableAddress[y] : # 2159| r2159_2(glval) = FunctionAddress[get_x] : # 2159| r2159_3(char) = Call[get_x] : func:r2159_2, this:r2159_1 @@ -12927,13 +13067,57 @@ ir.cpp: # 2159| r2159_10(int) = Constant[98] : # 2159| r2159_11(bool) = CompareEQ : r2159_9, r2159_10 # 2159| v2159_12(void) = ConditionalBranch : r2159_11 -#-----| False -> Block 12 -#-----| True -> Block 14 +#-----| False -> Block 14 +#-----| True -> Block 13 -# 2160| Block 14 -# 2160| v2160_1(void) = NoOp : +# 2160| Block 13 +# 2160| v2160_1(void) = NoOp : +# 2157| r2157_52(glval) = VariableAddress[y] : +# 2157| r2157_53(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_54(void) = Call[~ClassWithDestructor] : func:r2157_53, this:r2157_52 +# 2157| m2157_55(unknown) = ^CallSideEffect : ~m2159_5 +# 2157| m2157_56(unknown) = Chi : total:m2159_5, partial:m2157_55 +# 2157| v2157_57(void) = ^IndirectReadSideEffect[-1] : &:r2157_52, m2159_8 +# 2157| m2157_58(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_52 +# 2157| m2157_59(ClassWithDestructor) = Chi : total:m2159_8, partial:m2157_58 +# 2157| r2157_60(glval>) = VariableAddress[ys] : +# 2157| r2157_61(glval) = FunctionAddress[~vector] : +# 2157| v2157_62(void) = Call[~vector] : func:r2157_61, this:r2157_60 +# 2157| m2157_63(unknown) = ^CallSideEffect : ~m2157_56 +# 2157| m2157_64(unknown) = Chi : total:m2157_56, partial:m2157_63 +# 2157| v2157_65(void) = ^IndirectReadSideEffect[-1] : &:r2157_60, m2157_13 +# 2157| m2157_66(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_60 +# 2157| m2157_67(vector) = Chi : total:m2157_13, partial:m2157_66 +# 2172| r2172_1(glval) = VariableAddress[x] : +# 2172| r2172_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_3(void) = Call[~ClassWithDestructor] : func:r2172_2, this:r2172_1 +# 2172| m2172_4(unknown) = ^CallSideEffect : ~m2157_64 +# 2172| m2172_5(unknown) = Chi : total:m2157_64, partial:m2172_4 +# 2172| v2172_6(void) = ^IndirectReadSideEffect[-1] : &:r2172_1, m2153_8 +# 2172| m2172_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_1 +# 2172| m2172_8(ClassWithDestructor) = Chi : total:m2153_8, partial:m2172_7 #-----| Goto -> Block 1 +# 2157| Block 14 +# 2157| r2157_68(glval) = VariableAddress[y] : +# 2157| r2157_69(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_70(void) = Call[~ClassWithDestructor] : func:r2157_69, this:r2157_68 +# 2157| m2157_71(unknown) = ^CallSideEffect : ~m2159_5 +# 2157| m2157_72(unknown) = Chi : total:m2159_5, partial:m2157_71 +# 2157| v2157_73(void) = ^IndirectReadSideEffect[-1] : &:r2157_68, m2159_8 +# 2157| m2157_74(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_68 +# 2157| m2157_75(ClassWithDestructor) = Chi : total:m2159_8, partial:m2157_74 +# 2157| r2157_76(glval) = VariableAddress[(__begin)] : +# 2157| r2157_77(glval) = FunctionAddress[operator++] : +# 2157| r2157_78(iterator &) = Call[operator++] : func:r2157_77, this:r2157_76 +# 2157| m2157_79(unknown) = ^CallSideEffect : ~m2157_72 +# 2157| m2157_80(unknown) = Chi : total:m2157_72, partial:m2157_79 +# 2157| v2157_81(void) = ^IndirectReadSideEffect[-1] : &:r2157_76, m2157_34 +# 2157| m2157_82(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_76 +# 2157| m2157_83(iterator) = Chi : total:m2157_34, partial:m2157_82 +# 2157| r2157_84(glval) = CopyValue : r2157_78 +#-----| Goto (back edge) -> Block 11 + # 2163| Block 15 # 2163| r2163_1(glval>) = VariableAddress[ys] : # 2163| m2163_2(vector) = Uninitialized[ys] : &:r2163_1 @@ -13020,16 +13204,1395 @@ ir.cpp: #-----| True -> Block 19 # 2165| Block 19 -# 2165| v2165_1(void) = NoOp : +# 2165| v2165_1(void) = NoOp : +# 2163| r2163_57(glval>) = VariableAddress[ys] : +# 2163| r2163_58(glval) = FunctionAddress[~vector] : +# 2163| v2163_59(void) = Call[~vector] : func:r2163_58, this:r2163_57 +# 2163| m2163_60(unknown) = ^CallSideEffect : ~m2163_54 +# 2163| m2163_61(unknown) = Chi : total:m2163_54, partial:m2163_60 +# 2163| v2163_62(void) = ^IndirectReadSideEffect[-1] : &:r2163_57, m2163_9 +# 2163| m2163_63(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_57 +# 2163| m2163_64(vector) = Chi : total:m2163_9, partial:m2163_63 +# 2172| r2172_9(glval) = VariableAddress[x] : +# 2172| r2172_10(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_11(void) = Call[~ClassWithDestructor] : func:r2172_10, this:r2172_9 +# 2172| m2172_12(unknown) = ^CallSideEffect : ~m2163_61 +# 2172| m2172_13(unknown) = Chi : total:m2163_61, partial:m2172_12 +# 2172| v2172_14(void) = ^IndirectReadSideEffect[-1] : &:r2172_9, m2153_8 +# 2172| m2172_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_9 +# 2172| m2172_16(ClassWithDestructor) = Chi : total:m2153_8, partial:m2172_15 #-----| Goto -> Block 1 -# 2167| Block 20 -# 2167| v2167_1(void) = NoOp : +# 2168| Block 20 +# 2168| r2168_1(glval>) = VariableAddress[ys] : +# 2168| m2168_2(vector) = Uninitialized[ys] : &:r2168_1 +# 2168| r2168_3(glval) = FunctionAddress[vector] : +# 2168| r2168_4(glval) = VariableAddress[#temp2168:40] : +# 2168| r2168_5(glval) = VariableAddress[x] : +# 2168| r2168_6(ClassWithDestructor) = Load[x] : &:r2168_5, m2153_8 +# 2168| m2168_7(ClassWithDestructor) = Store[#temp2168:40] : &:r2168_4, r2168_6 +# 2168| r2168_8(ClassWithDestructor) = Load[#temp2168:40] : &:r2168_4, m2168_7 +# 2168| v2168_9(void) = Call[vector] : func:r2168_3, this:r2168_1, 0:r2168_8 +# 2168| m2168_10(unknown) = ^CallSideEffect : ~m2163_38 +# 2168| m2168_11(unknown) = Chi : total:m2163_38, partial:m2168_10 +# 2168| m2168_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2168_1 +# 2168| m2168_13(vector) = Chi : total:m2168_2, partial:m2168_12 +# 2168| r2168_14(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_15(glval>) = VariableAddress[ys] : +# 2168| r2168_16(vector &) = CopyValue : r2168_15 +# 2168| m2168_17(vector &) = Store[(__range)] : &:r2168_14, r2168_16 +# 2168| r2168_18(glval) = VariableAddress[(__begin)] : +# 2168| r2168_19(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_20(vector &) = Load[(__range)] : &:r2168_19, m2168_17 +#-----| r0_31(glval>) = CopyValue : r2168_20 +#-----| r0_32(glval>) = Convert : r0_31 +# 2168| r2168_21(glval) = FunctionAddress[begin] : +# 2168| r2168_22(iterator) = Call[begin] : func:r2168_21, this:r0_32 +# 2168| m2168_23(unknown) = ^CallSideEffect : ~m2168_11 +# 2168| m2168_24(unknown) = Chi : total:m2168_11, partial:m2168_23 +#-----| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_32, m2168_13 +# 2168| m2168_25(iterator) = Store[(__begin)] : &:r2168_18, r2168_22 +# 2168| r2168_26(glval) = VariableAddress[(__end)] : +# 2168| r2168_27(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_28(vector &) = Load[(__range)] : &:r2168_27, m2168_17 +#-----| r0_34(glval>) = CopyValue : r2168_28 +#-----| r0_35(glval>) = Convert : r0_34 +# 2168| r2168_29(glval) = FunctionAddress[end] : +# 2168| r2168_30(iterator) = Call[end] : func:r2168_29, this:r0_35 +# 2168| m2168_31(unknown) = ^CallSideEffect : ~m2168_24 +# 2168| m2168_32(unknown) = Chi : total:m2168_24, partial:m2168_31 +#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, m2168_13 +# 2168| m2168_33(iterator) = Store[(__end)] : &:r2168_26, r2168_30 +#-----| Goto -> Block 21 + +# 2168| Block 21 +# 2168| m2168_34(iterator) = Phi : from 20:m2168_25, from 22:m2168_67 +# 2168| m2168_35(unknown) = Phi : from 20:~m2168_32, from 22:~m2168_64 +# 2168| r2168_36(glval) = VariableAddress[(__begin)] : +#-----| r0_37(glval) = Convert : r2168_36 +# 2168| r2168_37(glval) = FunctionAddress[operator!=] : +# 2168| r2168_38(glval) = VariableAddress[(__end)] : +# 2168| r2168_39(iterator) = Load[(__end)] : &:r2168_38, m2168_33 +# 2168| r2168_40(bool) = Call[operator!=] : func:r2168_37, this:r0_37, 0:r2168_39 +# 2168| m2168_41(unknown) = ^CallSideEffect : ~m2168_35 +# 2168| m2168_42(unknown) = Chi : total:m2168_35, partial:m2168_41 +#-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, m2168_34 +# 2168| v2168_43(void) = ConditionalBranch : r2168_40 +#-----| False -> Block 23 +#-----| True -> Block 22 + +# 2168| Block 22 +# 2168| r2168_44(glval) = VariableAddress[y] : +# 2168| r2168_45(glval) = VariableAddress[(__begin)] : +#-----| r0_39(glval) = Convert : r2168_45 +# 2168| r2168_46(glval) = FunctionAddress[operator*] : +# 2168| r2168_47(ClassWithDestructor &) = Call[operator*] : func:r2168_46, this:r0_39 +# 2168| m2168_48(unknown) = ^CallSideEffect : ~m2168_42 +# 2168| m2168_49(unknown) = Chi : total:m2168_42, partial:m2168_48 +#-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, m2168_34 +# 2168| r2168_50(ClassWithDestructor) = Load[?] : &:r2168_47, ~m2168_49 +# 2168| m2168_51(ClassWithDestructor) = Store[y] : &:r2168_44, r2168_50 +# 2169| r2169_1(glval) = VariableAddress[z1] : +# 2169| m2169_2(ClassWithDestructor) = Uninitialized[z1] : &:r2169_1 +# 2169| r2169_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2169| v2169_4(void) = Call[ClassWithDestructor] : func:r2169_3, this:r2169_1 +# 2169| m2169_5(unknown) = ^CallSideEffect : ~m2168_49 +# 2169| m2169_6(unknown) = Chi : total:m2168_49, partial:m2169_5 +# 2169| m2169_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2169_1 +# 2169| m2169_8(ClassWithDestructor) = Chi : total:m2169_2, partial:m2169_7 +# 2170| r2170_1(glval) = VariableAddress[z2] : +# 2170| m2170_2(ClassWithDestructor) = Uninitialized[z2] : &:r2170_1 +# 2170| r2170_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2170| v2170_4(void) = Call[ClassWithDestructor] : func:r2170_3, this:r2170_1 +# 2170| m2170_5(unknown) = ^CallSideEffect : ~m2169_6 +# 2170| m2170_6(unknown) = Chi : total:m2169_6, partial:m2170_5 +# 2170| m2170_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2170_1 +# 2170| m2170_8(ClassWithDestructor) = Chi : total:m2170_2, partial:m2170_7 +# 2171| r2171_1(glval) = VariableAddress[z2] : +# 2171| r2171_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2171| v2171_3(void) = Call[~ClassWithDestructor] : func:r2171_2, this:r2171_1 +# 2171| m2171_4(unknown) = ^CallSideEffect : ~m2170_6 +# 2171| m2171_5(unknown) = Chi : total:m2170_6, partial:m2171_4 +# 2171| v2171_6(void) = ^IndirectReadSideEffect[-1] : &:r2171_1, m2170_8 +# 2171| m2171_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2171_1 +# 2171| m2171_8(ClassWithDestructor) = Chi : total:m2170_8, partial:m2171_7 +# 2171| r2171_9(glval) = VariableAddress[z1] : +# 2171| r2171_10(glval) = FunctionAddress[~ClassWithDestructor] : +# 2171| v2171_11(void) = Call[~ClassWithDestructor] : func:r2171_10, this:r2171_9 +# 2171| m2171_12(unknown) = ^CallSideEffect : ~m2171_5 +# 2171| m2171_13(unknown) = Chi : total:m2171_5, partial:m2171_12 +# 2171| v2171_14(void) = ^IndirectReadSideEffect[-1] : &:r2171_9, m2169_8 +# 2171| m2171_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2171_9 +# 2171| m2171_16(ClassWithDestructor) = Chi : total:m2169_8, partial:m2171_15 +# 2168| r2168_52(glval) = VariableAddress[y] : +# 2168| r2168_53(glval) = FunctionAddress[~ClassWithDestructor] : +# 2168| v2168_54(void) = Call[~ClassWithDestructor] : func:r2168_53, this:r2168_52 +# 2168| m2168_55(unknown) = ^CallSideEffect : ~m2171_13 +# 2168| m2168_56(unknown) = Chi : total:m2171_13, partial:m2168_55 +# 2168| v2168_57(void) = ^IndirectReadSideEffect[-1] : &:r2168_52, m2168_51 +# 2168| m2168_58(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2168_52 +# 2168| m2168_59(ClassWithDestructor) = Chi : total:m2168_51, partial:m2168_58 +# 2168| r2168_60(glval) = VariableAddress[(__begin)] : +# 2168| r2168_61(glval) = FunctionAddress[operator++] : +# 2168| r2168_62(iterator &) = Call[operator++] : func:r2168_61, this:r2168_60 +# 2168| m2168_63(unknown) = ^CallSideEffect : ~m2168_56 +# 2168| m2168_64(unknown) = Chi : total:m2168_56, partial:m2168_63 +# 2168| v2168_65(void) = ^IndirectReadSideEffect[-1] : &:r2168_60, m2168_34 +# 2168| m2168_66(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_60 +# 2168| m2168_67(iterator) = Chi : total:m2168_34, partial:m2168_66 +# 2168| r2168_68(glval) = CopyValue : r2168_62 +#-----| Goto (back edge) -> Block 21 + +# 2172| Block 23 +# 2172| v2172_17(void) = NoOp : +# 2172| r2172_18(glval) = VariableAddress[x] : +# 2172| r2172_19(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_20(void) = Call[~ClassWithDestructor] : func:r2172_19, this:r2172_18 +# 2172| m2172_21(unknown) = ^CallSideEffect : ~m2168_42 +# 2172| m2172_22(unknown) = Chi : total:m2168_42, partial:m2172_21 +# 2172| v2172_23(void) = ^IndirectReadSideEffect[-1] : &:r2172_18, m2153_8 +# 2172| m2172_24(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_18 +# 2172| m2172_25(ClassWithDestructor) = Chi : total:m2153_8, partial:m2172_24 #-----| Goto -> Block 1 -# 2137| Block 21 +# 2137| Block 24 # 2137| v2137_13(void) = Unreached : +# 2174| void static_variable_with_destructor_1() +# 2174| Block 0 +# 2174| v2174_1(void) = EnterFunction : +# 2174| m2174_2(unknown) = AliasedDefinition : +# 2174| m2174_3(unknown) = InitializeNonLocal : +# 2174| m2174_4(unknown) = Chi : total:m2174_2, partial:m2174_3 +# 2175| r2175_1(glval) = VariableAddress[a] : +# 2175| m2175_2(ClassWithDestructor) = Uninitialized[a] : &:r2175_1 +# 2175| r2175_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2175| v2175_4(void) = Call[ClassWithDestructor] : func:r2175_3, this:r2175_1 +# 2175| m2175_5(unknown) = ^CallSideEffect : ~m2174_4 +# 2175| m2175_6(unknown) = Chi : total:m2174_4, partial:m2175_5 +# 2175| m2175_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2175_1 +# 2175| m2175_8(ClassWithDestructor) = Chi : total:m2175_2, partial:m2175_7 +# 2176| r2176_1(glval) = VariableAddress[b#init] : +# 2176| r2176_2(bool) = Load[b#init] : &:r2176_1, ~m2175_6 +# 2176| v2176_3(void) = ConditionalBranch : r2176_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 2176| Block 1 +# 2176| r2176_4(glval) = VariableAddress[b] : +#-----| r0_1(glval) = FunctionAddress[ClassWithDestructor] : +#-----| v0_2(void) = Call[ClassWithDestructor] : func:r0_1, this:r2176_4 +#-----| m0_3(unknown) = ^CallSideEffect : ~m2175_6 +#-----| m0_4(unknown) = Chi : total:m2175_6, partial:m0_3 +#-----| m0_5(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2176_4 +#-----| m0_6(unknown) = Chi : total:m0_4, partial:m0_5 +# 2176| r2176_5(bool) = Constant[1] : +# 2176| m2176_6(bool) = Store[b#init] : &:r2176_1, r2176_5 +# 2176| m2176_7(unknown) = Chi : total:m0_6, partial:m2176_6 +#-----| Goto -> Block 2 + +# 2177| Block 2 +# 2177| m2177_1(unknown) = Phi : from 0:~m2175_6, from 1:~m2176_7 +# 2177| v2177_2(void) = NoOp : +# 2177| r2177_3(glval) = VariableAddress[a] : +# 2177| r2177_4(glval) = FunctionAddress[~ClassWithDestructor] : +# 2177| v2177_5(void) = Call[~ClassWithDestructor] : func:r2177_4, this:r2177_3 +# 2177| m2177_6(unknown) = ^CallSideEffect : ~m2177_1 +# 2177| m2177_7(unknown) = Chi : total:m2177_1, partial:m2177_6 +# 2177| v2177_8(void) = ^IndirectReadSideEffect[-1] : &:r2177_3, m2175_8 +# 2177| m2177_9(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2177_3 +# 2177| m2177_10(ClassWithDestructor) = Chi : total:m2175_8, partial:m2177_9 +# 2174| v2174_5(void) = ReturnVoid : +# 2174| v2174_6(void) = AliasedUse : ~m2177_7 +# 2174| v2174_7(void) = ExitFunction : + +# 2179| void static_variable_with_destructor_2() +# 2179| Block 0 +# 2179| v2179_1(void) = EnterFunction : +# 2179| m2179_2(unknown) = AliasedDefinition : +# 2179| m2179_3(unknown) = InitializeNonLocal : +# 2179| m2179_4(unknown) = Chi : total:m2179_2, partial:m2179_3 +# 2180| r2180_1(glval) = VariableAddress[a#init] : +# 2180| r2180_2(bool) = Load[a#init] : &:r2180_1, ~m2179_3 +# 2180| v2180_3(void) = ConditionalBranch : r2180_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 2180| Block 1 +# 2180| r2180_4(glval) = VariableAddress[a] : +#-----| r0_1(glval) = FunctionAddress[ClassWithDestructor] : +#-----| v0_2(void) = Call[ClassWithDestructor] : func:r0_1, this:r2180_4 +#-----| m0_3(unknown) = ^CallSideEffect : ~m2179_4 +#-----| m0_4(unknown) = Chi : total:m2179_4, partial:m0_3 +#-----| m0_5(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2180_4 +#-----| m0_6(unknown) = Chi : total:m0_4, partial:m0_5 +# 2180| r2180_5(bool) = Constant[1] : +# 2180| m2180_6(bool) = Store[a#init] : &:r2180_1, r2180_5 +# 2180| m2180_7(unknown) = Chi : total:m0_6, partial:m2180_6 +#-----| Goto -> Block 2 + +# 2181| Block 2 +# 2181| m2181_1(unknown) = Phi : from 0:~m2179_4, from 1:~m2180_7 +# 2181| r2181_2(glval) = VariableAddress[b] : +# 2181| m2181_3(ClassWithDestructor) = Uninitialized[b] : &:r2181_2 +# 2181| r2181_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2181| v2181_5(void) = Call[ClassWithDestructor] : func:r2181_4, this:r2181_2 +# 2181| m2181_6(unknown) = ^CallSideEffect : ~m2181_1 +# 2181| m2181_7(unknown) = Chi : total:m2181_1, partial:m2181_6 +# 2181| m2181_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2181_2 +# 2181| m2181_9(ClassWithDestructor) = Chi : total:m2181_3, partial:m2181_8 +# 2182| v2182_1(void) = NoOp : +# 2182| r2182_2(glval) = VariableAddress[b] : +# 2182| r2182_3(glval) = FunctionAddress[~ClassWithDestructor] : +# 2182| v2182_4(void) = Call[~ClassWithDestructor] : func:r2182_3, this:r2182_2 +# 2182| m2182_5(unknown) = ^CallSideEffect : ~m2181_7 +# 2182| m2182_6(unknown) = Chi : total:m2181_7, partial:m2182_5 +# 2182| v2182_7(void) = ^IndirectReadSideEffect[-1] : &:r2182_2, m2181_9 +# 2182| m2182_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2182_2 +# 2182| m2182_9(ClassWithDestructor) = Chi : total:m2181_9, partial:m2182_8 +# 2179| v2179_5(void) = ReturnVoid : +# 2179| v2179_6(void) = AliasedUse : ~m2182_6 +# 2179| v2179_7(void) = ExitFunction : + +# 2184| void static_variable_with_destructor_3() +# 2184| Block 0 +# 2184| v2184_1(void) = EnterFunction : +# 2184| m2184_2(unknown) = AliasedDefinition : +# 2184| m2184_3(unknown) = InitializeNonLocal : +# 2184| m2184_4(unknown) = Chi : total:m2184_2, partial:m2184_3 +# 2185| r2185_1(glval) = VariableAddress[a] : +# 2185| m2185_2(ClassWithDestructor) = Uninitialized[a] : &:r2185_1 +# 2185| r2185_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2185| v2185_4(void) = Call[ClassWithDestructor] : func:r2185_3, this:r2185_1 +# 2185| m2185_5(unknown) = ^CallSideEffect : ~m2184_4 +# 2185| m2185_6(unknown) = Chi : total:m2184_4, partial:m2185_5 +# 2185| m2185_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2185_1 +# 2185| m2185_8(ClassWithDestructor) = Chi : total:m2185_2, partial:m2185_7 +# 2186| r2186_1(glval) = VariableAddress[b] : +# 2186| m2186_2(ClassWithDestructor) = Uninitialized[b] : &:r2186_1 +# 2186| r2186_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2186| v2186_4(void) = Call[ClassWithDestructor] : func:r2186_3, this:r2186_1 +# 2186| m2186_5(unknown) = ^CallSideEffect : ~m2185_6 +# 2186| m2186_6(unknown) = Chi : total:m2185_6, partial:m2186_5 +# 2186| m2186_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2186_1 +# 2186| m2186_8(ClassWithDestructor) = Chi : total:m2186_2, partial:m2186_7 +# 2187| r2187_1(glval) = VariableAddress[c#init] : +# 2187| r2187_2(bool) = Load[c#init] : &:r2187_1, ~m2186_6 +# 2187| v2187_3(void) = ConditionalBranch : r2187_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 2187| Block 1 +# 2187| r2187_4(glval) = VariableAddress[c] : +#-----| r0_1(glval) = FunctionAddress[ClassWithDestructor] : +#-----| v0_2(void) = Call[ClassWithDestructor] : func:r0_1, this:r2187_4 +#-----| m0_3(unknown) = ^CallSideEffect : ~m2186_6 +#-----| m0_4(unknown) = Chi : total:m2186_6, partial:m0_3 +#-----| m0_5(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2187_4 +#-----| m0_6(unknown) = Chi : total:m0_4, partial:m0_5 +# 2187| r2187_5(bool) = Constant[1] : +# 2187| m2187_6(bool) = Store[c#init] : &:r2187_1, r2187_5 +# 2187| m2187_7(unknown) = Chi : total:m0_6, partial:m2187_6 +#-----| Goto -> Block 2 + +# 2188| Block 2 +# 2188| m2188_1(unknown) = Phi : from 0:~m2186_6, from 1:~m2187_7 +# 2188| v2188_2(void) = NoOp : +# 2188| r2188_3(glval) = VariableAddress[b] : +# 2188| r2188_4(glval) = FunctionAddress[~ClassWithDestructor] : +# 2188| v2188_5(void) = Call[~ClassWithDestructor] : func:r2188_4, this:r2188_3 +# 2188| m2188_6(unknown) = ^CallSideEffect : ~m2188_1 +# 2188| m2188_7(unknown) = Chi : total:m2188_1, partial:m2188_6 +# 2188| v2188_8(void) = ^IndirectReadSideEffect[-1] : &:r2188_3, m2186_8 +# 2188| m2188_9(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_3 +# 2188| m2188_10(ClassWithDestructor) = Chi : total:m2186_8, partial:m2188_9 +# 2188| r2188_11(glval) = VariableAddress[a] : +# 2188| r2188_12(glval) = FunctionAddress[~ClassWithDestructor] : +# 2188| v2188_13(void) = Call[~ClassWithDestructor] : func:r2188_12, this:r2188_11 +# 2188| m2188_14(unknown) = ^CallSideEffect : ~m2188_7 +# 2188| m2188_15(unknown) = Chi : total:m2188_7, partial:m2188_14 +# 2188| v2188_16(void) = ^IndirectReadSideEffect[-1] : &:r2188_11, m2185_8 +# 2188| m2188_17(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_11 +# 2188| m2188_18(ClassWithDestructor) = Chi : total:m2185_8, partial:m2188_17 +# 2184| v2184_5(void) = ReturnVoid : +# 2184| v2184_6(void) = AliasedUse : ~m2188_15 +# 2184| v2184_7(void) = ExitFunction : + +# 2190| ClassWithDestructor global_class_with_destructor +# 2190| Block 0 +# 2190| v2190_1(void) = EnterFunction : +# 2190| m2190_2(unknown) = AliasedDefinition : +# 2190| r2190_3(glval) = VariableAddress[global_class_with_destructor] : +# 2190| r2190_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2190| v2190_5(void) = Call[ClassWithDestructor] : func:r2190_4, this:r2190_3 +# 2190| m2190_6(unknown) = ^CallSideEffect : ~m2190_2 +# 2190| m2190_7(unknown) = Chi : total:m2190_2, partial:m2190_6 +# 2190| m2190_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2190_3 +# 2190| m2190_9(unknown) = Chi : total:m2190_7, partial:m2190_8 +# 2190| v2190_10(void) = ReturnVoid : +# 2190| v2190_11(void) = AliasedUse : ~m2190_9 +# 2190| v2190_12(void) = ExitFunction : + +# 2194| ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| m2194_2(unknown) = AliasedDefinition : +# 2194| m2194_3(unknown) = InitializeNonLocal : +# 2194| m2194_4(unknown) = Chi : total:m2194_2, partial:m2194_3 +# 2194| r2194_5(glval) = VariableAddress[t] : +# 2194| m2194_6(ClassWithDestructor &) = InitializeParameter[t] : &:r2194_5 +# 2194| r2194_7(ClassWithDestructor &) = Load[t] : &:r2194_5, m2194_6 +# 2194| m2194_8(unknown) = InitializeIndirection[t] : &:r2194_7 +# 2194| r2194_9(glval) = VariableAddress[#return] : +# 2194| r2194_10(glval) = VariableAddress[t] : +# 2194| r2194_11(ClassWithDestructor &) = Load[t] : &:r2194_10, m2194_6 +# 2194| r2194_12(glval) = CopyValue : r2194_11 +# 2194| r2194_13(ClassWithDestructor &) = CopyValue : r2194_12 +# 2194| m2194_14(ClassWithDestructor &) = Store[#return] : &:r2194_9, r2194_13 +# 2194| v2194_15(void) = ReturnIndirection[t] : &:r2194_7, m2194_8 +# 2194| r2194_16(glval) = VariableAddress[#return] : +# 2194| v2194_17(void) = ReturnValue : &:r2194_16, m2194_14 +# 2194| v2194_18(void) = AliasedUse : m2194_3 +# 2194| v2194_19(void) = ExitFunction : + +# 2194| int& vacuous_destructor_call::get(int&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| m2194_2(unknown) = AliasedDefinition : +# 2194| m2194_3(unknown) = InitializeNonLocal : +# 2194| m2194_4(unknown) = Chi : total:m2194_2, partial:m2194_3 +# 2194| r2194_5(glval) = VariableAddress[t] : +# 2194| m2194_6(int &) = InitializeParameter[t] : &:r2194_5 +# 2194| r2194_7(int &) = Load[t] : &:r2194_5, m2194_6 +# 2194| m2194_8(unknown) = InitializeIndirection[t] : &:r2194_7 +# 2194| r2194_9(glval) = VariableAddress[#return] : +# 2194| r2194_10(glval) = VariableAddress[t] : +# 2194| r2194_11(int &) = Load[t] : &:r2194_10, m2194_6 +# 2194| r2194_12(glval) = CopyValue : r2194_11 +# 2194| r2194_13(int &) = CopyValue : r2194_12 +# 2194| m2194_14(int &) = Store[#return] : &:r2194_9, r2194_13 +# 2194| v2194_15(void) = ReturnIndirection[t] : &:r2194_7, m2194_8 +# 2194| r2194_16(glval) = VariableAddress[#return] : +# 2194| v2194_17(void) = ReturnValue : &:r2194_16, m2194_14 +# 2194| v2194_18(void) = AliasedUse : m2194_3 +# 2194| v2194_19(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(ClassWithDestructor&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| m2197_2(unknown) = AliasedDefinition : +# 2197| m2197_3(unknown) = InitializeNonLocal : +# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3 +# 2197| r2197_5(glval) = VariableAddress[t] : +# 2197| m2197_6(ClassWithDestructor &) = InitializeParameter[t] : &:r2197_5 +# 2197| r2197_7(ClassWithDestructor &) = Load[t] : &:r2197_5, m2197_6 +# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(ClassWithDestructor &) = Load[t] : &:r2198_2, m2197_6 +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(ClassWithDestructor &) = CopyValue : r2198_4 +# 2198| r2198_6(ClassWithDestructor &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| m2198_7(unknown) = ^CallSideEffect : ~m2197_4 +# 2198| m2198_8(unknown) = Chi : total:m2197_4, partial:m2198_7 +# 2198| v2198_9(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m2197_8 +# 2198| m2198_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| m2198_11(unknown) = Chi : total:m2197_8, partial:m2198_10 +# 2198| r2198_12(glval) = CopyValue : r2198_6 +# 2198| r2198_13(glval) = FunctionAddress[~ClassWithDestructor] : +# 2198| v2198_14(void) = Call[~ClassWithDestructor] : func:r2198_13 +# 2198| m2198_15(unknown) = ^CallSideEffect : ~m2198_8 +# 2198| m2198_16(unknown) = Chi : total:m2198_8, partial:m2198_15 +# 2198| v2198_17(void) = ^IndirectReadSideEffect[-1] : &:r2198_12, ~m2198_11 +# 2198| m2198_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2198_12 +# 2198| m2198_19(unknown) = Chi : total:m2198_11, partial:m2198_18 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_9(void) = ReturnIndirection[t] : &:r2197_7, m2198_19 +# 2197| v2197_10(void) = ReturnVoid : +# 2197| v2197_11(void) = AliasedUse : ~m2198_16 +# 2197| v2197_12(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(int&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| m2197_2(unknown) = AliasedDefinition : +# 2197| m2197_3(unknown) = InitializeNonLocal : +# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3 +# 2197| r2197_5(glval) = VariableAddress[t] : +# 2197| m2197_6(int &) = InitializeParameter[t] : &:r2197_5 +# 2197| r2197_7(int &) = Load[t] : &:r2197_5, m2197_6 +# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(int &) = Load[t] : &:r2198_2, m2197_6 +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(int &) = CopyValue : r2198_4 +# 2198| r2198_6(int &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| m2198_7(unknown) = ^CallSideEffect : ~m2197_4 +# 2198| m2198_8(unknown) = Chi : total:m2197_4, partial:m2198_7 +# 2198| v2198_9(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m2197_8 +# 2198| m2198_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| m2198_11(unknown) = Chi : total:m2197_8, partial:m2198_10 +# 2198| r2198_12(glval) = CopyValue : r2198_6 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_9(void) = ReturnIndirection[t] : &:r2197_7, m2198_11 +# 2197| v2197_10(void) = ReturnVoid : +# 2197| v2197_11(void) = AliasedUse : ~m2198_8 +# 2197| v2197_12(void) = ExitFunction : + +# 2201| void vacuous_destructor_call::non_vacuous_destructor_call() +# 2201| Block 0 +# 2201| v2201_1(void) = EnterFunction : +# 2201| m2201_2(unknown) = AliasedDefinition : +# 2201| m2201_3(unknown) = InitializeNonLocal : +# 2201| m2201_4(unknown) = Chi : total:m2201_2, partial:m2201_3 +# 2202| r2202_1(glval) = VariableAddress[c] : +# 2202| m2202_2(ClassWithDestructor) = Uninitialized[c] : &:r2202_1 +# 2202| r2202_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2202| v2202_4(void) = Call[ClassWithDestructor] : func:r2202_3, this:r2202_1 +# 2202| m2202_5(unknown) = ^CallSideEffect : ~m2201_4 +# 2202| m2202_6(unknown) = Chi : total:m2201_4, partial:m2202_5 +# 2202| m2202_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 +# 2202| m2202_8(ClassWithDestructor) = Chi : total:m2202_2, partial:m2202_7 +# 2203| r2203_1(glval) = FunctionAddress[call_destructor] : +# 2203| r2203_2(glval) = VariableAddress[c] : +# 2203| r2203_3(ClassWithDestructor &) = CopyValue : r2203_2 +# 2203| v2203_4(void) = Call[call_destructor] : func:r2203_1, 0:r2203_3 +# 2203| m2203_5(unknown) = ^CallSideEffect : ~m2202_6 +# 2203| m2203_6(unknown) = Chi : total:m2202_6, partial:m2203_5 +# 2203| v2203_7(void) = ^BufferReadSideEffect[0] : &:r2203_3, ~m2202_8 +# 2203| m2203_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r2203_3 +# 2203| m2203_9(ClassWithDestructor) = Chi : total:m2202_8, partial:m2203_8 +# 2204| v2204_1(void) = NoOp : +# 2204| r2204_2(glval) = VariableAddress[c] : +# 2204| r2204_3(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_4(void) = Call[~ClassWithDestructor] : func:r2204_3, this:r2204_2 +# 2204| m2204_5(unknown) = ^CallSideEffect : ~m2203_6 +# 2204| m2204_6(unknown) = Chi : total:m2203_6, partial:m2204_5 +# 2204| v2204_7(void) = ^IndirectReadSideEffect[-1] : &:r2204_2, m2203_9 +# 2204| m2204_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_2 +# 2204| m2204_9(ClassWithDestructor) = Chi : total:m2203_9, partial:m2204_8 +# 2201| v2201_5(void) = ReturnVoid : +# 2201| v2201_6(void) = AliasedUse : ~m2204_6 +# 2201| v2201_7(void) = ExitFunction : + +# 2206| void vacuous_destructor_call::vacuous_destructor_call() +# 2206| Block 0 +# 2206| v2206_1(void) = EnterFunction : +# 2206| m2206_2(unknown) = AliasedDefinition : +# 2206| m2206_3(unknown) = InitializeNonLocal : +# 2206| m2206_4(unknown) = Chi : total:m2206_2, partial:m2206_3 +# 2207| r2207_1(glval) = VariableAddress[i] : +# 2207| m2207_2(int) = Uninitialized[i] : &:r2207_1 +# 2208| r2208_1(glval) = FunctionAddress[call_destructor] : +# 2208| r2208_2(glval) = VariableAddress[i] : +# 2208| r2208_3(int &) = CopyValue : r2208_2 +# 2208| v2208_4(void) = Call[call_destructor] : func:r2208_1, 0:r2208_3 +# 2208| m2208_5(unknown) = ^CallSideEffect : ~m2206_4 +# 2208| m2208_6(unknown) = Chi : total:m2206_4, partial:m2208_5 +# 2208| v2208_7(void) = ^BufferReadSideEffect[0] : &:r2208_3, ~m2207_2 +# 2208| m2208_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r2208_3 +# 2208| m2208_9(int) = Chi : total:m2207_2, partial:m2208_8 +# 2209| v2209_1(void) = NoOp : +# 2206| v2206_5(void) = ReturnVoid : +# 2206| v2206_6(void) = AliasedUse : ~m2208_6 +# 2206| v2206_7(void) = ExitFunction : + +# 2212| void TryCatchDestructors(bool) +# 2212| Block 0 +# 2212| v2212_1(void) = EnterFunction : +# 2212| m2212_2(unknown) = AliasedDefinition : +# 2212| m2212_3(unknown) = InitializeNonLocal : +# 2212| m2212_4(unknown) = Chi : total:m2212_2, partial:m2212_3 +# 2212| r2212_5(glval) = VariableAddress[b] : +# 2212| m2212_6(bool) = InitializeParameter[b] : &:r2212_5 +# 2214| r2214_1(glval) = VariableAddress[s] : +# 2214| m2214_2(String) = Uninitialized[s] : &:r2214_1 +# 2214| r2214_3(glval) = FunctionAddress[String] : +# 2214| v2214_4(void) = Call[String] : func:r2214_3, this:r2214_1 +# 2214| m2214_5(unknown) = ^CallSideEffect : ~m2212_4 +# 2214| m2214_6(unknown) = Chi : total:m2212_4, partial:m2214_5 +# 2214| m2214_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2214_1 +# 2214| m2214_8(String) = Chi : total:m2214_2, partial:m2214_7 +# 2215| r2215_1(glval) = VariableAddress[b] : +# 2215| r2215_2(bool) = Load[b] : &:r2215_1, m2212_6 +# 2215| v2215_3(void) = ConditionalBranch : r2215_2 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 2212| Block 1 +# 2212| m2212_7(unknown) = Phi : from 2:~m2212_10, from 10:~m2228_1 +# 2212| v2212_8(void) = AliasedUse : ~m2212_7 +# 2212| v2212_9(void) = ExitFunction : + +# 2212| Block 2 +# 2212| m2212_10(unknown) = Phi : from 6:~m2221_8, from 9:~m2214_6 +# 2212| v2212_11(void) = Unwind : +#-----| Goto -> Block 1 + +# 2216| Block 3 +# 2216| r2216_1(glval) = VariableAddress[#throw2216:7] : +# 2216| r2216_2(glval) = StringConstant["string literal"] : +# 2216| r2216_3(char *) = Convert : r2216_2 +# 2216| m2216_4(char *) = Store[#throw2216:7] : &:r2216_1, r2216_3 +# 2216| v2216_5(void) = ThrowValue : &:r2216_1, m2216_4 +#-----| Exception -> Block 5 + +# 2218| Block 4 +# 2218| r2218_1(glval) = VariableAddress[s2] : +# 2218| m2218_2(String) = Uninitialized[s2] : &:r2218_1 +# 2218| r2218_3(glval) = FunctionAddress[String] : +# 2218| v2218_4(void) = Call[String] : func:r2218_3, this:r2218_1 +# 2218| m2218_5(unknown) = ^CallSideEffect : ~m2214_6 +# 2218| m2218_6(unknown) = Chi : total:m2214_6, partial:m2218_5 +# 2218| m2218_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2218_1 +# 2218| m2218_8(String) = Chi : total:m2218_2, partial:m2218_7 +# 2219| r2219_1(glval) = VariableAddress[s2] : +# 2219| r2219_2(glval) = FunctionAddress[~String] : +# 2219| v2219_3(void) = Call[~String] : func:r2219_2, this:r2219_1 +# 2219| m2219_4(unknown) = ^CallSideEffect : ~m2218_6 +# 2219| m2219_5(unknown) = Chi : total:m2218_6, partial:m2219_4 +# 2219| v2219_6(void) = ^IndirectReadSideEffect[-1] : &:r2219_1, m2218_8 +# 2219| m2219_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2219_1 +# 2219| m2219_8(String) = Chi : total:m2218_8, partial:m2219_7 +# 2219| r2219_9(glval) = VariableAddress[s] : +# 2219| r2219_10(glval) = FunctionAddress[~String] : +# 2219| v2219_11(void) = Call[~String] : func:r2219_10, this:r2219_9 +# 2219| m2219_12(unknown) = ^CallSideEffect : ~m2219_5 +# 2219| m2219_13(unknown) = Chi : total:m2219_5, partial:m2219_12 +# 2219| v2219_14(void) = ^IndirectReadSideEffect[-1] : &:r2219_9, m2214_8 +# 2219| m2219_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2219_9 +# 2219| m2219_16(String) = Chi : total:m2214_8, partial:m2219_15 +#-----| Goto -> Block 10 + +# 2220| Block 5 +# 2220| v2220_1(void) = CatchByType[const char *] : +#-----| Exception -> Block 7 +#-----| Goto -> Block 6 + +# 2220| Block 6 +# 2220| r2220_2(glval) = VariableAddress[s] : +# 2220| m2220_3(char *) = InitializeParameter[s] : &:r2220_2 +# 2220| r2220_4(char *) = Load[s] : &:r2220_2, m2220_3 +# 2220| m2220_5(unknown) = InitializeIndirection[s] : &:r2220_4 +# 2221| r2221_1(glval) = VariableAddress[#throw2221:5] : +# 2221| m2221_2(String) = Uninitialized[#throw2221:5] : &:r2221_1 +# 2221| r2221_3(glval) = FunctionAddress[String] : +# 2221| r2221_4(glval) = VariableAddress[s] : +# 2221| r2221_5(char *) = Load[s] : &:r2221_4, m2220_3 +# 2221| v2221_6(void) = Call[String] : func:r2221_3, this:r2221_1, 0:r2221_5 +# 2221| m2221_7(unknown) = ^CallSideEffect : ~m2214_6 +# 2221| m2221_8(unknown) = Chi : total:m2214_6, partial:m2221_7 +# 2221| v2221_9(void) = ^BufferReadSideEffect[0] : &:r2221_5, ~m2220_5 +# 2221| m2221_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2221_1 +# 2221| m2221_11(String) = Chi : total:m2221_2, partial:m2221_10 +# 2221| v2221_12(void) = ThrowValue : &:r2221_1, m2221_11 +#-----| Exception -> Block 2 + +# 2223| Block 7 +# 2223| v2223_1(void) = CatchByType[const String &] : +#-----| Exception -> Block 9 +#-----| Goto -> Block 8 + +# 2223| Block 8 +# 2223| r2223_2(glval) = VariableAddress[e] : +# 2223| m2223_3(String &) = InitializeParameter[e] : &:r2223_2 +# 2223| r2223_4(String &) = Load[e] : &:r2223_2, m2223_3 +# 2223| m2223_5(unknown) = InitializeIndirection[e] : &:r2223_4 +# 2223| v2223_6(void) = NoOp : +#-----| Goto -> Block 10 + +# 2225| Block 9 +# 2225| v2225_1(void) = CatchAny : +# 2226| v2226_1(void) = ReThrow : +#-----| Exception -> Block 2 + +# 2228| Block 10 +# 2228| m2228_1(unknown) = Phi : from 4:~m2219_13, from 8:~m2214_6 +# 2228| v2228_2(void) = NoOp : +# 2212| v2212_12(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 2230| void IfDestructors(bool) +# 2230| Block 0 +# 2230| v2230_1(void) = EnterFunction : +# 2230| m2230_2(unknown) = AliasedDefinition : +# 2230| m2230_3(unknown) = InitializeNonLocal : +# 2230| m2230_4(unknown) = Chi : total:m2230_2, partial:m2230_3 +# 2230| r2230_5(glval) = VariableAddress[b] : +# 2230| m2230_6(bool) = InitializeParameter[b] : &:r2230_5 +# 2231| r2231_1(glval) = VariableAddress[s1] : +# 2231| m2231_2(String) = Uninitialized[s1] : &:r2231_1 +# 2231| r2231_3(glval) = FunctionAddress[String] : +# 2231| v2231_4(void) = Call[String] : func:r2231_3, this:r2231_1 +# 2231| m2231_5(unknown) = ^CallSideEffect : ~m2230_4 +# 2231| m2231_6(unknown) = Chi : total:m2230_4, partial:m2231_5 +# 2231| m2231_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2231_1 +# 2231| m2231_8(String) = Chi : total:m2231_2, partial:m2231_7 +# 2232| r2232_1(glval) = VariableAddress[b] : +# 2232| r2232_2(bool) = Load[b] : &:r2232_1, m2230_6 +# 2232| v2232_3(void) = ConditionalBranch : r2232_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2233| Block 1 +# 2233| r2233_1(glval) = VariableAddress[s2] : +# 2233| m2233_2(String) = Uninitialized[s2] : &:r2233_1 +# 2233| r2233_3(glval) = FunctionAddress[String] : +# 2233| v2233_4(void) = Call[String] : func:r2233_3, this:r2233_1 +# 2233| m2233_5(unknown) = ^CallSideEffect : ~m2231_6 +# 2233| m2233_6(unknown) = Chi : total:m2231_6, partial:m2233_5 +# 2233| m2233_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2233_1 +# 2233| m2233_8(String) = Chi : total:m2233_2, partial:m2233_7 +# 2234| r2234_1(glval) = VariableAddress[s2] : +# 2234| r2234_2(glval) = FunctionAddress[~String] : +# 2234| v2234_3(void) = Call[~String] : func:r2234_2, this:r2234_1 +# 2234| m2234_4(unknown) = ^CallSideEffect : ~m2233_6 +# 2234| m2234_5(unknown) = Chi : total:m2233_6, partial:m2234_4 +# 2234| v2234_6(void) = ^IndirectReadSideEffect[-1] : &:r2234_1, m2233_8 +# 2234| m2234_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2234_1 +# 2234| m2234_8(String) = Chi : total:m2233_8, partial:m2234_7 +#-----| Goto -> Block 3 + +# 2235| Block 2 +# 2235| r2235_1(glval) = VariableAddress[s3] : +# 2235| m2235_2(String) = Uninitialized[s3] : &:r2235_1 +# 2235| r2235_3(glval) = FunctionAddress[String] : +# 2235| v2235_4(void) = Call[String] : func:r2235_3, this:r2235_1 +# 2235| m2235_5(unknown) = ^CallSideEffect : ~m2231_6 +# 2235| m2235_6(unknown) = Chi : total:m2231_6, partial:m2235_5 +# 2235| m2235_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2235_1 +# 2235| m2235_8(String) = Chi : total:m2235_2, partial:m2235_7 +# 2236| r2236_1(glval) = VariableAddress[s3] : +# 2236| r2236_2(glval) = FunctionAddress[~String] : +# 2236| v2236_3(void) = Call[~String] : func:r2236_2, this:r2236_1 +# 2236| m2236_4(unknown) = ^CallSideEffect : ~m2235_6 +# 2236| m2236_5(unknown) = Chi : total:m2235_6, partial:m2236_4 +# 2236| v2236_6(void) = ^IndirectReadSideEffect[-1] : &:r2236_1, m2235_8 +# 2236| m2236_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2236_1 +# 2236| m2236_8(String) = Chi : total:m2235_8, partial:m2236_7 +#-----| Goto -> Block 3 + +# 2237| Block 3 +# 2237| m2237_1(unknown) = Phi : from 1:~m2234_5, from 2:~m2236_5 +# 2237| r2237_2(glval) = VariableAddress[s4] : +# 2237| m2237_3(String) = Uninitialized[s4] : &:r2237_2 +# 2237| r2237_4(glval) = FunctionAddress[String] : +# 2237| v2237_5(void) = Call[String] : func:r2237_4, this:r2237_2 +# 2237| m2237_6(unknown) = ^CallSideEffect : ~m2237_1 +# 2237| m2237_7(unknown) = Chi : total:m2237_1, partial:m2237_6 +# 2237| m2237_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r2237_2 +# 2237| m2237_9(String) = Chi : total:m2237_3, partial:m2237_8 +# 2238| v2238_1(void) = NoOp : +# 2238| r2238_2(glval) = VariableAddress[s4] : +# 2238| r2238_3(glval) = FunctionAddress[~String] : +# 2238| v2238_4(void) = Call[~String] : func:r2238_3, this:r2238_2 +# 2238| m2238_5(unknown) = ^CallSideEffect : ~m2237_7 +# 2238| m2238_6(unknown) = Chi : total:m2237_7, partial:m2238_5 +# 2238| v2238_7(void) = ^IndirectReadSideEffect[-1] : &:r2238_2, m2237_9 +# 2238| m2238_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r2238_2 +# 2238| m2238_9(String) = Chi : total:m2237_9, partial:m2238_8 +# 2238| r2238_10(glval) = VariableAddress[s1] : +# 2238| r2238_11(glval) = FunctionAddress[~String] : +# 2238| v2238_12(void) = Call[~String] : func:r2238_11, this:r2238_10 +# 2238| m2238_13(unknown) = ^CallSideEffect : ~m2238_6 +# 2238| m2238_14(unknown) = Chi : total:m2238_6, partial:m2238_13 +# 2238| v2238_15(void) = ^IndirectReadSideEffect[-1] : &:r2238_10, m2231_8 +# 2238| m2238_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2238_10 +# 2238| m2238_17(String) = Chi : total:m2231_8, partial:m2238_16 +# 2230| v2230_7(void) = ReturnVoid : +# 2230| v2230_8(void) = AliasedUse : ~m2238_14 +# 2230| v2230_9(void) = ExitFunction : + +# 2240| void ForDestructors() +# 2240| Block 0 +# 2240| v2240_1(void) = EnterFunction : +# 2240| m2240_2(unknown) = AliasedDefinition : +# 2240| m2240_3(unknown) = InitializeNonLocal : +# 2240| m2240_4(unknown) = Chi : total:m2240_2, partial:m2240_3 +# 2241| r2241_1(glval) = VariableAddress[c] : +# 2241| r2241_2(char) = Constant[97] : +# 2241| m2241_3(char) = Store[c] : &:r2241_1, r2241_2 +# 2242| r2242_1(glval) = VariableAddress[s] : +# 2242| m2242_2(String) = Uninitialized[s] : &:r2242_1 +# 2242| r2242_3(glval) = FunctionAddress[String] : +# 2242| r2242_4(glval) = StringConstant["hello"] : +# 2242| r2242_5(char *) = Convert : r2242_4 +# 2242| v2242_6(void) = Call[String] : func:r2242_3, this:r2242_1, 0:r2242_5 +# 2242| m2242_7(unknown) = ^CallSideEffect : ~m2240_4 +# 2242| m2242_8(unknown) = Chi : total:m2240_4, partial:m2242_7 +# 2242| v2242_9(void) = ^BufferReadSideEffect[0] : &:r2242_5, ~m2240_3 +# 2242| m2242_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2242_1 +# 2242| m2242_11(String) = Chi : total:m2242_2, partial:m2242_10 +#-----| Goto -> Block 1 + +# 2242| Block 1 +# 2242| m2242_12(String) = Phi : from 0:m2242_11, from 2:m2242_28 +# 2242| m2242_13(unknown) = Phi : from 0:~m2242_8, from 2:~m2242_25 +# 2242| m2242_14(char) = Phi : from 0:m2241_3, from 2:m2242_30 +# 2242| r2242_15(glval) = VariableAddress[c] : +# 2242| r2242_16(char) = Load[c] : &:r2242_15, m2242_14 +# 2242| r2242_17(int) = Convert : r2242_16 +# 2242| r2242_18(int) = Constant[0] : +# 2242| r2242_19(bool) = CompareNE : r2242_17, r2242_18 +# 2242| v2242_20(void) = ConditionalBranch : r2242_19 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2243| Block 2 +# 2243| r2243_1(glval) = VariableAddress[s2] : +# 2243| m2243_2(String) = Uninitialized[s2] : &:r2243_1 +# 2243| r2243_3(glval) = FunctionAddress[String] : +# 2243| v2243_4(void) = Call[String] : func:r2243_3, this:r2243_1 +# 2243| m2243_5(unknown) = ^CallSideEffect : ~m2242_13 +# 2243| m2243_6(unknown) = Chi : total:m2242_13, partial:m2243_5 +# 2243| m2243_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2243_1 +# 2243| m2243_8(String) = Chi : total:m2243_2, partial:m2243_7 +# 2244| r2244_1(glval) = VariableAddress[s2] : +# 2244| r2244_2(glval) = FunctionAddress[~String] : +# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1 +# 2244| m2244_4(unknown) = ^CallSideEffect : ~m2243_6 +# 2244| m2244_5(unknown) = Chi : total:m2243_6, partial:m2244_4 +# 2244| v2244_6(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, m2243_8 +# 2244| m2244_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1 +# 2244| m2244_8(String) = Chi : total:m2243_8, partial:m2244_7 +# 2242| r2242_21(glval) = VariableAddress[s] : +# 2242| r2242_22(glval) = FunctionAddress[pop_back] : +# 2242| r2242_23(char) = Call[pop_back] : func:r2242_22, this:r2242_21 +# 2242| m2242_24(unknown) = ^CallSideEffect : ~m2244_5 +# 2242| m2242_25(unknown) = Chi : total:m2244_5, partial:m2242_24 +# 2242| v2242_26(void) = ^IndirectReadSideEffect[-1] : &:r2242_21, m2242_12 +# 2242| m2242_27(String) = ^IndirectMayWriteSideEffect[-1] : &:r2242_21 +# 2242| m2242_28(String) = Chi : total:m2242_12, partial:m2242_27 +# 2242| r2242_29(glval) = VariableAddress[c] : +# 2242| m2242_30(char) = Store[c] : &:r2242_29, r2242_23 +#-----| Goto (back edge) -> Block 1 + +# 2242| Block 3 +# 2242| r2242_31(glval) = VariableAddress[s] : +# 2242| r2242_32(glval) = FunctionAddress[~String] : +# 2242| v2242_33(void) = Call[~String] : func:r2242_32, this:r2242_31 +# 2242| m2242_34(unknown) = ^CallSideEffect : ~m2242_13 +# 2242| m2242_35(unknown) = Chi : total:m2242_13, partial:m2242_34 +# 2242| v2242_36(void) = ^IndirectReadSideEffect[-1] : &:r2242_31, m2242_12 +# 2242| m2242_37(String) = ^IndirectMayWriteSideEffect[-1] : &:r2242_31 +# 2242| m2242_38(String) = Chi : total:m2242_12, partial:m2242_37 +# 2246| r2246_1(glval &&>) = VariableAddress[(__range)] : +# 2246| r2246_2(glval>) = VariableAddress[#temp2246:20] : +# 2246| m2246_3(vector) = Uninitialized[#temp2246:20] : &:r2246_2 +# 2246| r2246_4(glval) = FunctionAddress[vector] : +# 2246| r2246_5(glval) = VariableAddress[#temp2246:35] : +# 2246| m2246_6(String) = Uninitialized[#temp2246:35] : &:r2246_5 +# 2246| r2246_7(glval) = FunctionAddress[String] : +# 2246| r2246_8(glval) = StringConstant["hello"] : +# 2246| r2246_9(char *) = Convert : r2246_8 +# 2246| v2246_10(void) = Call[String] : func:r2246_7, this:r2246_5, 0:r2246_9 +# 2246| m2246_11(unknown) = ^CallSideEffect : ~m2242_35 +# 2246| m2246_12(unknown) = Chi : total:m2242_35, partial:m2246_11 +# 2246| v2246_13(void) = ^BufferReadSideEffect[0] : &:r2246_9, ~m2240_3 +# 2246| m2246_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r2246_5 +# 2246| m2246_15(String) = Chi : total:m2246_6, partial:m2246_14 +# 2246| r2246_16(String) = Load[#temp2246:35] : &:r2246_5, m2246_15 +# 2246| v2246_17(void) = Call[vector] : func:r2246_4, this:r2246_2, 0:r2246_16 +# 2246| m2246_18(unknown) = ^CallSideEffect : ~m2246_12 +# 2246| m2246_19(unknown) = Chi : total:m2246_12, partial:m2246_18 +# 2246| m2246_20(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2246_2 +# 2246| m2246_21(vector) = Chi : total:m2246_3, partial:m2246_20 +# 2246| r2246_22(vector &) = CopyValue : r2246_2 +# 2246| m2246_23(vector &&) = Store[(__range)] : &:r2246_1, r2246_22 +# 2246| r2246_24(glval) = VariableAddress[(__begin)] : +# 2246| r2246_25(glval &&>) = VariableAddress[(__range)] : +# 2246| r2246_26(vector &&) = Load[(__range)] : &:r2246_25, m2246_23 +#-----| r0_1(glval>) = CopyValue : r2246_26 +#-----| r0_2(glval>) = Convert : r0_1 +# 2246| r2246_27(glval) = FunctionAddress[begin] : +# 2246| r2246_28(iterator) = Call[begin] : func:r2246_27, this:r0_2 +# 2246| m2246_29(unknown) = ^CallSideEffect : ~m2246_19 +# 2246| m2246_30(unknown) = Chi : total:m2246_19, partial:m2246_29 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2246_21 +# 2246| m2246_31(iterator) = Store[(__begin)] : &:r2246_24, r2246_28 +# 2246| r2246_32(glval) = VariableAddress[(__end)] : +# 2246| r2246_33(glval &&>) = VariableAddress[(__range)] : +# 2246| r2246_34(vector &&) = Load[(__range)] : &:r2246_33, m2246_23 +#-----| r0_4(glval>) = CopyValue : r2246_34 +#-----| r0_5(glval>) = Convert : r0_4 +# 2246| r2246_35(glval) = FunctionAddress[end] : +# 2246| r2246_36(iterator) = Call[end] : func:r2246_35, this:r0_5 +# 2246| m2246_37(unknown) = ^CallSideEffect : ~m2246_30 +# 2246| m2246_38(unknown) = Chi : total:m2246_30, partial:m2246_37 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2246_21 +# 2246| m2246_39(iterator) = Store[(__end)] : &:r2246_32, r2246_36 +#-----| Goto -> Block 4 + +# 2246| Block 4 +# 2246| m2246_40(iterator) = Phi : from 3:m2246_31, from 5:m2246_82 +# 2246| m2246_41(unknown) = Phi : from 3:~m2246_38, from 5:~m2246_79 +# 2246| r2246_42(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r2246_42 +# 2246| r2246_43(glval) = FunctionAddress[operator!=] : +# 2246| r2246_44(glval) = VariableAddress[(__end)] : +# 2246| r2246_45(iterator) = Load[(__end)] : &:r2246_44, m2246_39 +# 2246| r2246_46(bool) = Call[operator!=] : func:r2246_43, this:r0_7, 0:r2246_45 +# 2246| m2246_47(unknown) = ^CallSideEffect : ~m2246_41 +# 2246| m2246_48(unknown) = Chi : total:m2246_41, partial:m2246_47 +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2246_40 +# 2246| v2246_49(void) = ConditionalBranch : r2246_46 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2246| Block 5 +# 2246| r2246_50(glval) = VariableAddress[s] : +# 2246| m2246_51(String) = Uninitialized[s] : &:r2246_50 +# 2246| r2246_52(glval) = FunctionAddress[String] : +# 2246| r2246_53(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2246_53 +# 2246| r2246_54(glval) = FunctionAddress[operator*] : +# 2246| r2246_55(String &) = Call[operator*] : func:r2246_54, this:r0_9 +# 2246| m2246_56(unknown) = ^CallSideEffect : ~m2246_48 +# 2246| m2246_57(unknown) = Chi : total:m2246_48, partial:m2246_56 +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2246_40 +# 2246| r2246_58(glval) = CopyValue : r2246_55 +# 2246| r2246_59(glval) = Convert : r2246_58 +# 2246| r2246_60(String &) = CopyValue : r2246_59 +# 2246| v2246_61(void) = Call[String] : func:r2246_52, this:r2246_50, 0:r2246_60 +# 2246| m2246_62(unknown) = ^CallSideEffect : ~m2246_57 +# 2246| m2246_63(unknown) = Chi : total:m2246_57, partial:m2246_62 +# 2246| v2246_64(void) = ^BufferReadSideEffect[0] : &:r2246_60, ~m2246_63 +# 2246| m2246_65(String) = ^IndirectMayWriteSideEffect[-1] : &:r2246_50 +# 2246| m2246_66(String) = Chi : total:m2246_51, partial:m2246_65 +# 2247| r2247_1(glval) = VariableAddress[s2] : +# 2247| m2247_2(String) = Uninitialized[s2] : &:r2247_1 +# 2247| r2247_3(glval) = FunctionAddress[String] : +# 2247| v2247_4(void) = Call[String] : func:r2247_3, this:r2247_1 +# 2247| m2247_5(unknown) = ^CallSideEffect : ~m2246_63 +# 2247| m2247_6(unknown) = Chi : total:m2246_63, partial:m2247_5 +# 2247| m2247_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2247_1 +# 2247| m2247_8(String) = Chi : total:m2247_2, partial:m2247_7 +# 2248| r2248_1(glval) = VariableAddress[s2] : +# 2248| r2248_2(glval) = FunctionAddress[~String] : +# 2248| v2248_3(void) = Call[~String] : func:r2248_2, this:r2248_1 +# 2248| m2248_4(unknown) = ^CallSideEffect : ~m2247_6 +# 2248| m2248_5(unknown) = Chi : total:m2247_6, partial:m2248_4 +# 2248| v2248_6(void) = ^IndirectReadSideEffect[-1] : &:r2248_1, m2247_8 +# 2248| m2248_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2248_1 +# 2248| m2248_8(String) = Chi : total:m2247_8, partial:m2248_7 +# 2246| r2246_67(glval) = VariableAddress[s] : +# 2246| r2246_68(glval) = FunctionAddress[~String] : +# 2246| v2246_69(void) = Call[~String] : func:r2246_68, this:r2246_67 +# 2246| m2246_70(unknown) = ^CallSideEffect : ~m2248_5 +# 2246| m2246_71(unknown) = Chi : total:m2248_5, partial:m2246_70 +# 2246| v2246_72(void) = ^IndirectReadSideEffect[-1] : &:r2246_67, m2246_66 +# 2246| m2246_73(String) = ^IndirectMayWriteSideEffect[-1] : &:r2246_67 +# 2246| m2246_74(String) = Chi : total:m2246_66, partial:m2246_73 +# 2246| r2246_75(glval) = VariableAddress[(__begin)] : +# 2246| r2246_76(glval) = FunctionAddress[operator++] : +# 2246| r2246_77(iterator &) = Call[operator++] : func:r2246_76, this:r2246_75 +# 2246| m2246_78(unknown) = ^CallSideEffect : ~m2246_71 +# 2246| m2246_79(unknown) = Chi : total:m2246_71, partial:m2246_78 +# 2246| v2246_80(void) = ^IndirectReadSideEffect[-1] : &:r2246_75, m2246_40 +# 2246| m2246_81(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2246_75 +# 2246| m2246_82(iterator) = Chi : total:m2246_40, partial:m2246_81 +# 2246| r2246_83(glval) = CopyValue : r2246_77 +#-----| Goto (back edge) -> Block 4 + +# 2250| Block 6 +# 2250| r2250_1(glval) = VariableAddress[s] : +# 2250| m2250_2(String) = Uninitialized[s] : &:r2250_1 +# 2250| r2250_3(glval) = FunctionAddress[String] : +# 2250| r2250_4(glval) = StringConstant["hello"] : +# 2250| r2250_5(char *) = Convert : r2250_4 +# 2250| v2250_6(void) = Call[String] : func:r2250_3, this:r2250_1, 0:r2250_5 +# 2250| m2250_7(unknown) = ^CallSideEffect : ~m2246_48 +# 2250| m2250_8(unknown) = Chi : total:m2246_48, partial:m2250_7 +# 2250| v2250_9(void) = ^BufferReadSideEffect[0] : &:r2250_5, ~m2240_3 +# 2250| m2250_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_1 +# 2250| m2250_11(String) = Chi : total:m2250_2, partial:m2250_10 +# 2250| r2250_12(glval) = VariableAddress[s2] : +# 2250| m2250_13(String) = Uninitialized[s2] : &:r2250_12 +# 2250| r2250_14(glval) = FunctionAddress[String] : +# 2250| r2250_15(glval) = StringConstant["world"] : +# 2250| r2250_16(char *) = Convert : r2250_15 +# 2250| v2250_17(void) = Call[String] : func:r2250_14, this:r2250_12, 0:r2250_16 +# 2250| m2250_18(unknown) = ^CallSideEffect : ~m2250_8 +# 2250| m2250_19(unknown) = Chi : total:m2250_8, partial:m2250_18 +# 2250| v2250_20(void) = ^BufferReadSideEffect[0] : &:r2250_16, ~m2240_3 +# 2250| m2250_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_12 +# 2250| m2250_22(String) = Chi : total:m2250_13, partial:m2250_21 +#-----| Goto -> Block 7 + +# 2250| Block 7 +# 2250| m2250_23(String) = Phi : from 6:m2250_11, from 8:m2250_39 +# 2250| m2250_24(unknown) = Phi : from 6:~m2250_19, from 8:~m2250_36 +# 2250| m2250_25(char) = Phi : from 6:m2242_14, from 8:m2250_41 +# 2250| r2250_26(glval) = VariableAddress[c] : +# 2250| r2250_27(char) = Load[c] : &:r2250_26, m2250_25 +# 2250| r2250_28(int) = Convert : r2250_27 +# 2250| r2250_29(int) = Constant[0] : +# 2250| r2250_30(bool) = CompareNE : r2250_28, r2250_29 +# 2250| v2250_31(void) = ConditionalBranch : r2250_30 +#-----| False -> Block 9 +#-----| True -> Block 8 + +# 2251| Block 8 +# 2251| r2251_1(char) = Constant[0] : +# 2251| r2251_2(glval) = VariableAddress[c] : +# 2251| m2251_3(char) = Store[c] : &:r2251_2, r2251_1 +# 2250| r2250_32(glval) = VariableAddress[s] : +# 2250| r2250_33(glval) = FunctionAddress[pop_back] : +# 2250| r2250_34(char) = Call[pop_back] : func:r2250_33, this:r2250_32 +# 2250| m2250_35(unknown) = ^CallSideEffect : ~m2250_24 +# 2250| m2250_36(unknown) = Chi : total:m2250_24, partial:m2250_35 +# 2250| v2250_37(void) = ^IndirectReadSideEffect[-1] : &:r2250_32, m2250_23 +# 2250| m2250_38(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_32 +# 2250| m2250_39(String) = Chi : total:m2250_23, partial:m2250_38 +# 2250| r2250_40(glval) = VariableAddress[c] : +# 2250| m2250_41(char) = Store[c] : &:r2250_40, r2250_34 +#-----| Goto (back edge) -> Block 7 + +# 2250| Block 9 +# 2250| r2250_42(glval) = VariableAddress[s2] : +# 2250| r2250_43(glval) = FunctionAddress[~String] : +# 2250| v2250_44(void) = Call[~String] : func:r2250_43, this:r2250_42 +# 2250| m2250_45(unknown) = ^CallSideEffect : ~m2250_24 +# 2250| m2250_46(unknown) = Chi : total:m2250_24, partial:m2250_45 +# 2250| v2250_47(void) = ^IndirectReadSideEffect[-1] : &:r2250_42, m2250_22 +# 2250| m2250_48(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_42 +# 2250| m2250_49(String) = Chi : total:m2250_22, partial:m2250_48 +# 2250| r2250_50(glval) = VariableAddress[s] : +# 2250| r2250_51(glval) = FunctionAddress[~String] : +# 2250| v2250_52(void) = Call[~String] : func:r2250_51, this:r2250_50 +# 2250| m2250_53(unknown) = ^CallSideEffect : ~m2250_46 +# 2250| m2250_54(unknown) = Chi : total:m2250_46, partial:m2250_53 +# 2250| v2250_55(void) = ^IndirectReadSideEffect[-1] : &:r2250_50, m2250_23 +# 2250| m2250_56(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_50 +# 2250| m2250_57(String) = Chi : total:m2250_23, partial:m2250_56 +# 2253| v2253_1(void) = NoOp : +# 2240| v2240_5(void) = ReturnVoid : +# 2240| v2240_6(void) = AliasedUse : ~m2250_54 +# 2240| v2240_7(void) = ExitFunction : + +# 2255| void IfDestructors2(bool) +# 2255| Block 0 +# 2255| v2255_1(void) = EnterFunction : +# 2255| m2255_2(unknown) = AliasedDefinition : +# 2255| m2255_3(unknown) = InitializeNonLocal : +# 2255| m2255_4(unknown) = Chi : total:m2255_2, partial:m2255_3 +# 2255| r2255_5(glval) = VariableAddress[b] : +# 2255| m2255_6(bool) = InitializeParameter[b] : &:r2255_5 +# 2256| r2256_1(glval) = VariableAddress[s] : +# 2256| m2256_2(String) = Uninitialized[s] : &:r2256_1 +# 2256| r2256_3(glval) = FunctionAddress[String] : +# 2256| r2256_4(glval) = StringConstant["hello"] : +# 2256| r2256_5(char *) = Convert : r2256_4 +# 2256| v2256_6(void) = Call[String] : func:r2256_3, this:r2256_1, 0:r2256_5 +# 2256| m2256_7(unknown) = ^CallSideEffect : ~m2255_4 +# 2256| m2256_8(unknown) = Chi : total:m2255_4, partial:m2256_7 +# 2256| v2256_9(void) = ^BufferReadSideEffect[0] : &:r2256_5, ~m2255_3 +# 2256| m2256_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2256_1 +# 2256| m2256_11(String) = Chi : total:m2256_2, partial:m2256_10 +# 2256| r2256_12(glval) = VariableAddress[b] : +# 2256| r2256_13(bool) = Load[b] : &:r2256_12, m2255_6 +# 2256| v2256_14(void) = ConditionalBranch : r2256_13 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2257| Block 1 +# 2257| r2257_1(glval) = VariableAddress[x] : +# 2257| r2257_2(int) = Constant[0] : +# 2257| m2257_3(int) = Store[x] : &:r2257_1, r2257_2 +#-----| Goto -> Block 3 + +# 2259| Block 2 +# 2259| r2259_1(glval) = VariableAddress[y] : +# 2259| r2259_2(int) = Constant[0] : +# 2259| m2259_3(int) = Store[y] : &:r2259_1, r2259_2 +#-----| Goto -> Block 3 + +# 2260| Block 3 +# 2260| r2260_1(glval) = VariableAddress[s] : +# 2260| r2260_2(glval) = FunctionAddress[~String] : +# 2260| v2260_3(void) = Call[~String] : func:r2260_2, this:r2260_1 +# 2260| m2260_4(unknown) = ^CallSideEffect : ~m2256_8 +# 2260| m2260_5(unknown) = Chi : total:m2256_8, partial:m2260_4 +# 2260| v2260_6(void) = ^IndirectReadSideEffect[-1] : &:r2260_1, m2256_11 +# 2260| m2260_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2260_1 +# 2260| m2260_8(String) = Chi : total:m2256_11, partial:m2260_7 +# 2261| v2261_1(void) = NoOp : +# 2255| v2255_7(void) = ReturnVoid : +# 2255| v2255_8(void) = AliasedUse : ~m2260_5 +# 2255| v2255_9(void) = ExitFunction : + +# 2270| void IfDestructors3(bool) +# 2270| Block 0 +# 2270| v2270_1(void) = EnterFunction : +# 2270| m2270_2(unknown) = AliasedDefinition : +# 2270| m2270_3(unknown) = InitializeNonLocal : +# 2270| m2270_4(unknown) = Chi : total:m2270_2, partial:m2270_3 +# 2270| r2270_5(glval) = VariableAddress[b] : +# 2270| m2270_6(bool) = InitializeParameter[b] : &:r2270_5 +# 2271| r2271_1(glval) = VariableAddress[B] : +# 2271| m2271_2(Bool) = Uninitialized[B] : &:r2271_1 +# 2271| r2271_3(glval) = FunctionAddress[Bool] : +# 2271| r2271_4(glval) = VariableAddress[b] : +# 2271| r2271_5(bool) = Load[b] : &:r2271_4, m2270_6 +# 2271| v2271_6(void) = Call[Bool] : func:r2271_3, this:r2271_1, 0:r2271_5 +# 2271| m2271_7(unknown) = ^CallSideEffect : ~m2270_4 +# 2271| m2271_8(unknown) = Chi : total:m2270_4, partial:m2271_7 +# 2271| m2271_9(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2271_1 +# 2271| m2271_10(Bool) = Chi : total:m2271_2, partial:m2271_9 +# 2271| r2271_11(glval) = VariableAddress[B] : +# 2271| r2271_12(glval) = FunctionAddress[operator bool] : +# 2271| r2271_13(bool) = Call[operator bool] : func:r2271_12, this:r2271_11 +# 2271| m2271_14(unknown) = ^CallSideEffect : ~m2271_8 +# 2271| m2271_15(unknown) = Chi : total:m2271_8, partial:m2271_14 +# 2271| v2271_16(void) = ^IndirectReadSideEffect[-1] : &:r2271_11, m2271_10 +# 2271| m2271_17(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2271_11 +# 2271| m2271_18(Bool) = Chi : total:m2271_10, partial:m2271_17 +# 2271| r2271_19(bool) = CopyValue : r2271_13 +# 2271| v2271_20(void) = ConditionalBranch : r2271_19 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2272| Block 1 +# 2272| r2272_1(glval) = VariableAddress[s1] : +# 2272| m2272_2(String) = Uninitialized[s1] : &:r2272_1 +# 2272| r2272_3(glval) = FunctionAddress[String] : +# 2272| v2272_4(void) = Call[String] : func:r2272_3, this:r2272_1 +# 2272| m2272_5(unknown) = ^CallSideEffect : ~m2271_15 +# 2272| m2272_6(unknown) = Chi : total:m2271_15, partial:m2272_5 +# 2272| m2272_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2272_1 +# 2272| m2272_8(String) = Chi : total:m2272_2, partial:m2272_7 +# 2273| r2273_1(glval) = VariableAddress[s1] : +# 2273| r2273_2(glval) = FunctionAddress[~String] : +# 2273| v2273_3(void) = Call[~String] : func:r2273_2, this:r2273_1 +# 2273| m2273_4(unknown) = ^CallSideEffect : ~m2272_6 +# 2273| m2273_5(unknown) = Chi : total:m2272_6, partial:m2273_4 +# 2273| v2273_6(void) = ^IndirectReadSideEffect[-1] : &:r2273_1, m2272_8 +# 2273| m2273_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2273_1 +# 2273| m2273_8(String) = Chi : total:m2272_8, partial:m2273_7 +#-----| Goto -> Block 3 + +# 2274| Block 2 +# 2274| r2274_1(glval) = VariableAddress[s2] : +# 2274| m2274_2(String) = Uninitialized[s2] : &:r2274_1 +# 2274| r2274_3(glval) = FunctionAddress[String] : +# 2274| v2274_4(void) = Call[String] : func:r2274_3, this:r2274_1 +# 2274| m2274_5(unknown) = ^CallSideEffect : ~m2271_15 +# 2274| m2274_6(unknown) = Chi : total:m2271_15, partial:m2274_5 +# 2274| m2274_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2274_1 +# 2274| m2274_8(String) = Chi : total:m2274_2, partial:m2274_7 +# 2275| r2275_1(glval) = VariableAddress[s2] : +# 2275| r2275_2(glval) = FunctionAddress[~String] : +# 2275| v2275_3(void) = Call[~String] : func:r2275_2, this:r2275_1 +# 2275| m2275_4(unknown) = ^CallSideEffect : ~m2274_6 +# 2275| m2275_5(unknown) = Chi : total:m2274_6, partial:m2275_4 +# 2275| v2275_6(void) = ^IndirectReadSideEffect[-1] : &:r2275_1, m2274_8 +# 2275| m2275_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2275_1 +# 2275| m2275_8(String) = Chi : total:m2274_8, partial:m2275_7 +#-----| Goto -> Block 3 + +# 2275| Block 3 +# 2275| m2275_9(unknown) = Phi : from 1:~m2273_5, from 2:~m2275_5 +# 2275| r2275_10(glval) = VariableAddress[B] : +# 2275| r2275_11(glval) = FunctionAddress[~Bool] : +# 2275| v2275_12(void) = Call[~Bool] : func:r2275_11, this:r2275_10 +# 2275| m2275_13(unknown) = ^CallSideEffect : ~m2275_9 +# 2275| m2275_14(unknown) = Chi : total:m2275_9, partial:m2275_13 +# 2275| v2275_15(void) = ^IndirectReadSideEffect[-1] : &:r2275_10, m2271_18 +# 2275| m2275_16(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2275_10 +# 2275| m2275_17(Bool) = Chi : total:m2271_18, partial:m2275_16 +# 2276| v2276_1(void) = NoOp : +# 2270| v2270_7(void) = ReturnVoid : +# 2270| v2270_8(void) = AliasedUse : ~m2275_14 +# 2270| v2270_9(void) = ExitFunction : + +# 2278| void WhileLoopDestructors(bool) +# 2278| Block 0 +# 2278| v2278_1(void) = EnterFunction : +# 2278| m2278_2(unknown) = AliasedDefinition : +# 2278| m2278_3(unknown) = InitializeNonLocal : +# 2278| m2278_4(unknown) = Chi : total:m2278_2, partial:m2278_3 +# 2278| r2278_5(glval) = VariableAddress[b] : +# 2278| m2278_6(bool) = InitializeParameter[b] : &:r2278_5 +# 2280| r2280_1(glval) = VariableAddress[s] : +# 2280| m2280_2(String) = Uninitialized[s] : &:r2280_1 +# 2280| r2280_3(glval) = FunctionAddress[String] : +# 2280| v2280_4(void) = Call[String] : func:r2280_3, this:r2280_1 +# 2280| m2280_5(unknown) = ^CallSideEffect : ~m2278_4 +# 2280| m2280_6(unknown) = Chi : total:m2278_4, partial:m2280_5 +# 2280| m2280_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_1 +# 2280| m2280_8(String) = Chi : total:m2280_2, partial:m2280_7 +#-----| Goto -> Block 1 + +# 2281| Block 1 +# 2281| m2281_1(bool) = Phi : from 0:m2278_6, from 2:m2282_3 +# 2281| r2281_2(glval) = VariableAddress[b] : +# 2281| r2281_3(bool) = Load[b] : &:r2281_2, m2281_1 +# 2281| v2281_4(void) = ConditionalBranch : r2281_3 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2282| Block 2 +# 2282| r2282_1(bool) = Constant[0] : +# 2282| r2282_2(glval) = VariableAddress[b] : +# 2282| m2282_3(bool) = Store[b] : &:r2282_2, r2282_1 +#-----| Goto (back edge) -> Block 1 + +# 2284| Block 3 +# 2284| r2284_1(glval) = VariableAddress[s] : +# 2284| r2284_2(glval) = FunctionAddress[~String] : +# 2284| v2284_3(void) = Call[~String] : func:r2284_2, this:r2284_1 +# 2284| m2284_4(unknown) = ^CallSideEffect : ~m2280_6 +# 2284| m2284_5(unknown) = Chi : total:m2280_6, partial:m2284_4 +# 2284| v2284_6(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, m2280_8 +# 2284| m2284_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1 +# 2284| m2284_8(String) = Chi : total:m2280_8, partial:m2284_7 +#-----| Goto -> Block 4 + +# 2287| Block 4 +# 2287| m2287_1(unknown) = Phi : from 3:~m2284_5, from 5:~m2289_5 +# 2287| m2287_2(bool) = Phi : from 3:m2281_1, from 5:m2288_3 +# 2287| r2287_3(glval) = VariableAddress[B] : +# 2287| m2287_4(Bool) = Uninitialized[B] : &:r2287_3 +# 2287| r2287_5(glval) = FunctionAddress[Bool] : +# 2287| r2287_6(glval) = VariableAddress[b] : +# 2287| r2287_7(bool) = Load[b] : &:r2287_6, m2287_2 +# 2287| v2287_8(void) = Call[Bool] : func:r2287_5, this:r2287_3, 0:r2287_7 +# 2287| m2287_9(unknown) = ^CallSideEffect : ~m2287_1 +# 2287| m2287_10(unknown) = Chi : total:m2287_1, partial:m2287_9 +# 2287| m2287_11(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2287_3 +# 2287| m2287_12(Bool) = Chi : total:m2287_4, partial:m2287_11 +# 2287| r2287_13(glval) = VariableAddress[B] : +# 2287| r2287_14(glval) = FunctionAddress[operator bool] : +# 2287| r2287_15(bool) = Call[operator bool] : func:r2287_14, this:r2287_13 +# 2287| m2287_16(unknown) = ^CallSideEffect : ~m2287_10 +# 2287| m2287_17(unknown) = Chi : total:m2287_10, partial:m2287_16 +# 2287| v2287_18(void) = ^IndirectReadSideEffect[-1] : &:r2287_13, m2287_12 +# 2287| m2287_19(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2287_13 +# 2287| m2287_20(Bool) = Chi : total:m2287_12, partial:m2287_19 +# 2287| r2287_21(bool) = CopyValue : r2287_15 +# 2287| v2287_22(void) = ConditionalBranch : r2287_21 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2288| Block 5 +# 2288| r2288_1(bool) = Constant[0] : +# 2288| r2288_2(glval) = VariableAddress[b] : +# 2288| m2288_3(bool) = Store[b] : &:r2288_2, r2288_1 +# 2289| r2289_1(glval) = VariableAddress[B] : +# 2289| r2289_2(glval) = FunctionAddress[~Bool] : +# 2289| v2289_3(void) = Call[~Bool] : func:r2289_2, this:r2289_1 +# 2289| m2289_4(unknown) = ^CallSideEffect : ~m2287_17 +# 2289| m2289_5(unknown) = Chi : total:m2287_17, partial:m2289_4 +# 2289| v2289_6(void) = ^IndirectReadSideEffect[-1] : &:r2289_1, m2287_20 +# 2289| m2289_7(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2289_1 +# 2289| m2289_8(Bool) = Chi : total:m2287_20, partial:m2289_7 +#-----| Goto (back edge) -> Block 4 + +# 2289| Block 6 +# 2289| r2289_9(glval) = VariableAddress[B] : +# 2289| r2289_10(glval) = FunctionAddress[~Bool] : +# 2289| v2289_11(void) = Call[~Bool] : func:r2289_10, this:r2289_9 +# 2289| m2289_12(unknown) = ^CallSideEffect : ~m2287_17 +# 2289| m2289_13(unknown) = Chi : total:m2287_17, partial:m2289_12 +# 2289| v2289_14(void) = ^IndirectReadSideEffect[-1] : &:r2289_9, m2287_20 +# 2289| m2289_15(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2289_9 +# 2289| m2289_16(Bool) = Chi : total:m2287_20, partial:m2289_15 +# 2291| v2291_1(void) = NoOp : +# 2278| v2278_7(void) = ReturnVoid : +# 2278| v2278_8(void) = AliasedUse : ~m2289_13 +# 2278| v2278_9(void) = ExitFunction : + +# 2293| void VoidFunc() +# 2293| Block 0 +# 2293| v2293_1(void) = EnterFunction : +# 2293| m2293_2(unknown) = AliasedDefinition : +# 2293| m2293_3(unknown) = InitializeNonLocal : +# 2293| m2293_4(unknown) = Chi : total:m2293_2, partial:m2293_3 +# 2293| v2293_5(void) = NoOp : +# 2293| v2293_6(void) = ReturnVoid : +# 2293| v2293_7(void) = AliasedUse : m2293_3 +# 2293| v2293_8(void) = ExitFunction : + +# 2295| void IfReturnDestructors(bool) +# 2295| Block 0 +# 2295| v2295_1(void) = EnterFunction : +# 2295| m2295_2(unknown) = AliasedDefinition : +# 2295| m2295_3(unknown) = InitializeNonLocal : +# 2295| m2295_4(unknown) = Chi : total:m2295_2, partial:m2295_3 +# 2295| r2295_5(glval) = VariableAddress[b] : +# 2295| m2295_6(bool) = InitializeParameter[b] : &:r2295_5 +# 2296| r2296_1(glval) = VariableAddress[s] : +# 2296| m2296_2(String) = Uninitialized[s] : &:r2296_1 +# 2296| r2296_3(glval) = FunctionAddress[String] : +# 2296| v2296_4(void) = Call[String] : func:r2296_3, this:r2296_1 +# 2296| m2296_5(unknown) = ^CallSideEffect : ~m2295_4 +# 2296| m2296_6(unknown) = Chi : total:m2295_4, partial:m2296_5 +# 2296| m2296_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2296_1 +# 2296| m2296_8(String) = Chi : total:m2296_2, partial:m2296_7 +# 2297| r2297_1(glval) = VariableAddress[b] : +# 2297| r2297_2(bool) = Load[b] : &:r2297_1, m2295_6 +# 2297| v2297_3(void) = ConditionalBranch : r2297_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2295| Block 1 +# 2295| m2295_7(unknown) = Phi : from 2:~m2304_5, from 4:~m2304_13, from 5:~m2304_22 +# 2295| v2295_8(void) = ReturnVoid : +# 2295| v2295_9(void) = AliasedUse : ~m2295_7 +# 2295| v2295_10(void) = ExitFunction : + +# 2298| Block 2 +# 2298| v2298_1(void) = NoOp : +# 2304| r2304_1(glval) = VariableAddress[s] : +# 2304| r2304_2(glval) = FunctionAddress[~String] : +# 2304| v2304_3(void) = Call[~String] : func:r2304_2, this:r2304_1 +# 2304| m2304_4(unknown) = ^CallSideEffect : ~m2296_6 +# 2304| m2304_5(unknown) = Chi : total:m2296_6, partial:m2304_4 +# 2304| v2304_6(void) = ^IndirectReadSideEffect[-1] : &:r2304_1, m2296_8 +# 2304| m2304_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2304_1 +# 2304| m2304_8(String) = Chi : total:m2296_8, partial:m2304_7 +#-----| Goto -> Block 1 + +# 2300| Block 3 +# 2300| r2300_1(glval) = VariableAddress[b] : +# 2300| r2300_2(bool) = Load[b] : &:r2300_1, m2295_6 +# 2300| v2300_3(void) = ConditionalBranch : r2300_2 +#-----| False -> Block 5 +#-----| True -> Block 4 + +# 2301| Block 4 +# 2301| r2301_1(glval) = FunctionAddress[VoidFunc] : +# 2301| v2301_2(void) = Call[VoidFunc] : func:r2301_1 +# 2301| m2301_3(unknown) = ^CallSideEffect : ~m2296_6 +# 2301| m2301_4(unknown) = Chi : total:m2296_6, partial:m2301_3 +# 2301| v2301_5(void) = NoOp : +# 2304| r2304_9(glval) = VariableAddress[s] : +# 2304| r2304_10(glval) = FunctionAddress[~String] : +# 2304| v2304_11(void) = Call[~String] : func:r2304_10, this:r2304_9 +# 2304| m2304_12(unknown) = ^CallSideEffect : ~m2301_4 +# 2304| m2304_13(unknown) = Chi : total:m2301_4, partial:m2304_12 +# 2304| v2304_14(void) = ^IndirectReadSideEffect[-1] : &:r2304_9, m2296_8 +# 2304| m2304_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2304_9 +# 2304| m2304_16(String) = Chi : total:m2296_8, partial:m2304_15 +#-----| Goto -> Block 1 + +# 2303| Block 5 +# 2303| r2303_1(glval) = VariableAddress[s] : +# 2304| v2304_17(void) = NoOp : +# 2304| r2304_18(glval) = VariableAddress[s] : +# 2304| r2304_19(glval) = FunctionAddress[~String] : +# 2304| v2304_20(void) = Call[~String] : func:r2304_19, this:r2304_18 +# 2304| m2304_21(unknown) = ^CallSideEffect : ~m2296_6 +# 2304| m2304_22(unknown) = Chi : total:m2296_6, partial:m2304_21 +# 2304| v2304_23(void) = ^IndirectReadSideEffect[-1] : &:r2304_18, m2296_8 +# 2304| m2304_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r2304_18 +# 2304| m2304_25(String) = Chi : total:m2296_8, partial:m2304_24 +#-----| Goto -> Block 1 + +# 2306| int IfReturnDestructors3(bool) +# 2306| Block 0 +# 2306| v2306_1(void) = EnterFunction : +# 2306| m2306_2(unknown) = AliasedDefinition : +# 2306| m2306_3(unknown) = InitializeNonLocal : +# 2306| m2306_4(unknown) = Chi : total:m2306_2, partial:m2306_3 +# 2306| r2306_5(glval) = VariableAddress[b] : +# 2306| m2306_6(bool) = InitializeParameter[b] : &:r2306_5 +# 2307| r2307_1(glval) = VariableAddress[s] : +# 2307| m2307_2(String) = Uninitialized[s] : &:r2307_1 +# 2307| r2307_3(glval) = FunctionAddress[String] : +# 2307| v2307_4(void) = Call[String] : func:r2307_3, this:r2307_1 +# 2307| m2307_5(unknown) = ^CallSideEffect : ~m2306_4 +# 2307| m2307_6(unknown) = Chi : total:m2306_4, partial:m2307_5 +# 2307| m2307_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2307_1 +# 2307| m2307_8(String) = Chi : total:m2307_2, partial:m2307_7 +# 2308| r2308_1(glval) = VariableAddress[b] : +# 2308| r2308_2(bool) = Load[b] : &:r2308_1, m2306_6 +# 2308| v2308_3(void) = ConditionalBranch : r2308_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2306| Block 1 +# 2306| m2306_7(unknown) = Phi : from 2:~m2312_5, from 3:~m2312_13 +# 2306| m2306_8(int) = Phi : from 2:m2309_3, from 3:m2311_3 +# 2306| r2306_9(glval) = VariableAddress[#return] : +# 2306| v2306_10(void) = ReturnValue : &:r2306_9, m2306_8 +# 2306| v2306_11(void) = AliasedUse : ~m2306_7 +# 2306| v2306_12(void) = ExitFunction : + +# 2309| Block 2 +# 2309| r2309_1(glval) = VariableAddress[#return] : +# 2309| r2309_2(int) = Constant[1] : +# 2309| m2309_3(int) = Store[#return] : &:r2309_1, r2309_2 +# 2312| r2312_1(glval) = VariableAddress[s] : +# 2312| r2312_2(glval) = FunctionAddress[~String] : +# 2312| v2312_3(void) = Call[~String] : func:r2312_2, this:r2312_1 +# 2312| m2312_4(unknown) = ^CallSideEffect : ~m2307_6 +# 2312| m2312_5(unknown) = Chi : total:m2307_6, partial:m2312_4 +# 2312| v2312_6(void) = ^IndirectReadSideEffect[-1] : &:r2312_1, m2307_8 +# 2312| m2312_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2312_1 +# 2312| m2312_8(String) = Chi : total:m2307_8, partial:m2312_7 +#-----| Goto -> Block 1 + +# 2311| Block 3 +# 2311| r2311_1(glval) = VariableAddress[#return] : +# 2311| r2311_2(int) = Constant[0] : +# 2311| m2311_3(int) = Store[#return] : &:r2311_1, r2311_2 +# 2312| r2312_9(glval) = VariableAddress[s] : +# 2312| r2312_10(glval) = FunctionAddress[~String] : +# 2312| v2312_11(void) = Call[~String] : func:r2312_10, this:r2312_9 +# 2312| m2312_12(unknown) = ^CallSideEffect : ~m2307_6 +# 2312| m2312_13(unknown) = Chi : total:m2307_6, partial:m2312_12 +# 2312| v2312_14(void) = ^IndirectReadSideEffect[-1] : &:r2312_9, m2307_8 +# 2312| m2312_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2312_9 +# 2312| m2312_16(String) = Chi : total:m2307_8, partial:m2312_15 +#-----| Goto -> Block 1 + +# 2314| void VoidReturnDestructors() +# 2314| Block 0 +# 2314| v2314_1(void) = EnterFunction : +# 2314| m2314_2(unknown) = AliasedDefinition : +# 2314| m2314_3(unknown) = InitializeNonLocal : +# 2314| m2314_4(unknown) = Chi : total:m2314_2, partial:m2314_3 +# 2315| r2315_1(glval) = VariableAddress[s] : +# 2315| m2315_2(String) = Uninitialized[s] : &:r2315_1 +# 2315| r2315_3(glval) = FunctionAddress[String] : +# 2315| v2315_4(void) = Call[String] : func:r2315_3, this:r2315_1 +# 2315| m2315_5(unknown) = ^CallSideEffect : ~m2314_4 +# 2315| m2315_6(unknown) = Chi : total:m2314_4, partial:m2315_5 +# 2315| m2315_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2315_1 +# 2315| m2315_8(String) = Chi : total:m2315_2, partial:m2315_7 +# 2316| r2316_1(glval) = FunctionAddress[VoidFunc] : +# 2316| v2316_2(void) = Call[VoidFunc] : func:r2316_1 +# 2316| m2316_3(unknown) = ^CallSideEffect : ~m2315_6 +# 2316| m2316_4(unknown) = Chi : total:m2315_6, partial:m2316_3 +# 2316| v2316_5(void) = NoOp : +# 2317| r2317_1(glval) = VariableAddress[s] : +# 2317| r2317_2(glval) = FunctionAddress[~String] : +# 2317| v2317_3(void) = Call[~String] : func:r2317_2, this:r2317_1 +# 2317| m2317_4(unknown) = ^CallSideEffect : ~m2316_4 +# 2317| m2317_5(unknown) = Chi : total:m2316_4, partial:m2317_4 +# 2317| v2317_6(void) = ^IndirectReadSideEffect[-1] : &:r2317_1, m2315_8 +# 2317| m2317_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2317_1 +# 2317| m2317_8(String) = Chi : total:m2315_8, partial:m2317_7 +# 2314| v2314_5(void) = ReturnVoid : +# 2314| v2314_6(void) = AliasedUse : ~m2317_5 +# 2314| v2314_7(void) = ExitFunction : + +# 2327| return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() +# 2327| Block 0 +# 2327| v2327_1(void) = EnterFunction : +# 2327| m2327_2(unknown) = AliasedDefinition : +# 2327| m2327_3(unknown) = InitializeNonLocal : +# 2327| m2327_4(unknown) = Chi : total:m2327_2, partial:m2327_3 +# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : +# 2329| r2329_2(..()(..)) = FunctionAddress[VoidToInt] : +# 2329| m2329_3(..:: *) = Store[#return] : &:r2329_1, r2329_2 +# 2327| r2327_5(glval<..:: *>) = VariableAddress[#return] : +# 2327| v2327_6(void) = ReturnValue : &:r2327_5, m2329_3 +# 2327| v2327_7(void) = AliasedUse : m2327_3 +# 2327| v2327_8(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 @@ -13118,6 +14681,11 @@ smart_ptr.cpp: # 12| m12_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 # 12| m12_15(unknown) = Chi : total:m10_8, partial:m12_14 # 13| v13_1(void) = NoOp : +# 13| r13_2(glval>>) = VariableAddress[up] : +# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : +# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 +# 13| v13_5(void) = ^IndirectReadSideEffect[-1] : &:r13_2, m11_9 +# 13| m13_6(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r13_2 # 10| v10_9(void) = ReturnIndirection[p] : &:r10_7, m12_15 # 10| v10_10(void) = ReturnVoid : # 10| v10_11(void) = AliasedUse : ~m12_12 @@ -13162,6 +14730,11 @@ smart_ptr.cpp: # 19| m19_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_13 # 19| m19_19(unknown) = Chi : total:m17_8, partial:m19_18 # 20| v20_1(void) = NoOp : +# 20| r20_2(glval>) = VariableAddress[sp] : +# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : +# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 +# 20| v20_5(void) = ^IndirectReadSideEffect[-1] : &:r20_2, m18_9 +# 20| m20_6(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r20_2 # 17| v17_9(void) = ReturnIndirection[p] : &:r17_7, m19_19 # 17| v17_10(void) = ReturnVoid : # 17| v17_11(void) = AliasedUse : ~m19_16 @@ -13275,6 +14848,31 @@ smart_ptr.cpp: # 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 : +# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 +# 48| v48_5(void) = ^IndirectReadSideEffect[-1] : &:r48_2, m45_2 +# 48| m48_6(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_2 +# 48| r48_7(glval>>) = VariableAddress[sp_const_sp_int] : +# 48| r48_8(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_9(void) = Call[~shared_ptr] : func:r48_8, this:r48_7 +# 48| v48_10(void) = ^IndirectReadSideEffect[-1] : &:r48_7, m41_2 +# 48| m48_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_7 +# 48| r48_12(glval>>) = VariableAddress[sp_sp_const_int] : +# 48| r48_13(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_14(void) = Call[~shared_ptr] : func:r48_13, this:r48_12 +# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_12, m37_2 +# 48| m48_16(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_12 +# 48| r48_17(glval>) = VariableAddress[sp_const_int_pointer] : +# 48| r48_18(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_19(void) = Call[~shared_ptr] : func:r48_18, this:r48_17 +# 48| v48_20(void) = ^IndirectReadSideEffect[-1] : &:r48_17, m33_2 +# 48| m48_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_17 +# 48| r48_22(glval>) = VariableAddress[sp_const_int] : +# 48| r48_23(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_24(void) = Call[~shared_ptr] : func:r48_23, this:r48_22 +# 48| v48_25(void) = ^IndirectReadSideEffect[-1] : &:r48_22, m29_2 +# 48| m48_26(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_22 # 28| v28_5(void) = ReturnVoid : # 28| v28_6(void) = AliasedUse : ~m47_16 # 28| v28_7(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 4d44f118c86..b63449d96f0 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -605,7 +605,7 @@ struct String { String& operator=(String&&); const char* c_str() const; - + char pop_back(); private: const char* p; }; @@ -2164,6 +2164,171 @@ void initialization_with_destructor(bool b, char c) { if (y == 1) return; } + + for(vector ys(x); ClassWithDestructor y : ys) { + ClassWithDestructor z1; + ClassWithDestructor z2; + } +} + +void static_variable_with_destructor_1() { + ClassWithDestructor a; + static ClassWithDestructor b; +} + +void static_variable_with_destructor_2() { + static ClassWithDestructor a; + ClassWithDestructor b; +} + +void static_variable_with_destructor_3() { + ClassWithDestructor a; + ClassWithDestructor b; + static ClassWithDestructor c; +} + +static ClassWithDestructor global_class_with_destructor; + +namespace vacuous_destructor_call { + template + T& get(T& t) { return t; } + + template + void call_destructor(T& t) { + get(t).~T(); + } + + void non_vacuous_destructor_call() { + ClassWithDestructor c; + call_destructor(c); + } + + void vacuous_destructor_call() { + int i; + call_destructor(i); + } +} + +void TryCatchDestructors(bool b) { + try { + String s; + if (b) { + throw "string literal"; + } + String s2; + } + catch (const char* s) { + throw String(s); + } + catch (const String& e) { + } + catch (...) { + throw; + } +} + +void IfDestructors(bool b) { + String s1; + if(b) { + String s2; + } else { + String s3; + } + String s4; +} + +void ForDestructors() { + char c = 'a'; + for(String s("hello"); c != 0; c = s.pop_back()) { + String s2; + } + + for(String s : vector(String("hello"))) { + String s2; + } + + for(String s("hello"), s2("world"); c != 0; c = s.pop_back()) { + c = 0; + } +} + +void IfDestructors2(bool b) { + if(String s = String("hello"); b) { + int x = 0; + } else { + int y = 0; + } +} + +class Bool { + public: + Bool(bool b_); + operator bool(); + ~Bool(); +}; + +void IfDestructors3(bool b) { + if(Bool B = Bool(b)) { + String s1; + } else { + String s2; + } +} + +void WhileLoopDestructors(bool b) { + { + String s; + while(b) { + b = false; + } + } + + { + while (Bool B = Bool(b)) { + b = false; + } + } +} + +void VoidFunc() {} + +void IfReturnDestructors(bool b) { + String s; + if(b) { + return; + } + if(b) { + return VoidFunc(); + } + s; +} + +int IfReturnDestructors3(bool b) { + String s; + if(b) { + return 1; + } + return 0; +} + +void VoidReturnDestructors() { + String s; + return VoidFunc(); +} + +namespace return_routine_type { + struct HasVoidToIntFunc + { + void VoidToInt(int); + }; + + typedef void (HasVoidToIntFunc::*VoidToIntMemberFunc)(int); + + static VoidToIntMemberFunc GetVoidToIntFunc() + { + return &HasVoidToIntFunc::VoidToInt; + } + } // semmle-extractor-options: -std=c++20 --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 c42cb501cde..6d9a76dc068 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -692,6 +692,7 @@ | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_2 | | file://:0:0:0:0 | Address | &:r0_2 | +| file://:0:0:0:0 | Address | &:r0_2 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | @@ -738,6 +739,7 @@ | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | +| file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_6 | | file://:0:0:0:0 | Address | &:r0_6 | | file://:0:0:0:0 | Address | &:r0_7 | @@ -745,6 +747,7 @@ | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | +| file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | @@ -755,6 +758,7 @@ | file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_9 | +| file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_10 | | file://:0:0:0:0 | Address | &:r0_10 | | file://:0:0:0:0 | Address | &:r0_10 | @@ -785,6 +789,10 @@ | file://:0:0:0:0 | Address | &:r0_25 | | file://:0:0:0:0 | Address | &:r0_27 | | file://:0:0:0:0 | Address | &:r0_29 | +| file://:0:0:0:0 | Address | &:r0_32 | +| file://:0:0:0:0 | Address | &:r0_35 | +| file://:0:0:0:0 | Address | &:r0_37 | +| file://:0:0:0:0 | Address | &:r0_39 | | file://:0:0:0:0 | Arg(0) | 0:r0_6 | | file://:0:0:0:0 | Arg(0) | 0:r0_8 | | file://:0:0:0:0 | Arg(0) | 0:r0_8 | @@ -792,10 +800,19 @@ | file://:0:0:0:0 | Arg(0) | 0:r0_15 | | file://:0:0:0:0 | Arg(0) | 0:r0_15 | | file://:0:0:0:0 | CallTarget | func:r0_1 | +| file://:0:0:0:0 | CallTarget | func:r0_1 | +| file://:0:0:0:0 | CallTarget | func:r0_1 | +| file://:0:0:0:0 | CallTarget | func:r0_1 | | file://:0:0:0:0 | ChiPartial | partial:m0_2 | | file://:0:0:0:0 | ChiPartial | partial:m0_2 | | file://:0:0:0:0 | ChiPartial | partial:m0_2 | | file://:0:0:0:0 | ChiPartial | partial:m0_3 | +| file://:0:0:0:0 | ChiPartial | partial:m0_3 | +| file://:0:0:0:0 | ChiPartial | partial:m0_3 | +| file://:0:0:0:0 | ChiPartial | partial:m0_3 | +| file://:0:0:0:0 | ChiPartial | partial:m0_5 | +| file://:0:0:0:0 | ChiPartial | partial:m0_5 | +| file://:0:0:0:0 | ChiPartial | partial:m0_5 | | file://:0:0:0:0 | ChiPartial | partial:m0_5 | | file://:0:0:0:0 | ChiPartial | partial:m0_5 | | file://:0:0:0:0 | ChiPartial | partial:m0_8 | @@ -807,6 +824,9 @@ | file://:0:0:0:0 | ChiTotal | total:m0_3 | | file://:0:0:0:0 | ChiTotal | total:m0_4 | | file://:0:0:0:0 | ChiTotal | total:m0_4 | +| file://:0:0:0:0 | ChiTotal | total:m0_4 | +| file://:0:0:0:0 | ChiTotal | total:m0_4 | +| file://:0:0:0:0 | ChiTotal | total:m0_4 | | file://:0:0:0:0 | ChiTotal | total:m754_8 | | file://:0:0:0:0 | ChiTotal | total:m763_8 | | file://:0:0:0:0 | ChiTotal | total:m1043_10 | @@ -816,6 +836,9 @@ | file://:0:0:0:0 | ChiTotal | total:m1718_19 | | file://:0:0:0:0 | ChiTotal | total:m1836_8 | | file://:0:0:0:0 | ChiTotal | total:m1841_8 | +| file://:0:0:0:0 | ChiTotal | total:m2175_6 | +| file://:0:0:0:0 | ChiTotal | total:m2179_4 | +| file://:0:0:0:0 | ChiTotal | total:m2186_6 | | file://:0:0:0:0 | Left | r0_2 | | file://:0:0:0:0 | Left | r0_4 | | file://:0:0:0:0 | Left | r0_7 | @@ -894,6 +917,14 @@ | file://:0:0:0:0 | SideEffect | m2163_9 | | file://:0:0:0:0 | SideEffect | m2163_30 | | file://:0:0:0:0 | SideEffect | m2163_30 | +| file://:0:0:0:0 | SideEffect | m2168_13 | +| file://:0:0:0:0 | SideEffect | m2168_13 | +| file://:0:0:0:0 | SideEffect | m2168_34 | +| file://:0:0:0:0 | SideEffect | m2168_34 | +| file://:0:0:0:0 | SideEffect | m2246_21 | +| file://:0:0:0:0 | SideEffect | m2246_21 | +| file://:0:0:0:0 | SideEffect | m2246_40 | +| file://:0:0:0:0 | SideEffect | m2246_40 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | @@ -910,6 +941,9 @@ | file://:0:0:0:0 | SideEffect | ~m1242_4 | | file://:0:0:0:0 | SideEffect | ~m1449_6 | | file://:0:0:0:0 | SideEffect | ~m1841_8 | +| file://:0:0:0:0 | SideEffect | ~m2175_6 | +| file://:0:0:0:0 | SideEffect | ~m2179_4 | +| file://:0:0:0:0 | SideEffect | ~m2186_6 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | @@ -940,9 +974,11 @@ | file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_1 | +| file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_2 | | file://:0:0:0:0 | Unary | r0_3 | | file://:0:0:0:0 | Unary | r0_4 | +| file://:0:0:0:0 | Unary | r0_4 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_6 | @@ -980,6 +1016,8 @@ | file://:0:0:0:0 | Unary | r0_21 | | file://:0:0:0:0 | Unary | r0_21 | | file://:0:0:0:0 | Unary | r0_24 | +| file://:0:0:0:0 | Unary | r0_31 | +| file://:0:0:0:0 | Unary | r0_34 | | ir.c:7:6:7:17 | ChiPartial | partial:m7_3 | | ir.c:7:6:7:17 | ChiTotal | total:m7_2 | | ir.c:7:6:7:17 | SideEffect | ~m10_6 | @@ -2996,7 +3034,7 @@ | ir.cpp:594:15:594:27 | Unary | r594_1 | | ir.cpp:615:6:615:18 | ChiPartial | partial:m615_3 | | ir.cpp:615:6:615:18 | ChiTotal | total:m615_2 | -| ir.cpp:615:6:615:18 | SideEffect | ~m619_8 | +| ir.cpp:615:6:615:18 | SideEffect | ~m620_30 | | ir.cpp:616:12:616:13 | Address | &:r616_1 | | ir.cpp:616:12:616:13 | Address | &:r616_1 | | ir.cpp:616:12:616:13 | Arg(this) | this:r616_1 | @@ -3038,6 +3076,46 @@ | ir.cpp:619:24:619:29 | Arg(0) | 0:r619_5 | | ir.cpp:619:24:619:29 | SideEffect | ~m615_3 | | ir.cpp:619:24:619:29 | Unary | r619_4 | +| ir.cpp:620:1:620:1 | Address | &:r620_2 | +| ir.cpp:620:1:620:1 | Address | &:r620_2 | +| ir.cpp:620:1:620:1 | Address | &:r620_10 | +| ir.cpp:620:1:620:1 | Address | &:r620_10 | +| ir.cpp:620:1:620:1 | Address | &:r620_18 | +| ir.cpp:620:1:620:1 | Address | &:r620_18 | +| ir.cpp:620:1:620:1 | Address | &:r620_26 | +| ir.cpp:620:1:620:1 | Address | &:r620_26 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_2 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_10 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_18 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_26 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_3 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_11 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_19 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_27 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_5 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_8 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_13 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_16 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_21 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_24 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_29 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_32 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m616_8 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m617_11 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m618_6 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m619_8 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m619_11 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m620_6 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m620_14 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m620_22 | +| ir.cpp:620:1:620:1 | SideEffect | m616_8 | +| ir.cpp:620:1:620:1 | SideEffect | m617_11 | +| ir.cpp:620:1:620:1 | SideEffect | m618_6 | +| ir.cpp:620:1:620:1 | SideEffect | m619_11 | +| ir.cpp:620:1:620:1 | SideEffect | ~m619_8 | +| ir.cpp:620:1:620:1 | SideEffect | ~m620_6 | +| ir.cpp:620:1:620:1 | SideEffect | ~m620_14 | +| ir.cpp:620:1:620:1 | SideEffect | ~m620_22 | | ir.cpp:622:6:622:16 | ChiPartial | partial:m622_3 | | ir.cpp:622:6:622:16 | ChiTotal | total:m622_2 | | ir.cpp:622:6:622:16 | SideEffect | ~m625_6 | @@ -3952,7 +4030,7 @@ | ir.cpp:796:3:796:3 | SideEffect | ~m796_16 | | ir.cpp:799:6:799:25 | ChiPartial | partial:m799_3 | | ir.cpp:799:6:799:25 | ChiTotal | total:m799_2 | -| ir.cpp:799:6:799:25 | SideEffect | ~m831_10 | +| ir.cpp:799:6:799:25 | SideEffect | ~m840_22 | | ir.cpp:800:8:800:8 | Address | &:r800_1 | | ir.cpp:800:8:800:8 | Address | &:r800_1 | | ir.cpp:800:8:800:8 | Arg(this) | this:r800_1 | @@ -4303,6 +4381,36 @@ | ir.cpp:839:8:839:10 | Load | m837_3 | | ir.cpp:839:8:839:10 | StoreValue | r839_3 | | ir.cpp:839:8:839:10 | Unary | r839_2 | +| ir.cpp:840:1:840:1 | Address | &:r840_2 | +| ir.cpp:840:1:840:1 | Address | &:r840_2 | +| ir.cpp:840:1:840:1 | Address | &:r840_10 | +| ir.cpp:840:1:840:1 | Address | &:r840_10 | +| ir.cpp:840:1:840:1 | Address | &:r840_18 | +| ir.cpp:840:1:840:1 | Address | &:r840_18 | +| ir.cpp:840:1:840:1 | Arg(this) | this:r840_2 | +| ir.cpp:840:1:840:1 | Arg(this) | this:r840_10 | +| ir.cpp:840:1:840:1 | Arg(this) | this:r840_18 | +| ir.cpp:840:1:840:1 | CallTarget | func:r840_3 | +| ir.cpp:840:1:840:1 | CallTarget | func:r840_11 | +| ir.cpp:840:1:840:1 | CallTarget | func:r840_19 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_5 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_8 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_13 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_16 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_21 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_24 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m817_13 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m824_24 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m831_10 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m831_14 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m840_6 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m840_14 | +| ir.cpp:840:1:840:1 | SideEffect | m817_13 | +| ir.cpp:840:1:840:1 | SideEffect | m824_24 | +| ir.cpp:840:1:840:1 | SideEffect | m831_14 | +| ir.cpp:840:1:840:1 | SideEffect | ~m831_10 | +| ir.cpp:840:1:840:1 | SideEffect | ~m840_6 | +| ir.cpp:840:1:840:1 | SideEffect | ~m840_14 | | ir.cpp:842:8:842:8 | Address | &:r842_5 | | ir.cpp:842:8:842:8 | Address | &:r842_5 | | ir.cpp:842:8:842:8 | Address | &:r842_7 | @@ -4347,7 +4455,7 @@ | ir.cpp:846:8:846:8 | Unary | m846_6 | | ir.cpp:849:6:849:16 | ChiPartial | partial:m849_3 | | ir.cpp:849:6:849:16 | ChiTotal | total:m849_2 | -| ir.cpp:849:6:849:16 | SideEffect | ~m851_6 | +| ir.cpp:849:6:849:16 | SideEffect | ~m865_14 | | ir.cpp:850:19:850:19 | Address | &:r850_1 | | ir.cpp:850:19:850:19 | Address | &:r850_1 | | ir.cpp:850:19:850:19 | Arg(this) | this:r850_1 | @@ -4400,6 +4508,26 @@ | ir.cpp:864:47:864:48 | Address | &:r864_2 | | ir.cpp:864:47:864:48 | Load | m860_5 | | ir.cpp:864:47:864:48 | Unary | r864_3 | +| ir.cpp:865:1:865:1 | Address | &:r865_2 | +| ir.cpp:865:1:865:1 | Address | &:r865_2 | +| ir.cpp:865:1:865:1 | Address | &:r865_10 | +| ir.cpp:865:1:865:1 | Address | &:r865_10 | +| ir.cpp:865:1:865:1 | Arg(this) | this:r865_2 | +| ir.cpp:865:1:865:1 | Arg(this) | this:r865_10 | +| ir.cpp:865:1:865:1 | CallTarget | func:r865_3 | +| ir.cpp:865:1:865:1 | CallTarget | func:r865_11 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_5 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_8 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_13 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_16 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m850_8 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m851_6 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m851_8 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m865_6 | +| ir.cpp:865:1:865:1 | SideEffect | m850_8 | +| ir.cpp:865:1:865:1 | SideEffect | m851_8 | +| ir.cpp:865:1:865:1 | SideEffect | ~m851_6 | +| ir.cpp:865:1:865:1 | SideEffect | ~m865_6 | | ir.cpp:867:1:867:14 | Address | &:m867_6 | | ir.cpp:867:1:867:14 | Address | &:r867_5 | | ir.cpp:867:1:867:14 | Address | &:r867_5 | @@ -5083,7 +5211,7 @@ | ir.cpp:1038:14:1038:14 | StoreValue | r1038_10 | | ir.cpp:1040:6:1040:11 | ChiPartial | partial:m1040_3 | | ir.cpp:1040:6:1040:11 | ChiTotal | total:m1040_2 | -| ir.cpp:1040:6:1040:11 | SideEffect | ~m1055_7 | +| ir.cpp:1040:6:1040:11 | SideEffect | ~m1056_14 | | ir.cpp:1040:17:1040:17 | Address | &:r1040_5 | | ir.cpp:1040:34:1040:34 | Address | &:r1040_7 | | ir.cpp:1040:34:1040:34 | Address | &:r1040_7 | @@ -5561,6 +5689,26 @@ | ir.cpp:1055:15:1055:15 | ChiTotal | total:m1052_7 | | ir.cpp:1055:15:1055:15 | SideEffect | ~m1052_7 | | ir.cpp:1055:16:1055:16 | Arg(0) | 0:r1055_4 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_2 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_2 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_10 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_10 | +| ir.cpp:1056:1:1056:1 | Arg(this) | this:r1056_2 | +| ir.cpp:1056:1:1056:1 | Arg(this) | this:r1056_10 | +| ir.cpp:1056:1:1056:1 | CallTarget | func:r1056_3 | +| ir.cpp:1056:1:1056:1 | CallTarget | func:r1056_11 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_5 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_8 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_13 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_16 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1045_17 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1049_12 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1055_7 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1056_6 | +| ir.cpp:1056:1:1056:1 | SideEffect | m1045_17 | +| ir.cpp:1056:1:1056:1 | SideEffect | m1049_12 | +| ir.cpp:1056:1:1056:1 | SideEffect | ~m1055_7 | +| ir.cpp:1056:1:1056:1 | SideEffect | ~m1056_6 | | ir.cpp:1079:6:1079:18 | ChiPartial | partial:m1079_3 | | ir.cpp:1079:6:1079:18 | ChiTotal | total:m1079_2 | | ir.cpp:1079:6:1079:18 | SideEffect | ~m1090_1 | @@ -6202,7 +6350,7 @@ | ir.cpp:1264:21:1264:21 | StoreValue | r1264_2 | | ir.cpp:1272:6:1272:33 | ChiPartial | partial:m1272_3 | | ir.cpp:1272:6:1272:33 | ChiTotal | total:m1272_2 | -| ir.cpp:1272:6:1272:33 | SideEffect | ~m1288_8 | +| ir.cpp:1272:6:1272:33 | SideEffect | ~m1289_6 | | ir.cpp:1272:39:1272:45 | Address | &:r1272_5 | | ir.cpp:1272:51:1272:55 | Address | &:r1272_7 | | ir.cpp:1272:51:1272:55 | Address | &:r1272_7 | @@ -6322,6 +6470,16 @@ | ir.cpp:1288:25:1288:49 | ChiPartial | partial:m1288_7 | | ir.cpp:1288:25:1288:49 | ChiTotal | total:m1288_4 | | ir.cpp:1288:25:1288:49 | SideEffect | ~m1288_4 | +| ir.cpp:1289:1:1289:1 | Address | &:r1289_2 | +| ir.cpp:1289:1:1289:1 | Address | &:r1289_2 | +| ir.cpp:1289:1:1289:1 | Arg(this) | this:r1289_2 | +| ir.cpp:1289:1:1289:1 | CallTarget | func:r1289_3 | +| ir.cpp:1289:1:1289:1 | ChiPartial | partial:m1289_5 | +| ir.cpp:1289:1:1289:1 | ChiPartial | partial:m1289_8 | +| ir.cpp:1289:1:1289:1 | ChiTotal | total:m1273_8 | +| ir.cpp:1289:1:1289:1 | ChiTotal | total:m1288_8 | +| ir.cpp:1289:1:1289:1 | SideEffect | m1273_8 | +| ir.cpp:1289:1:1289:1 | SideEffect | ~m1288_8 | | ir.cpp:1291:5:1291:22 | Address | &:r1291_10 | | ir.cpp:1291:5:1291:22 | ChiPartial | partial:m1291_3 | | ir.cpp:1291:5:1291:22 | ChiTotal | total:m1291_2 | @@ -6600,7 +6758,7 @@ | ir.cpp:1329:5:1329:15 | StoreValue | r1329_2 | | ir.cpp:1367:6:1367:21 | ChiPartial | partial:m1367_3 | | ir.cpp:1367:6:1367:21 | ChiTotal | total:m1367_2 | -| ir.cpp:1367:6:1367:21 | SideEffect | ~m1378_5 | +| ir.cpp:1367:6:1367:21 | SideEffect | ~m1379_6 | | ir.cpp:1368:12:1368:12 | Address | &:r1368_1 | | ir.cpp:1368:16:1368:34 | CallTarget | func:r1368_2 | | ir.cpp:1368:16:1368:34 | ChiPartial | partial:m1368_4 | @@ -6725,9 +6883,19 @@ | ir.cpp:1378:5:1378:28 | SideEffect | ~m1376_11 | | ir.cpp:1378:5:1378:28 | StoreValue | r1378_3 | | ir.cpp:1378:5:1378:30 | Address | &:r1378_1 | +| ir.cpp:1379:1:1379:1 | Address | &:r1379_2 | +| ir.cpp:1379:1:1379:1 | Address | &:r1379_2 | +| ir.cpp:1379:1:1379:1 | Arg(this) | this:r1379_2 | +| ir.cpp:1379:1:1379:1 | CallTarget | func:r1379_3 | +| ir.cpp:1379:1:1379:1 | ChiPartial | partial:m1379_5 | +| ir.cpp:1379:1:1379:1 | ChiPartial | partial:m1379_8 | +| ir.cpp:1379:1:1379:1 | ChiTotal | total:m1368_6 | +| ir.cpp:1379:1:1379:1 | ChiTotal | total:m1378_5 | +| ir.cpp:1379:1:1379:1 | SideEffect | m1368_6 | +| ir.cpp:1379:1:1379:1 | SideEffect | ~m1378_5 | | ir.cpp:1381:6:1381:30 | ChiPartial | partial:m1381_3 | | ir.cpp:1381:6:1381:30 | ChiTotal | total:m1381_2 | -| ir.cpp:1381:6:1381:30 | SideEffect | ~m1390_5 | +| ir.cpp:1381:6:1381:30 | SideEffect | ~m1391_14 | | ir.cpp:1382:21:1382:21 | Address | &:r1382_1 | | ir.cpp:1382:25:1382:52 | CallTarget | func:r1382_2 | | ir.cpp:1382:25:1382:52 | ChiPartial | partial:m1382_4 | @@ -6799,6 +6967,26 @@ | ir.cpp:1390:5:1390:37 | SideEffect | ~m1388_10 | | ir.cpp:1390:5:1390:37 | StoreValue | r1390_3 | | ir.cpp:1390:5:1390:39 | Address | &:r1390_1 | +| ir.cpp:1391:1:1391:1 | Address | &:r1391_2 | +| ir.cpp:1391:1:1391:1 | Address | &:r1391_2 | +| ir.cpp:1391:1:1391:1 | Address | &:r1391_10 | +| ir.cpp:1391:1:1391:1 | Address | &:r1391_10 | +| ir.cpp:1391:1:1391:1 | Arg(this) | this:r1391_2 | +| ir.cpp:1391:1:1391:1 | Arg(this) | this:r1391_10 | +| ir.cpp:1391:1:1391:1 | CallTarget | func:r1391_3 | +| ir.cpp:1391:1:1391:1 | CallTarget | func:r1391_11 | +| ir.cpp:1391:1:1391:1 | ChiPartial | partial:m1391_5 | +| ir.cpp:1391:1:1391:1 | ChiPartial | partial:m1391_8 | +| ir.cpp:1391:1:1391:1 | ChiPartial | partial:m1391_13 | +| ir.cpp:1391:1:1391:1 | ChiPartial | partial:m1391_16 | +| ir.cpp:1391:1:1391:1 | ChiTotal | total:m1382_6 | +| ir.cpp:1391:1:1391:1 | ChiTotal | total:m1384_2 | +| ir.cpp:1391:1:1391:1 | ChiTotal | total:m1390_5 | +| ir.cpp:1391:1:1391:1 | ChiTotal | total:m1391_6 | +| ir.cpp:1391:1:1391:1 | SideEffect | m1382_6 | +| ir.cpp:1391:1:1391:1 | SideEffect | m1384_2 | +| ir.cpp:1391:1:1391:1 | SideEffect | ~m1390_5 | +| ir.cpp:1391:1:1391:1 | SideEffect | ~m1391_6 | | ir.cpp:1393:6:1393:31 | ChiPartial | partial:m1393_3 | | ir.cpp:1393:6:1393:31 | ChiTotal | total:m1393_2 | | ir.cpp:1393:6:1393:31 | SideEffect | ~m1403_6 | @@ -9101,7 +9289,7 @@ | ir.cpp:1917:12:1917:12 | StoreValue | r1917_3 | | ir.cpp:1920:6:1920:43 | ChiPartial | partial:m1920_3 | | ir.cpp:1920:6:1920:43 | ChiTotal | total:m1920_2 | -| ir.cpp:1920:6:1920:43 | SideEffect | ~m1927_5 | +| ir.cpp:1920:6:1920:43 | SideEffect | ~m1928_6 | | ir.cpp:1921:7:1921:7 | Address | &:r1921_1 | | ir.cpp:1921:7:1921:7 | Address | &:r1921_1 | | ir.cpp:1921:7:1921:7 | Arg(this) | this:r1921_1 | @@ -9135,6 +9323,16 @@ | ir.cpp:1927:9:1927:23 | SideEffect | ~m1925_5 | | ir.cpp:1927:9:1927:23 | StoreValue | r1927_3 | | ir.cpp:1927:25:1927:26 | Arg(0) | 0:r1927_2 | +| ir.cpp:1928:1:1928:1 | Address | &:r1928_2 | +| ir.cpp:1928:1:1928:1 | Address | &:r1928_2 | +| ir.cpp:1928:1:1928:1 | Arg(this) | this:r1928_2 | +| ir.cpp:1928:1:1928:1 | CallTarget | func:r1928_3 | +| ir.cpp:1928:1:1928:1 | ChiPartial | partial:m1928_5 | +| ir.cpp:1928:1:1928:1 | ChiPartial | partial:m1928_8 | +| ir.cpp:1928:1:1928:1 | ChiTotal | total:m1921_8 | +| ir.cpp:1928:1:1928:1 | ChiTotal | total:m1927_5 | +| ir.cpp:1928:1:1928:1 | SideEffect | m1921_8 | +| ir.cpp:1928:1:1928:1 | SideEffect | ~m1927_5 | | ir.cpp:1930:6:1930:23 | ChiPartial | partial:m1930_3 | | ir.cpp:1930:6:1930:23 | ChiTotal | total:m1930_2 | | ir.cpp:1930:6:1930:23 | SideEffect | m1930_3 | @@ -9291,7 +9489,7 @@ | ir.cpp:1989:5:1989:21 | Address | &:r1989_1 | | ir.cpp:1992:6:1992:21 | ChiPartial | partial:m1992_3 | | ir.cpp:1992:6:1992:21 | ChiTotal | total:m1992_2 | -| ir.cpp:1992:6:1992:21 | SideEffect | ~m1993_6 | +| ir.cpp:1992:6:1992:21 | SideEffect | ~m1996_6 | | ir.cpp:1993:7:1993:7 | Address | &:r1993_1 | | ir.cpp:1993:7:1993:7 | Address | &:r1993_1 | | ir.cpp:1993:7:1993:7 | Arg(this) | this:r1993_1 | @@ -9305,6 +9503,16 @@ | ir.cpp:1994:23:1994:45 | StoreValue | r1994_2 | | ir.cpp:1995:5:1995:7 | Address | &:r1995_3 | | ir.cpp:1995:13:1995:32 | StoreValue | r1995_2 | +| ir.cpp:1996:1:1996:1 | Address | &:r1996_2 | +| ir.cpp:1996:1:1996:1 | Address | &:r1996_2 | +| ir.cpp:1996:1:1996:1 | Arg(this) | this:r1996_2 | +| ir.cpp:1996:1:1996:1 | CallTarget | func:r1996_3 | +| ir.cpp:1996:1:1996:1 | ChiPartial | partial:m1996_5 | +| ir.cpp:1996:1:1996:1 | ChiPartial | partial:m1996_8 | +| ir.cpp:1996:1:1996:1 | ChiTotal | total:m1993_6 | +| ir.cpp:1996:1:1996:1 | ChiTotal | total:m1993_8 | +| ir.cpp:1996:1:1996:1 | SideEffect | m1993_8 | +| ir.cpp:1996:1:1996:1 | SideEffect | ~m1993_6 | | ir.cpp:1998:6:1998:19 | ChiPartial | partial:m1998_3 | | ir.cpp:1998:6:1998:19 | ChiTotal | total:m1998_2 | | ir.cpp:1998:6:1998:19 | SideEffect | ~m2002_9 | @@ -10234,9 +10442,9 @@ | ir.cpp:2135:54:2135:57 | StoreValue | r2135_4 | | ir.cpp:2137:6:2137:35 | ChiPartial | partial:m2137_3 | | ir.cpp:2137:6:2137:35 | ChiTotal | total:m2137_2 | -| ir.cpp:2137:6:2137:35 | Phi | from 14:~m2159_5 | -| ir.cpp:2137:6:2137:35 | Phi | from 19:~m2163_54 | -| ir.cpp:2137:6:2137:35 | Phi | from 20:~m2163_38 | +| ir.cpp:2137:6:2137:35 | Phi | from 13:~m2172_5 | +| ir.cpp:2137:6:2137:35 | Phi | from 19:~m2172_13 | +| ir.cpp:2137:6:2137:35 | Phi | from 23:~m2172_22 | | ir.cpp:2137:6:2137:35 | SideEffect | ~m2137_9 | | ir.cpp:2137:42:2137:42 | Address | &:r2137_5 | | ir.cpp:2137:50:2137:50 | Address | &:r2137_7 | @@ -10263,6 +10471,16 @@ | ir.cpp:2139:11:2139:15 | ChiTotal | total:m2138_6 | | ir.cpp:2139:11:2139:15 | SideEffect | ~m2138_6 | | ir.cpp:2139:17:2139:19 | Arg(0) | 0:r2139_3 | +| ir.cpp:2139:21:2139:21 | Address | &:r2139_10 | +| ir.cpp:2139:21:2139:21 | Address | &:r2139_10 | +| ir.cpp:2139:21:2139:21 | Arg(this) | this:r2139_10 | +| ir.cpp:2139:21:2139:21 | CallTarget | func:r2139_11 | +| ir.cpp:2139:21:2139:21 | ChiPartial | partial:m2139_13 | +| ir.cpp:2139:21:2139:21 | ChiPartial | partial:m2139_16 | +| ir.cpp:2139:21:2139:21 | ChiTotal | total:m2139_6 | +| ir.cpp:2139:21:2139:21 | ChiTotal | total:m2139_9 | +| ir.cpp:2139:21:2139:21 | SideEffect | m2139_9 | +| ir.cpp:2139:21:2139:21 | SideEffect | ~m2139_6 | | ir.cpp:2141:39:2141:39 | Address | &:r2141_2 | | ir.cpp:2141:39:2141:39 | Address | &:r2141_2 | | ir.cpp:2141:39:2141:39 | Arg(this) | this:r2141_2 | @@ -10272,7 +10490,7 @@ | ir.cpp:2141:39:2141:39 | ChiTotal | total:m2141_1 | | ir.cpp:2141:39:2141:39 | ChiTotal | total:m2141_3 | | ir.cpp:2141:39:2141:39 | Phi | from 0:~m2138_6 | -| ir.cpp:2141:39:2141:39 | Phi | from 2:~m2139_6 | +| ir.cpp:2141:39:2141:39 | Phi | from 2:~m2139_14 | | ir.cpp:2141:39:2141:39 | SideEffect | ~m2141_1 | | ir.cpp:2141:42:2141:76 | Condition | r2141_10 | | ir.cpp:2142:9:2142:9 | Address | &:r2142_1 | @@ -10352,56 +10570,66 @@ | ir.cpp:2154:40:2154:41 | ChiTotal | total:m2154_2 | | ir.cpp:2154:40:2154:41 | SideEffect | ~m2153_6 | | ir.cpp:2154:64:2154:64 | Address | &:r2154_44 | +| ir.cpp:2154:64:2154:64 | Address | &:r2154_52 | +| ir.cpp:2154:64:2154:64 | Address | &:r2154_52 | +| ir.cpp:2154:64:2154:64 | Arg(this) | this:r2154_52 | +| ir.cpp:2154:64:2154:64 | CallTarget | func:r2154_53 | +| ir.cpp:2154:64:2154:64 | ChiPartial | partial:m2154_55 | +| ir.cpp:2154:64:2154:64 | ChiPartial | partial:m2154_58 | +| ir.cpp:2154:64:2154:64 | ChiTotal | total:m2155_6 | +| ir.cpp:2154:64:2154:64 | ChiTotal | total:m2155_9 | +| ir.cpp:2154:64:2154:64 | SideEffect | m2155_9 | +| ir.cpp:2154:64:2154:64 | SideEffect | ~m2155_6 | | ir.cpp:2154:68:2154:68 | Address | &:r2154_19 | | ir.cpp:2154:68:2154:68 | Address | &:r2154_27 | | ir.cpp:2154:68:2154:68 | Address | &:r2154_38 | | ir.cpp:2154:68:2154:68 | Address | &:r2154_47 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_52 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_52 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_60 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_60 | | ir.cpp:2154:68:2154:68 | Arg(0) | 0:r2154_39 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_2 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_5 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_7 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_9 | -| ir.cpp:2154:68:2154:68 | Arg(this) | this:r2154_52 | +| ir.cpp:2154:68:2154:68 | Arg(this) | this:r2154_60 | | ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_21 | | ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_29 | | ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_37 | | ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_46 | -| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_53 | +| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_61 | | ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_23 | | ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_31 | | ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_41 | | ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_48 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_55 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_58 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_63 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_66 | | ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_11 | | ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_24 | | ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_34 | | ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_35 | | ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_42 | -| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2155_6 | +| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_56 | | ir.cpp:2154:68:2154:68 | Condition | r2154_40 | | ir.cpp:2154:68:2154:68 | Load | m2154_17 | | ir.cpp:2154:68:2154:68 | Load | m2154_17 | | ir.cpp:2154:68:2154:68 | Load | m2154_33 | | ir.cpp:2154:68:2154:68 | Phi | from 7:m2154_25 | | ir.cpp:2154:68:2154:68 | Phi | from 7:~m2154_32 | -| ir.cpp:2154:68:2154:68 | Phi | from 9:m2154_59 | -| ir.cpp:2154:68:2154:68 | Phi | from 9:~m2154_56 | +| ir.cpp:2154:68:2154:68 | Phi | from 9:m2154_67 | +| ir.cpp:2154:68:2154:68 | Phi | from 9:~m2154_64 | | ir.cpp:2154:68:2154:68 | SideEffect | m2154_34 | | ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_11 | | ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_24 | | ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_35 | | ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_42 | -| ir.cpp:2154:68:2154:68 | SideEffect | ~m2155_6 | +| ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_56 | | ir.cpp:2154:68:2154:68 | StoreValue | r2154_22 | | ir.cpp:2154:68:2154:68 | StoreValue | r2154_30 | | ir.cpp:2154:68:2154:68 | Unary | r2154_20 | | ir.cpp:2154:68:2154:68 | Unary | r2154_28 | | ir.cpp:2154:68:2154:68 | Unary | r2154_36 | | ir.cpp:2154:68:2154:68 | Unary | r2154_45 | -| ir.cpp:2154:68:2154:68 | Unary | r2154_54 | +| ir.cpp:2154:68:2154:68 | Unary | r2154_62 | | ir.cpp:2154:68:2154:69 | StoreValue | r2154_16 | | ir.cpp:2154:68:2154:69 | Unary | r2154_15 | | ir.cpp:2154:68:2154:70 | Load | ~m2154_49 | @@ -10422,7 +10650,17 @@ | ir.cpp:2157:5:2157:5 | Address | &:r2157_26 | | ir.cpp:2157:37:2157:38 | Address | &:r2157_1 | | ir.cpp:2157:37:2157:38 | Address | &:r2157_1 | +| ir.cpp:2157:37:2157:38 | Address | &:r2157_60 | +| ir.cpp:2157:37:2157:38 | Address | &:r2157_60 | | ir.cpp:2157:37:2157:38 | Arg(this) | this:r2157_1 | +| ir.cpp:2157:37:2157:38 | Arg(this) | this:r2157_60 | +| ir.cpp:2157:37:2157:38 | CallTarget | func:r2157_61 | +| ir.cpp:2157:37:2157:38 | ChiPartial | partial:m2157_63 | +| ir.cpp:2157:37:2157:38 | ChiPartial | partial:m2157_66 | +| ir.cpp:2157:37:2157:38 | ChiTotal | total:m2157_13 | +| ir.cpp:2157:37:2157:38 | ChiTotal | total:m2157_56 | +| ir.cpp:2157:37:2157:38 | SideEffect | m2157_13 | +| ir.cpp:2157:37:2157:38 | SideEffect | ~m2157_56 | | ir.cpp:2157:40:2157:40 | Address | &:r2157_4 | | ir.cpp:2157:40:2157:40 | Address | &:r2157_4 | | ir.cpp:2157:40:2157:40 | Address | &:r2157_5 | @@ -10436,71 +10674,91 @@ | ir.cpp:2157:40:2157:41 | ChiTotal | total:m2154_42 | | ir.cpp:2157:40:2157:41 | ChiTotal | total:m2157_2 | | ir.cpp:2157:40:2157:41 | SideEffect | ~m2154_42 | -| ir.cpp:2157:64:2157:64 | Address | &:r2157_53 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_44 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_52 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_52 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_68 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_68 | +| ir.cpp:2157:64:2157:64 | Arg(this) | this:r2157_52 | +| ir.cpp:2157:64:2157:64 | Arg(this) | this:r2157_68 | +| ir.cpp:2157:64:2157:64 | CallTarget | func:r2157_53 | +| ir.cpp:2157:64:2157:64 | CallTarget | func:r2157_69 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_55 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_58 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_71 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_74 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_5 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_5 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_8 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_8 | +| ir.cpp:2157:64:2157:64 | SideEffect | m2159_8 | +| ir.cpp:2157:64:2157:64 | SideEffect | m2159_8 | +| ir.cpp:2157:64:2157:64 | SideEffect | ~m2159_5 | +| ir.cpp:2157:64:2157:64 | SideEffect | ~m2159_5 | | ir.cpp:2157:68:2157:68 | Address | &:r2157_19 | | ir.cpp:2157:68:2157:68 | Address | &:r2157_27 | | ir.cpp:2157:68:2157:68 | Address | &:r2157_38 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_44 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_44 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_56 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_47 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_76 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_76 | | ir.cpp:2157:68:2157:68 | Arg(0) | 0:r2157_39 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_12 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_15 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_17 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_19 | -| ir.cpp:2157:68:2157:68 | Arg(this) | this:r2157_44 | +| ir.cpp:2157:68:2157:68 | Arg(this) | this:r2157_76 | | ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_21 | | ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_29 | | ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_37 | -| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_45 | -| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_55 | +| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_46 | +| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_77 | | ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_23 | | ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_31 | | ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_41 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_47 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_50 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_57 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_48 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_79 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_82 | | ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_11 | | ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_24 | | ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_34 | | ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_35 | | ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_42 | -| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2159_5 | +| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_72 | | ir.cpp:2157:68:2157:68 | Condition | r2157_40 | | ir.cpp:2157:68:2157:68 | Load | m2157_17 | | ir.cpp:2157:68:2157:68 | Load | m2157_17 | | ir.cpp:2157:68:2157:68 | Load | m2157_33 | | ir.cpp:2157:68:2157:68 | Phi | from 10:m2157_25 | | ir.cpp:2157:68:2157:68 | Phi | from 10:~m2157_32 | -| ir.cpp:2157:68:2157:68 | Phi | from 12:m2157_51 | -| ir.cpp:2157:68:2157:68 | Phi | from 12:~m2157_48 | +| ir.cpp:2157:68:2157:68 | Phi | from 14:m2157_83 | +| ir.cpp:2157:68:2157:68 | Phi | from 14:~m2157_80 | | ir.cpp:2157:68:2157:68 | SideEffect | m2157_34 | | ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_11 | | ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_24 | | ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_35 | | ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_42 | -| ir.cpp:2157:68:2157:68 | SideEffect | ~m2159_5 | +| ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_72 | | ir.cpp:2157:68:2157:68 | StoreValue | r2157_22 | | ir.cpp:2157:68:2157:68 | StoreValue | r2157_30 | | ir.cpp:2157:68:2157:68 | Unary | r2157_20 | | ir.cpp:2157:68:2157:68 | Unary | r2157_28 | | ir.cpp:2157:68:2157:68 | Unary | r2157_36 | -| ir.cpp:2157:68:2157:68 | Unary | r2157_46 | -| ir.cpp:2157:68:2157:68 | Unary | r2157_54 | +| ir.cpp:2157:68:2157:68 | Unary | r2157_45 | +| ir.cpp:2157:68:2157:68 | Unary | r2157_78 | | ir.cpp:2157:68:2157:69 | StoreValue | r2157_16 | | ir.cpp:2157:68:2157:69 | Unary | r2157_15 | -| ir.cpp:2157:68:2157:70 | Load | ~m2157_58 | -| ir.cpp:2157:68:2157:70 | StoreValue | r2157_59 | +| ir.cpp:2157:68:2157:70 | Load | ~m2157_49 | +| ir.cpp:2157:68:2157:70 | StoreValue | r2157_50 | | ir.cpp:2158:7:2158:7 | Address | &:r2158_1 | | ir.cpp:2158:7:2158:7 | Address | &:r2158_1 | | ir.cpp:2158:7:2158:7 | Arg(this) | this:r2158_1 | | ir.cpp:2158:7:2158:7 | ChiPartial | partial:m2158_8 | -| ir.cpp:2158:7:2158:7 | ChiTotal | total:m2157_60 | -| ir.cpp:2158:7:2158:7 | SideEffect | m2157_60 | +| ir.cpp:2158:7:2158:7 | ChiTotal | total:m2157_51 | +| ir.cpp:2158:7:2158:7 | SideEffect | m2157_51 | | ir.cpp:2158:9:2158:13 | CallTarget | func:r2158_2 | | ir.cpp:2158:9:2158:13 | ChiPartial | partial:m2158_5 | -| ir.cpp:2158:9:2158:13 | ChiTotal | total:m2157_58 | -| ir.cpp:2158:9:2158:13 | SideEffect | ~m2157_58 | +| ir.cpp:2158:9:2158:13 | ChiTotal | total:m2157_49 | +| ir.cpp:2158:9:2158:13 | SideEffect | ~m2157_49 | | ir.cpp:2158:15:2158:17 | Arg(0) | 0:r2158_3 | | ir.cpp:2159:11:2159:11 | Address | &:r2159_1 | | ir.cpp:2159:11:2159:11 | Address | &:r2159_1 | @@ -10521,7 +10779,17 @@ | ir.cpp:2163:5:2163:5 | Address | &:r2163_22 | | ir.cpp:2163:21:2163:22 | Address | &:r2163_1 | | ir.cpp:2163:21:2163:22 | Address | &:r2163_1 | +| ir.cpp:2163:21:2163:22 | Address | &:r2163_57 | +| ir.cpp:2163:21:2163:22 | Address | &:r2163_57 | | ir.cpp:2163:21:2163:22 | Arg(this) | this:r2163_1 | +| ir.cpp:2163:21:2163:22 | Arg(this) | this:r2163_57 | +| ir.cpp:2163:21:2163:22 | CallTarget | func:r2163_58 | +| ir.cpp:2163:21:2163:22 | ChiPartial | partial:m2163_60 | +| ir.cpp:2163:21:2163:22 | ChiPartial | partial:m2163_63 | +| ir.cpp:2163:21:2163:22 | ChiTotal | total:m2163_9 | +| ir.cpp:2163:21:2163:22 | ChiTotal | total:m2163_54 | +| ir.cpp:2163:21:2163:22 | SideEffect | m2163_9 | +| ir.cpp:2163:21:2163:22 | SideEffect | ~m2163_54 | | ir.cpp:2163:24:2163:24 | Arg(0) | 0:r2163_4 | | ir.cpp:2163:24:2163:25 | CallTarget | func:r2163_3 | | ir.cpp:2163:24:2163:25 | ChiPartial | partial:m2163_6 | @@ -10589,6 +10857,1185 @@ | ir.cpp:2164:11:2164:11 | Load | m2163_56 | | ir.cpp:2164:11:2164:16 | Condition | r2164_4 | | ir.cpp:2164:16:2164:16 | Right | r2164_3 | +| ir.cpp:2168:5:2168:5 | Address | &:r2168_14 | +| ir.cpp:2168:5:2168:5 | Address | &:r2168_18 | +| ir.cpp:2168:5:2168:5 | Address | &:r2168_26 | +| ir.cpp:2168:37:2168:38 | Address | &:r2168_1 | +| ir.cpp:2168:37:2168:38 | Address | &:r2168_1 | +| ir.cpp:2168:37:2168:38 | Arg(this) | this:r2168_1 | +| ir.cpp:2168:40:2168:40 | Address | &:r2168_4 | +| ir.cpp:2168:40:2168:40 | Address | &:r2168_4 | +| ir.cpp:2168:40:2168:40 | Address | &:r2168_5 | +| ir.cpp:2168:40:2168:40 | Arg(0) | 0:r2168_8 | +| ir.cpp:2168:40:2168:40 | Load | m2153_8 | +| ir.cpp:2168:40:2168:40 | Load | m2168_7 | +| ir.cpp:2168:40:2168:40 | StoreValue | r2168_6 | +| ir.cpp:2168:40:2168:41 | CallTarget | func:r2168_3 | +| ir.cpp:2168:40:2168:41 | ChiPartial | partial:m2168_10 | +| ir.cpp:2168:40:2168:41 | ChiPartial | partial:m2168_12 | +| ir.cpp:2168:40:2168:41 | ChiTotal | total:m2163_38 | +| ir.cpp:2168:40:2168:41 | ChiTotal | total:m2168_2 | +| ir.cpp:2168:40:2168:41 | SideEffect | ~m2163_38 | +| ir.cpp:2168:64:2168:64 | Address | &:r2168_44 | +| ir.cpp:2168:64:2168:64 | Address | &:r2168_52 | +| ir.cpp:2168:64:2168:64 | Address | &:r2168_52 | +| ir.cpp:2168:64:2168:64 | Arg(this) | this:r2168_52 | +| ir.cpp:2168:64:2168:64 | CallTarget | func:r2168_53 | +| ir.cpp:2168:64:2168:64 | ChiPartial | partial:m2168_55 | +| ir.cpp:2168:64:2168:64 | ChiPartial | partial:m2168_58 | +| ir.cpp:2168:64:2168:64 | ChiTotal | total:m2168_51 | +| ir.cpp:2168:64:2168:64 | ChiTotal | total:m2171_13 | +| ir.cpp:2168:64:2168:64 | SideEffect | m2168_51 | +| ir.cpp:2168:64:2168:64 | SideEffect | ~m2171_13 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_19 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_27 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_38 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_47 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_60 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_60 | +| ir.cpp:2168:68:2168:68 | Arg(0) | 0:r2168_39 | +| ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_32 | +| ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_35 | +| ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_37 | +| ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_39 | +| ir.cpp:2168:68:2168:68 | Arg(this) | this:r2168_60 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_21 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_29 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_37 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_46 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_61 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_23 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_31 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_41 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_48 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_63 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_66 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_11 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_24 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_34 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_35 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_42 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_56 | +| ir.cpp:2168:68:2168:68 | Condition | r2168_40 | +| ir.cpp:2168:68:2168:68 | Load | m2168_17 | +| ir.cpp:2168:68:2168:68 | Load | m2168_17 | +| ir.cpp:2168:68:2168:68 | Load | m2168_33 | +| ir.cpp:2168:68:2168:68 | Phi | from 20:m2168_25 | +| ir.cpp:2168:68:2168:68 | Phi | from 20:~m2168_32 | +| ir.cpp:2168:68:2168:68 | Phi | from 22:m2168_67 | +| ir.cpp:2168:68:2168:68 | Phi | from 22:~m2168_64 | +| ir.cpp:2168:68:2168:68 | SideEffect | m2168_34 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_11 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_24 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_35 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_42 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_56 | +| ir.cpp:2168:68:2168:68 | StoreValue | r2168_22 | +| ir.cpp:2168:68:2168:68 | StoreValue | r2168_30 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_20 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_28 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_36 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_45 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_62 | +| ir.cpp:2168:68:2168:69 | StoreValue | r2168_16 | +| ir.cpp:2168:68:2168:69 | Unary | r2168_15 | +| ir.cpp:2168:68:2168:70 | Load | ~m2168_49 | +| ir.cpp:2168:68:2168:70 | StoreValue | r2168_50 | +| ir.cpp:2169:27:2169:28 | Address | &:r2169_1 | +| ir.cpp:2169:27:2169:28 | Address | &:r2169_1 | +| ir.cpp:2169:27:2169:28 | Arg(this) | this:r2169_1 | +| ir.cpp:2169:27:2169:28 | CallTarget | func:r2169_3 | +| ir.cpp:2169:27:2169:28 | ChiPartial | partial:m2169_5 | +| ir.cpp:2169:27:2169:28 | ChiPartial | partial:m2169_7 | +| ir.cpp:2169:27:2169:28 | ChiTotal | total:m2168_49 | +| ir.cpp:2169:27:2169:28 | ChiTotal | total:m2169_2 | +| ir.cpp:2169:27:2169:28 | SideEffect | ~m2168_49 | +| ir.cpp:2170:27:2170:28 | Address | &:r2170_1 | +| ir.cpp:2170:27:2170:28 | Address | &:r2170_1 | +| ir.cpp:2170:27:2170:28 | Arg(this) | this:r2170_1 | +| ir.cpp:2170:27:2170:28 | CallTarget | func:r2170_3 | +| ir.cpp:2170:27:2170:28 | ChiPartial | partial:m2170_5 | +| ir.cpp:2170:27:2170:28 | ChiPartial | partial:m2170_7 | +| ir.cpp:2170:27:2170:28 | ChiTotal | total:m2169_6 | +| ir.cpp:2170:27:2170:28 | ChiTotal | total:m2170_2 | +| ir.cpp:2170:27:2170:28 | SideEffect | ~m2169_6 | +| ir.cpp:2171:5:2171:5 | Address | &:r2171_1 | +| ir.cpp:2171:5:2171:5 | Address | &:r2171_1 | +| ir.cpp:2171:5:2171:5 | Address | &:r2171_9 | +| ir.cpp:2171:5:2171:5 | Address | &:r2171_9 | +| ir.cpp:2171:5:2171:5 | Arg(this) | this:r2171_1 | +| ir.cpp:2171:5:2171:5 | Arg(this) | this:r2171_9 | +| ir.cpp:2171:5:2171:5 | CallTarget | func:r2171_2 | +| ir.cpp:2171:5:2171:5 | CallTarget | func:r2171_10 | +| ir.cpp:2171:5:2171:5 | ChiPartial | partial:m2171_4 | +| ir.cpp:2171:5:2171:5 | ChiPartial | partial:m2171_7 | +| ir.cpp:2171:5:2171:5 | ChiPartial | partial:m2171_12 | +| ir.cpp:2171:5:2171:5 | ChiPartial | partial:m2171_15 | +| ir.cpp:2171:5:2171:5 | ChiTotal | total:m2169_8 | +| ir.cpp:2171:5:2171:5 | ChiTotal | total:m2170_6 | +| ir.cpp:2171:5:2171:5 | ChiTotal | total:m2170_8 | +| ir.cpp:2171:5:2171:5 | ChiTotal | total:m2171_5 | +| ir.cpp:2171:5:2171:5 | SideEffect | m2169_8 | +| ir.cpp:2171:5:2171:5 | SideEffect | m2170_8 | +| ir.cpp:2171:5:2171:5 | SideEffect | ~m2170_6 | +| ir.cpp:2171:5:2171:5 | SideEffect | ~m2171_5 | +| ir.cpp:2172:1:2172:1 | Address | &:r2172_1 | +| ir.cpp:2172:1:2172:1 | Address | &:r2172_1 | +| ir.cpp:2172:1:2172:1 | Address | &:r2172_9 | +| ir.cpp:2172:1:2172:1 | Address | &:r2172_9 | +| ir.cpp:2172:1:2172:1 | Address | &:r2172_18 | +| ir.cpp:2172:1:2172:1 | Address | &:r2172_18 | +| ir.cpp:2172:1:2172:1 | Arg(this) | this:r2172_1 | +| ir.cpp:2172:1:2172:1 | Arg(this) | this:r2172_9 | +| ir.cpp:2172:1:2172:1 | Arg(this) | this:r2172_18 | +| ir.cpp:2172:1:2172:1 | CallTarget | func:r2172_2 | +| ir.cpp:2172:1:2172:1 | CallTarget | func:r2172_10 | +| ir.cpp:2172:1:2172:1 | CallTarget | func:r2172_19 | +| ir.cpp:2172:1:2172:1 | ChiPartial | partial:m2172_4 | +| ir.cpp:2172:1:2172:1 | ChiPartial | partial:m2172_7 | +| ir.cpp:2172:1:2172:1 | ChiPartial | partial:m2172_12 | +| ir.cpp:2172:1:2172:1 | ChiPartial | partial:m2172_15 | +| ir.cpp:2172:1:2172:1 | ChiPartial | partial:m2172_21 | +| ir.cpp:2172:1:2172:1 | ChiPartial | partial:m2172_24 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2153_8 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2153_8 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2153_8 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2157_64 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2163_61 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2168_42 | +| ir.cpp:2172:1:2172:1 | SideEffect | m2153_8 | +| ir.cpp:2172:1:2172:1 | SideEffect | m2153_8 | +| ir.cpp:2172:1:2172:1 | SideEffect | m2153_8 | +| ir.cpp:2172:1:2172:1 | SideEffect | ~m2157_64 | +| ir.cpp:2172:1:2172:1 | SideEffect | ~m2163_61 | +| ir.cpp:2172:1:2172:1 | SideEffect | ~m2168_42 | +| ir.cpp:2174:6:2174:38 | ChiPartial | partial:m2174_3 | +| ir.cpp:2174:6:2174:38 | ChiTotal | total:m2174_2 | +| ir.cpp:2174:6:2174:38 | SideEffect | ~m2177_7 | +| ir.cpp:2175:25:2175:25 | Address | &:r2175_1 | +| ir.cpp:2175:25:2175:25 | Address | &:r2175_1 | +| ir.cpp:2175:25:2175:25 | Arg(this) | this:r2175_1 | +| ir.cpp:2175:25:2175:25 | CallTarget | func:r2175_3 | +| ir.cpp:2175:25:2175:25 | ChiPartial | partial:m2175_5 | +| ir.cpp:2175:25:2175:25 | ChiPartial | partial:m2175_7 | +| ir.cpp:2175:25:2175:25 | ChiTotal | total:m2174_4 | +| ir.cpp:2175:25:2175:25 | ChiTotal | total:m2175_2 | +| ir.cpp:2175:25:2175:25 | SideEffect | ~m2174_4 | +| ir.cpp:2176:32:2176:32 | Address | &:r2176_1 | +| ir.cpp:2176:32:2176:32 | Address | &:r2176_1 | +| ir.cpp:2176:32:2176:32 | Address | &:r2176_4 | +| ir.cpp:2176:32:2176:32 | Arg(this) | this:r2176_4 | +| ir.cpp:2176:32:2176:32 | ChiPartial | partial:m2176_6 | +| ir.cpp:2176:32:2176:32 | ChiTotal | total:m0_6 | +| ir.cpp:2176:32:2176:32 | Condition | r2176_2 | +| ir.cpp:2176:32:2176:32 | Load | ~m2175_6 | +| ir.cpp:2176:32:2176:32 | StoreValue | r2176_5 | +| ir.cpp:2177:1:2177:1 | Address | &:r2177_3 | +| ir.cpp:2177:1:2177:1 | Address | &:r2177_3 | +| ir.cpp:2177:1:2177:1 | Arg(this) | this:r2177_3 | +| ir.cpp:2177:1:2177:1 | CallTarget | func:r2177_4 | +| ir.cpp:2177:1:2177:1 | ChiPartial | partial:m2177_6 | +| ir.cpp:2177:1:2177:1 | ChiPartial | partial:m2177_9 | +| ir.cpp:2177:1:2177:1 | ChiTotal | total:m2175_8 | +| ir.cpp:2177:1:2177:1 | ChiTotal | total:m2177_1 | +| ir.cpp:2177:1:2177:1 | Phi | from 0:~m2175_6 | +| ir.cpp:2177:1:2177:1 | Phi | from 1:~m2176_7 | +| ir.cpp:2177:1:2177:1 | SideEffect | m2175_8 | +| ir.cpp:2177:1:2177:1 | SideEffect | ~m2177_1 | +| ir.cpp:2179:6:2179:38 | ChiPartial | partial:m2179_3 | +| ir.cpp:2179:6:2179:38 | ChiTotal | total:m2179_2 | +| ir.cpp:2179:6:2179:38 | SideEffect | ~m2182_6 | +| ir.cpp:2180:32:2180:32 | Address | &:r2180_1 | +| ir.cpp:2180:32:2180:32 | Address | &:r2180_1 | +| ir.cpp:2180:32:2180:32 | Address | &:r2180_4 | +| ir.cpp:2180:32:2180:32 | Arg(this) | this:r2180_4 | +| ir.cpp:2180:32:2180:32 | ChiPartial | partial:m2180_6 | +| ir.cpp:2180:32:2180:32 | ChiTotal | total:m0_6 | +| ir.cpp:2180:32:2180:32 | Condition | r2180_2 | +| ir.cpp:2180:32:2180:32 | Load | ~m2179_3 | +| ir.cpp:2180:32:2180:32 | StoreValue | r2180_5 | +| ir.cpp:2181:25:2181:25 | Address | &:r2181_2 | +| ir.cpp:2181:25:2181:25 | Address | &:r2181_2 | +| ir.cpp:2181:25:2181:25 | Arg(this) | this:r2181_2 | +| ir.cpp:2181:25:2181:25 | CallTarget | func:r2181_4 | +| ir.cpp:2181:25:2181:25 | ChiPartial | partial:m2181_6 | +| ir.cpp:2181:25:2181:25 | ChiPartial | partial:m2181_8 | +| ir.cpp:2181:25:2181:25 | ChiTotal | total:m2181_1 | +| ir.cpp:2181:25:2181:25 | ChiTotal | total:m2181_3 | +| ir.cpp:2181:25:2181:25 | Phi | from 0:~m2179_4 | +| ir.cpp:2181:25:2181:25 | Phi | from 1:~m2180_7 | +| ir.cpp:2181:25:2181:25 | SideEffect | ~m2181_1 | +| ir.cpp:2182:1:2182:1 | Address | &:r2182_2 | +| ir.cpp:2182:1:2182:1 | Address | &:r2182_2 | +| ir.cpp:2182:1:2182:1 | Arg(this) | this:r2182_2 | +| ir.cpp:2182:1:2182:1 | CallTarget | func:r2182_3 | +| ir.cpp:2182:1:2182:1 | ChiPartial | partial:m2182_5 | +| ir.cpp:2182:1:2182:1 | ChiPartial | partial:m2182_8 | +| ir.cpp:2182:1:2182:1 | ChiTotal | total:m2181_7 | +| ir.cpp:2182:1:2182:1 | ChiTotal | total:m2181_9 | +| ir.cpp:2182:1:2182:1 | SideEffect | m2181_9 | +| ir.cpp:2182:1:2182:1 | SideEffect | ~m2181_7 | +| ir.cpp:2184:6:2184:38 | ChiPartial | partial:m2184_3 | +| ir.cpp:2184:6:2184:38 | ChiTotal | total:m2184_2 | +| ir.cpp:2184:6:2184:38 | SideEffect | ~m2188_15 | +| ir.cpp:2185:25:2185:25 | Address | &:r2185_1 | +| ir.cpp:2185:25:2185:25 | Address | &:r2185_1 | +| ir.cpp:2185:25:2185:25 | Arg(this) | this:r2185_1 | +| ir.cpp:2185:25:2185:25 | CallTarget | func:r2185_3 | +| ir.cpp:2185:25:2185:25 | ChiPartial | partial:m2185_5 | +| ir.cpp:2185:25:2185:25 | ChiPartial | partial:m2185_7 | +| ir.cpp:2185:25:2185:25 | ChiTotal | total:m2184_4 | +| ir.cpp:2185:25:2185:25 | ChiTotal | total:m2185_2 | +| ir.cpp:2185:25:2185:25 | SideEffect | ~m2184_4 | +| ir.cpp:2186:25:2186:25 | Address | &:r2186_1 | +| ir.cpp:2186:25:2186:25 | Address | &:r2186_1 | +| ir.cpp:2186:25:2186:25 | Arg(this) | this:r2186_1 | +| ir.cpp:2186:25:2186:25 | CallTarget | func:r2186_3 | +| ir.cpp:2186:25:2186:25 | ChiPartial | partial:m2186_5 | +| ir.cpp:2186:25:2186:25 | ChiPartial | partial:m2186_7 | +| ir.cpp:2186:25:2186:25 | ChiTotal | total:m2185_6 | +| ir.cpp:2186:25:2186:25 | ChiTotal | total:m2186_2 | +| ir.cpp:2186:25:2186:25 | SideEffect | ~m2185_6 | +| ir.cpp:2187:32:2187:32 | Address | &:r2187_1 | +| ir.cpp:2187:32:2187:32 | Address | &:r2187_1 | +| ir.cpp:2187:32:2187:32 | Address | &:r2187_4 | +| ir.cpp:2187:32:2187:32 | Arg(this) | this:r2187_4 | +| ir.cpp:2187:32:2187:32 | ChiPartial | partial:m2187_6 | +| ir.cpp:2187:32:2187:32 | ChiTotal | total:m0_6 | +| ir.cpp:2187:32:2187:32 | Condition | r2187_2 | +| ir.cpp:2187:32:2187:32 | Load | ~m2186_6 | +| ir.cpp:2187:32:2187:32 | StoreValue | r2187_5 | +| ir.cpp:2188:1:2188:1 | Address | &:r2188_3 | +| ir.cpp:2188:1:2188:1 | Address | &:r2188_3 | +| ir.cpp:2188:1:2188:1 | Address | &:r2188_11 | +| ir.cpp:2188:1:2188:1 | Address | &:r2188_11 | +| ir.cpp:2188:1:2188:1 | Arg(this) | this:r2188_3 | +| ir.cpp:2188:1:2188:1 | Arg(this) | this:r2188_11 | +| ir.cpp:2188:1:2188:1 | CallTarget | func:r2188_4 | +| ir.cpp:2188:1:2188:1 | CallTarget | func:r2188_12 | +| ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_6 | +| ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_9 | +| ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_14 | +| ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_17 | +| ir.cpp:2188:1:2188:1 | ChiTotal | total:m2185_8 | +| ir.cpp:2188:1:2188:1 | ChiTotal | total:m2186_8 | +| ir.cpp:2188:1:2188:1 | ChiTotal | total:m2188_1 | +| ir.cpp:2188:1:2188:1 | ChiTotal | total:m2188_7 | +| ir.cpp:2188:1:2188:1 | Phi | from 0:~m2186_6 | +| ir.cpp:2188:1:2188:1 | Phi | from 1:~m2187_7 | +| ir.cpp:2188:1:2188:1 | SideEffect | m2185_8 | +| ir.cpp:2188:1:2188:1 | SideEffect | m2186_8 | +| ir.cpp:2188:1:2188:1 | SideEffect | ~m2188_1 | +| ir.cpp:2188:1:2188:1 | SideEffect | ~m2188_7 | +| ir.cpp:2190:28:2190:55 | Address | &:r2190_3 | +| ir.cpp:2190:28:2190:55 | Arg(this) | this:r2190_3 | +| ir.cpp:2190:28:2190:55 | CallTarget | func:r2190_4 | +| ir.cpp:2190:28:2190:55 | ChiPartial | partial:m2190_6 | +| ir.cpp:2190:28:2190:55 | ChiPartial | partial:m2190_8 | +| ir.cpp:2190:28:2190:55 | ChiTotal | total:m2190_2 | +| ir.cpp:2190:28:2190:55 | ChiTotal | total:m2190_7 | +| ir.cpp:2190:28:2190:55 | SideEffect | ~m2190_2 | +| ir.cpp:2190:28:2190:55 | SideEffect | ~m2190_9 | +| ir.cpp:2194:8:2194:8 | Address | &:r2194_16 | +| ir.cpp:2194:8:2194:8 | Address | &:r2194_16 | +| ir.cpp:2194:8:2194:8 | ChiPartial | partial:m2194_3 | +| ir.cpp:2194:8:2194:8 | ChiPartial | partial:m2194_3 | +| ir.cpp:2194:8:2194:8 | ChiTotal | total:m2194_2 | +| ir.cpp:2194:8:2194:8 | ChiTotal | total:m2194_2 | +| ir.cpp:2194:8:2194:8 | Load | m2194_14 | +| ir.cpp:2194:8:2194:8 | Load | m2194_14 | +| ir.cpp:2194:8:2194:8 | SideEffect | m2194_3 | +| ir.cpp:2194:8:2194:8 | SideEffect | m2194_3 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Load | m2194_6 | +| ir.cpp:2194:15:2194:15 | Load | m2194_6 | +| ir.cpp:2194:15:2194:15 | SideEffect | m2194_8 | +| ir.cpp:2194:15:2194:15 | SideEffect | m2194_8 | +| ir.cpp:2194:20:2194:28 | Address | &:r2194_9 | +| ir.cpp:2194:20:2194:28 | Address | &:r2194_9 | +| ir.cpp:2194:27:2194:27 | Address | &:r2194_10 | +| ir.cpp:2194:27:2194:27 | Address | &:r2194_10 | +| ir.cpp:2194:27:2194:27 | Load | m2194_6 | +| ir.cpp:2194:27:2194:27 | Load | m2194_6 | +| ir.cpp:2194:27:2194:27 | StoreValue | r2194_13 | +| ir.cpp:2194:27:2194:27 | StoreValue | r2194_13 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_11 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_11 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_12 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_12 | +| ir.cpp:2197:10:2197:10 | ChiPartial | partial:m2197_3 | +| ir.cpp:2197:10:2197:10 | ChiPartial | partial:m2197_3 | +| ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 | +| ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 | +| ir.cpp:2197:10:2197:10 | SideEffect | ~m2198_8 | +| ir.cpp:2197:10:2197:10 | SideEffect | ~m2198_16 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Load | m2197_6 | +| ir.cpp:2197:29:2197:29 | Load | m2197_6 | +| ir.cpp:2197:29:2197:29 | SideEffect | m2198_11 | +| ir.cpp:2197:29:2197:29 | SideEffect | m2198_19 | +| ir.cpp:2198:9:2198:11 | CallTarget | func:r2198_1 | +| ir.cpp:2198:9:2198:11 | CallTarget | func:r2198_1 | +| ir.cpp:2198:9:2198:11 | ChiPartial | partial:m2198_7 | +| ir.cpp:2198:9:2198:11 | ChiPartial | partial:m2198_7 | +| ir.cpp:2198:9:2198:11 | ChiTotal | total:m2197_4 | +| ir.cpp:2198:9:2198:11 | ChiTotal | total:m2197_4 | +| ir.cpp:2198:9:2198:11 | SideEffect | ~m2197_4 | +| ir.cpp:2198:9:2198:11 | SideEffect | ~m2197_4 | +| ir.cpp:2198:9:2198:11 | Unary | r2198_6 | +| ir.cpp:2198:9:2198:11 | Unary | r2198_6 | +| ir.cpp:2198:12:2198:15 | Address | &:r2198_12 | +| ir.cpp:2198:12:2198:15 | Address | &:r2198_12 | +| ir.cpp:2198:12:2198:15 | ChiPartial | partial:m2198_18 | +| ir.cpp:2198:12:2198:15 | ChiTotal | total:m2198_11 | +| ir.cpp:2198:12:2198:15 | SideEffect | ~m2198_11 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_2 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_2 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | +| ir.cpp:2198:13:2198:13 | Arg(0) | 0:r2198_5 | +| ir.cpp:2198:13:2198:13 | Arg(0) | 0:r2198_5 | +| ir.cpp:2198:13:2198:13 | ChiPartial | partial:m2198_10 | +| ir.cpp:2198:13:2198:13 | ChiPartial | partial:m2198_10 | +| ir.cpp:2198:13:2198:13 | ChiTotal | total:m2197_8 | +| ir.cpp:2198:13:2198:13 | ChiTotal | total:m2197_8 | +| ir.cpp:2198:13:2198:13 | Load | m2197_6 | +| ir.cpp:2198:13:2198:13 | Load | m2197_6 | +| ir.cpp:2198:13:2198:13 | SideEffect | ~m2197_8 | +| ir.cpp:2198:13:2198:13 | SideEffect | ~m2197_8 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_3 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_3 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_4 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_4 | +| ir.cpp:2198:16:2198:17 | CallTarget | func:r2198_13 | +| ir.cpp:2198:16:2198:17 | ChiPartial | partial:m2198_15 | +| ir.cpp:2198:16:2198:17 | ChiTotal | total:m2198_8 | +| ir.cpp:2198:16:2198:17 | SideEffect | ~m2198_8 | +| ir.cpp:2201:10:2201:36 | ChiPartial | partial:m2201_3 | +| ir.cpp:2201:10:2201:36 | ChiTotal | total:m2201_2 | +| ir.cpp:2201:10:2201:36 | SideEffect | ~m2204_6 | +| ir.cpp:2202:29:2202:29 | Address | &:r2202_1 | +| ir.cpp:2202:29:2202:29 | Address | &:r2202_1 | +| ir.cpp:2202:29:2202:29 | Arg(this) | this:r2202_1 | +| ir.cpp:2202:29:2202:29 | CallTarget | func:r2202_3 | +| ir.cpp:2202:29:2202:29 | ChiPartial | partial:m2202_5 | +| ir.cpp:2202:29:2202:29 | ChiPartial | partial:m2202_7 | +| ir.cpp:2202:29:2202:29 | ChiTotal | total:m2201_4 | +| ir.cpp:2202:29:2202:29 | ChiTotal | total:m2202_2 | +| ir.cpp:2202:29:2202:29 | SideEffect | ~m2201_4 | +| ir.cpp:2203:9:2203:23 | CallTarget | func:r2203_1 | +| ir.cpp:2203:9:2203:23 | ChiPartial | partial:m2203_5 | +| ir.cpp:2203:9:2203:23 | ChiTotal | total:m2202_6 | +| ir.cpp:2203:9:2203:23 | SideEffect | ~m2202_6 | +| ir.cpp:2203:25:2203:25 | Address | &:r2203_3 | +| ir.cpp:2203:25:2203:25 | Address | &:r2203_3 | +| ir.cpp:2203:25:2203:25 | Arg(0) | 0:r2203_3 | +| ir.cpp:2203:25:2203:25 | ChiPartial | partial:m2203_8 | +| ir.cpp:2203:25:2203:25 | ChiTotal | total:m2202_8 | +| ir.cpp:2203:25:2203:25 | SideEffect | ~m2202_8 | +| ir.cpp:2203:25:2203:25 | Unary | r2203_2 | +| ir.cpp:2204:5:2204:5 | Address | &:r2204_2 | +| ir.cpp:2204:5:2204:5 | Address | &:r2204_2 | +| ir.cpp:2204:5:2204:5 | Arg(this) | this:r2204_2 | +| ir.cpp:2204:5:2204:5 | CallTarget | func:r2204_3 | +| ir.cpp:2204:5:2204:5 | ChiPartial | partial:m2204_5 | +| ir.cpp:2204:5:2204:5 | ChiPartial | partial:m2204_8 | +| ir.cpp:2204:5:2204:5 | ChiTotal | total:m2203_6 | +| ir.cpp:2204:5:2204:5 | ChiTotal | total:m2203_9 | +| ir.cpp:2204:5:2204:5 | SideEffect | m2203_9 | +| ir.cpp:2204:5:2204:5 | SideEffect | ~m2203_6 | +| ir.cpp:2206:10:2206:32 | ChiPartial | partial:m2206_3 | +| ir.cpp:2206:10:2206:32 | ChiTotal | total:m2206_2 | +| ir.cpp:2206:10:2206:32 | SideEffect | ~m2208_6 | +| ir.cpp:2207:13:2207:13 | Address | &:r2207_1 | +| ir.cpp:2208:9:2208:23 | CallTarget | func:r2208_1 | +| ir.cpp:2208:9:2208:23 | ChiPartial | partial:m2208_5 | +| ir.cpp:2208:9:2208:23 | ChiTotal | total:m2206_4 | +| ir.cpp:2208:9:2208:23 | SideEffect | ~m2206_4 | +| ir.cpp:2208:25:2208:25 | Address | &:r2208_3 | +| ir.cpp:2208:25:2208:25 | Address | &:r2208_3 | +| ir.cpp:2208:25:2208:25 | Arg(0) | 0:r2208_3 | +| ir.cpp:2208:25:2208:25 | ChiPartial | partial:m2208_8 | +| ir.cpp:2208:25:2208:25 | ChiTotal | total:m2207_2 | +| ir.cpp:2208:25:2208:25 | SideEffect | ~m2207_2 | +| ir.cpp:2208:25:2208:25 | Unary | r2208_2 | +| ir.cpp:2212:6:2212:24 | ChiPartial | partial:m2212_3 | +| ir.cpp:2212:6:2212:24 | ChiTotal | total:m2212_2 | +| ir.cpp:2212:6:2212:24 | Phi | from 2:~m2212_10 | +| ir.cpp:2212:6:2212:24 | Phi | from 6:~m2221_8 | +| ir.cpp:2212:6:2212:24 | Phi | from 9:~m2214_6 | +| ir.cpp:2212:6:2212:24 | Phi | from 10:~m2228_1 | +| ir.cpp:2212:6:2212:24 | SideEffect | ~m2212_7 | +| ir.cpp:2212:31:2212:31 | Address | &:r2212_5 | +| ir.cpp:2214:12:2214:12 | Address | &:r2214_1 | +| ir.cpp:2214:12:2214:12 | Address | &:r2214_1 | +| ir.cpp:2214:12:2214:12 | Arg(this) | this:r2214_1 | +| ir.cpp:2214:12:2214:12 | CallTarget | func:r2214_3 | +| ir.cpp:2214:12:2214:12 | ChiPartial | partial:m2214_5 | +| ir.cpp:2214:12:2214:12 | ChiPartial | partial:m2214_7 | +| ir.cpp:2214:12:2214:12 | ChiTotal | total:m2212_4 | +| ir.cpp:2214:12:2214:12 | ChiTotal | total:m2214_2 | +| ir.cpp:2214:12:2214:12 | SideEffect | ~m2212_4 | +| ir.cpp:2215:9:2215:9 | Address | &:r2215_1 | +| ir.cpp:2215:9:2215:9 | Condition | r2215_2 | +| ir.cpp:2215:9:2215:9 | Load | m2212_6 | +| ir.cpp:2216:7:2216:28 | Address | &:r2216_1 | +| ir.cpp:2216:7:2216:28 | Address | &:r2216_1 | +| ir.cpp:2216:7:2216:28 | Load | m2216_4 | +| ir.cpp:2216:13:2216:28 | StoreValue | r2216_3 | +| ir.cpp:2216:13:2216:28 | Unary | r2216_2 | +| ir.cpp:2218:12:2218:13 | Address | &:r2218_1 | +| ir.cpp:2218:12:2218:13 | Address | &:r2218_1 | +| ir.cpp:2218:12:2218:13 | Arg(this) | this:r2218_1 | +| ir.cpp:2218:12:2218:13 | CallTarget | func:r2218_3 | +| ir.cpp:2218:12:2218:13 | ChiPartial | partial:m2218_5 | +| ir.cpp:2218:12:2218:13 | ChiPartial | partial:m2218_7 | +| ir.cpp:2218:12:2218:13 | ChiTotal | total:m2214_6 | +| ir.cpp:2218:12:2218:13 | ChiTotal | total:m2218_2 | +| ir.cpp:2218:12:2218:13 | SideEffect | ~m2214_6 | +| ir.cpp:2219:3:2219:3 | Address | &:r2219_1 | +| ir.cpp:2219:3:2219:3 | Address | &:r2219_1 | +| ir.cpp:2219:3:2219:3 | Address | &:r2219_9 | +| ir.cpp:2219:3:2219:3 | Address | &:r2219_9 | +| ir.cpp:2219:3:2219:3 | Arg(this) | this:r2219_1 | +| ir.cpp:2219:3:2219:3 | Arg(this) | this:r2219_9 | +| ir.cpp:2219:3:2219:3 | CallTarget | func:r2219_2 | +| ir.cpp:2219:3:2219:3 | CallTarget | func:r2219_10 | +| ir.cpp:2219:3:2219:3 | ChiPartial | partial:m2219_4 | +| ir.cpp:2219:3:2219:3 | ChiPartial | partial:m2219_7 | +| ir.cpp:2219:3:2219:3 | ChiPartial | partial:m2219_12 | +| ir.cpp:2219:3:2219:3 | ChiPartial | partial:m2219_15 | +| ir.cpp:2219:3:2219:3 | ChiTotal | total:m2214_8 | +| ir.cpp:2219:3:2219:3 | ChiTotal | total:m2218_6 | +| ir.cpp:2219:3:2219:3 | ChiTotal | total:m2218_8 | +| ir.cpp:2219:3:2219:3 | ChiTotal | total:m2219_5 | +| ir.cpp:2219:3:2219:3 | SideEffect | m2214_8 | +| ir.cpp:2219:3:2219:3 | SideEffect | m2218_8 | +| ir.cpp:2219:3:2219:3 | SideEffect | ~m2218_6 | +| ir.cpp:2219:3:2219:3 | SideEffect | ~m2219_5 | +| ir.cpp:2220:22:2220:22 | Address | &:r2220_2 | +| ir.cpp:2220:22:2220:22 | Address | &:r2220_2 | +| ir.cpp:2220:22:2220:22 | Address | &:r2220_4 | +| ir.cpp:2220:22:2220:22 | Load | m2220_3 | +| ir.cpp:2221:5:2221:19 | Address | &:r2221_1 | +| ir.cpp:2221:5:2221:19 | Address | &:r2221_1 | +| ir.cpp:2221:5:2221:19 | Address | &:r2221_1 | +| ir.cpp:2221:5:2221:19 | Arg(this) | this:r2221_1 | +| ir.cpp:2221:5:2221:19 | CallTarget | func:r2221_3 | +| ir.cpp:2221:5:2221:19 | ChiPartial | partial:m2221_7 | +| ir.cpp:2221:5:2221:19 | ChiPartial | partial:m2221_10 | +| ir.cpp:2221:5:2221:19 | ChiTotal | total:m2214_6 | +| ir.cpp:2221:5:2221:19 | ChiTotal | total:m2221_2 | +| ir.cpp:2221:5:2221:19 | Load | m2221_11 | +| ir.cpp:2221:5:2221:19 | SideEffect | ~m2214_6 | +| ir.cpp:2221:18:2221:18 | Address | &:r2221_4 | +| ir.cpp:2221:18:2221:18 | Address | &:r2221_5 | +| ir.cpp:2221:18:2221:18 | Arg(0) | 0:r2221_5 | +| ir.cpp:2221:18:2221:18 | Load | m2220_3 | +| ir.cpp:2221:18:2221:18 | SideEffect | ~m2220_5 | +| ir.cpp:2223:24:2223:24 | Address | &:r2223_2 | +| ir.cpp:2223:24:2223:24 | Address | &:r2223_2 | +| ir.cpp:2223:24:2223:24 | Address | &:r2223_4 | +| ir.cpp:2223:24:2223:24 | Load | m2223_3 | +| ir.cpp:2228:1:2228:1 | Phi | from 4:~m2219_13 | +| ir.cpp:2228:1:2228:1 | Phi | from 8:~m2214_6 | +| ir.cpp:2230:6:2230:18 | ChiPartial | partial:m2230_3 | +| ir.cpp:2230:6:2230:18 | ChiTotal | total:m2230_2 | +| ir.cpp:2230:6:2230:18 | SideEffect | ~m2238_14 | +| ir.cpp:2230:25:2230:25 | Address | &:r2230_5 | +| ir.cpp:2231:12:2231:13 | Address | &:r2231_1 | +| ir.cpp:2231:12:2231:13 | Address | &:r2231_1 | +| ir.cpp:2231:12:2231:13 | Arg(this) | this:r2231_1 | +| ir.cpp:2231:12:2231:13 | CallTarget | func:r2231_3 | +| ir.cpp:2231:12:2231:13 | ChiPartial | partial:m2231_5 | +| ir.cpp:2231:12:2231:13 | ChiPartial | partial:m2231_7 | +| ir.cpp:2231:12:2231:13 | ChiTotal | total:m2230_4 | +| ir.cpp:2231:12:2231:13 | ChiTotal | total:m2231_2 | +| ir.cpp:2231:12:2231:13 | SideEffect | ~m2230_4 | +| ir.cpp:2232:8:2232:8 | Address | &:r2232_1 | +| ir.cpp:2232:8:2232:8 | Condition | r2232_2 | +| ir.cpp:2232:8:2232:8 | Load | m2230_6 | +| ir.cpp:2233:16:2233:17 | Address | &:r2233_1 | +| ir.cpp:2233:16:2233:17 | Address | &:r2233_1 | +| ir.cpp:2233:16:2233:17 | Arg(this) | this:r2233_1 | +| ir.cpp:2233:16:2233:17 | CallTarget | func:r2233_3 | +| ir.cpp:2233:16:2233:17 | ChiPartial | partial:m2233_5 | +| ir.cpp:2233:16:2233:17 | ChiPartial | partial:m2233_7 | +| ir.cpp:2233:16:2233:17 | ChiTotal | total:m2231_6 | +| ir.cpp:2233:16:2233:17 | ChiTotal | total:m2233_2 | +| ir.cpp:2233:16:2233:17 | SideEffect | ~m2231_6 | +| ir.cpp:2234:5:2234:5 | Address | &:r2234_1 | +| ir.cpp:2234:5:2234:5 | Address | &:r2234_1 | +| ir.cpp:2234:5:2234:5 | Arg(this) | this:r2234_1 | +| ir.cpp:2234:5:2234:5 | CallTarget | func:r2234_2 | +| ir.cpp:2234:5:2234:5 | ChiPartial | partial:m2234_4 | +| ir.cpp:2234:5:2234:5 | ChiPartial | partial:m2234_7 | +| ir.cpp:2234:5:2234:5 | ChiTotal | total:m2233_6 | +| ir.cpp:2234:5:2234:5 | ChiTotal | total:m2233_8 | +| ir.cpp:2234:5:2234:5 | SideEffect | m2233_8 | +| ir.cpp:2234:5:2234:5 | SideEffect | ~m2233_6 | +| ir.cpp:2235:16:2235:17 | Address | &:r2235_1 | +| ir.cpp:2235:16:2235:17 | Address | &:r2235_1 | +| ir.cpp:2235:16:2235:17 | Arg(this) | this:r2235_1 | +| ir.cpp:2235:16:2235:17 | CallTarget | func:r2235_3 | +| ir.cpp:2235:16:2235:17 | ChiPartial | partial:m2235_5 | +| ir.cpp:2235:16:2235:17 | ChiPartial | partial:m2235_7 | +| ir.cpp:2235:16:2235:17 | ChiTotal | total:m2231_6 | +| ir.cpp:2235:16:2235:17 | ChiTotal | total:m2235_2 | +| ir.cpp:2235:16:2235:17 | SideEffect | ~m2231_6 | +| ir.cpp:2236:5:2236:5 | Address | &:r2236_1 | +| ir.cpp:2236:5:2236:5 | Address | &:r2236_1 | +| ir.cpp:2236:5:2236:5 | Arg(this) | this:r2236_1 | +| ir.cpp:2236:5:2236:5 | CallTarget | func:r2236_2 | +| ir.cpp:2236:5:2236:5 | ChiPartial | partial:m2236_4 | +| ir.cpp:2236:5:2236:5 | ChiPartial | partial:m2236_7 | +| ir.cpp:2236:5:2236:5 | ChiTotal | total:m2235_6 | +| ir.cpp:2236:5:2236:5 | ChiTotal | total:m2235_8 | +| ir.cpp:2236:5:2236:5 | SideEffect | m2235_8 | +| ir.cpp:2236:5:2236:5 | SideEffect | ~m2235_6 | +| ir.cpp:2237:12:2237:13 | Address | &:r2237_2 | +| ir.cpp:2237:12:2237:13 | Address | &:r2237_2 | +| ir.cpp:2237:12:2237:13 | Arg(this) | this:r2237_2 | +| ir.cpp:2237:12:2237:13 | CallTarget | func:r2237_4 | +| ir.cpp:2237:12:2237:13 | ChiPartial | partial:m2237_6 | +| ir.cpp:2237:12:2237:13 | ChiPartial | partial:m2237_8 | +| ir.cpp:2237:12:2237:13 | ChiTotal | total:m2237_1 | +| ir.cpp:2237:12:2237:13 | ChiTotal | total:m2237_3 | +| ir.cpp:2237:12:2237:13 | Phi | from 1:~m2234_5 | +| ir.cpp:2237:12:2237:13 | Phi | from 2:~m2236_5 | +| ir.cpp:2237:12:2237:13 | SideEffect | ~m2237_1 | +| ir.cpp:2238:1:2238:1 | Address | &:r2238_2 | +| ir.cpp:2238:1:2238:1 | Address | &:r2238_2 | +| ir.cpp:2238:1:2238:1 | Address | &:r2238_10 | +| ir.cpp:2238:1:2238:1 | Address | &:r2238_10 | +| ir.cpp:2238:1:2238:1 | Arg(this) | this:r2238_2 | +| ir.cpp:2238:1:2238:1 | Arg(this) | this:r2238_10 | +| ir.cpp:2238:1:2238:1 | CallTarget | func:r2238_3 | +| ir.cpp:2238:1:2238:1 | CallTarget | func:r2238_11 | +| ir.cpp:2238:1:2238:1 | ChiPartial | partial:m2238_5 | +| ir.cpp:2238:1:2238:1 | ChiPartial | partial:m2238_8 | +| ir.cpp:2238:1:2238:1 | ChiPartial | partial:m2238_13 | +| ir.cpp:2238:1:2238:1 | ChiPartial | partial:m2238_16 | +| ir.cpp:2238:1:2238:1 | ChiTotal | total:m2231_8 | +| ir.cpp:2238:1:2238:1 | ChiTotal | total:m2237_7 | +| ir.cpp:2238:1:2238:1 | ChiTotal | total:m2237_9 | +| ir.cpp:2238:1:2238:1 | ChiTotal | total:m2238_6 | +| ir.cpp:2238:1:2238:1 | SideEffect | m2231_8 | +| ir.cpp:2238:1:2238:1 | SideEffect | m2237_9 | +| ir.cpp:2238:1:2238:1 | SideEffect | ~m2237_7 | +| ir.cpp:2238:1:2238:1 | SideEffect | ~m2238_6 | +| ir.cpp:2240:6:2240:19 | ChiPartial | partial:m2240_3 | +| ir.cpp:2240:6:2240:19 | ChiTotal | total:m2240_2 | +| ir.cpp:2240:6:2240:19 | SideEffect | ~m2250_54 | +| ir.cpp:2241:10:2241:10 | Address | &:r2241_1 | +| ir.cpp:2241:13:2241:16 | StoreValue | r2241_2 | +| ir.cpp:2242:16:2242:16 | Address | &:r2242_1 | +| ir.cpp:2242:16:2242:16 | Address | &:r2242_1 | +| ir.cpp:2242:16:2242:16 | Address | &:r2242_31 | +| ir.cpp:2242:16:2242:16 | Address | &:r2242_31 | +| ir.cpp:2242:16:2242:16 | Arg(this) | this:r2242_1 | +| ir.cpp:2242:16:2242:16 | Arg(this) | this:r2242_31 | +| ir.cpp:2242:16:2242:16 | CallTarget | func:r2242_32 | +| ir.cpp:2242:16:2242:16 | ChiPartial | partial:m2242_34 | +| ir.cpp:2242:16:2242:16 | ChiPartial | partial:m2242_37 | +| ir.cpp:2242:16:2242:16 | ChiTotal | total:m2242_12 | +| ir.cpp:2242:16:2242:16 | ChiTotal | total:m2242_13 | +| ir.cpp:2242:16:2242:16 | SideEffect | m2242_12 | +| ir.cpp:2242:16:2242:16 | SideEffect | ~m2242_13 | +| ir.cpp:2242:18:2242:24 | Address | &:r2242_5 | +| ir.cpp:2242:18:2242:24 | Arg(0) | 0:r2242_5 | +| ir.cpp:2242:18:2242:24 | SideEffect | ~m2240_3 | +| ir.cpp:2242:18:2242:24 | Unary | r2242_4 | +| ir.cpp:2242:18:2242:25 | CallTarget | func:r2242_3 | +| ir.cpp:2242:18:2242:25 | ChiPartial | partial:m2242_7 | +| ir.cpp:2242:18:2242:25 | ChiPartial | partial:m2242_10 | +| ir.cpp:2242:18:2242:25 | ChiTotal | total:m2240_4 | +| ir.cpp:2242:18:2242:25 | ChiTotal | total:m2242_2 | +| ir.cpp:2242:18:2242:25 | SideEffect | ~m2240_4 | +| ir.cpp:2242:28:2242:28 | Address | &:r2242_15 | +| ir.cpp:2242:28:2242:28 | Left | r2242_17 | +| ir.cpp:2242:28:2242:28 | Load | m2242_14 | +| ir.cpp:2242:28:2242:28 | Phi | from 0:m2241_3 | +| ir.cpp:2242:28:2242:28 | Phi | from 0:m2242_11 | +| ir.cpp:2242:28:2242:28 | Phi | from 0:~m2242_8 | +| ir.cpp:2242:28:2242:28 | Phi | from 2:m2242_28 | +| ir.cpp:2242:28:2242:28 | Phi | from 2:m2242_30 | +| ir.cpp:2242:28:2242:28 | Phi | from 2:~m2242_25 | +| ir.cpp:2242:28:2242:28 | Unary | r2242_16 | +| ir.cpp:2242:28:2242:33 | Condition | r2242_19 | +| ir.cpp:2242:33:2242:33 | Right | r2242_18 | +| ir.cpp:2242:36:2242:36 | Address | &:r2242_29 | +| ir.cpp:2242:40:2242:40 | Address | &:r2242_21 | +| ir.cpp:2242:40:2242:40 | Address | &:r2242_21 | +| ir.cpp:2242:40:2242:40 | Arg(this) | this:r2242_21 | +| ir.cpp:2242:40:2242:40 | ChiPartial | partial:m2242_27 | +| ir.cpp:2242:40:2242:40 | ChiTotal | total:m2242_12 | +| ir.cpp:2242:40:2242:40 | SideEffect | m2242_12 | +| ir.cpp:2242:42:2242:49 | CallTarget | func:r2242_22 | +| ir.cpp:2242:42:2242:49 | ChiPartial | partial:m2242_24 | +| ir.cpp:2242:42:2242:49 | ChiTotal | total:m2244_5 | +| ir.cpp:2242:42:2242:49 | SideEffect | ~m2244_5 | +| ir.cpp:2242:42:2242:49 | StoreValue | r2242_23 | +| ir.cpp:2243:16:2243:17 | Address | &:r2243_1 | +| ir.cpp:2243:16:2243:17 | Address | &:r2243_1 | +| ir.cpp:2243:16:2243:17 | Arg(this) | this:r2243_1 | +| ir.cpp:2243:16:2243:17 | CallTarget | func:r2243_3 | +| ir.cpp:2243:16:2243:17 | ChiPartial | partial:m2243_5 | +| ir.cpp:2243:16:2243:17 | ChiPartial | partial:m2243_7 | +| ir.cpp:2243:16:2243:17 | ChiTotal | total:m2242_13 | +| ir.cpp:2243:16:2243:17 | ChiTotal | total:m2243_2 | +| ir.cpp:2243:16:2243:17 | SideEffect | ~m2242_13 | +| ir.cpp:2244:5:2244:5 | Address | &:r2244_1 | +| ir.cpp:2244:5:2244:5 | Address | &:r2244_1 | +| ir.cpp:2244:5:2244:5 | Arg(this) | this:r2244_1 | +| ir.cpp:2244:5:2244:5 | CallTarget | func:r2244_2 | +| ir.cpp:2244:5:2244:5 | ChiPartial | partial:m2244_4 | +| ir.cpp:2244:5:2244:5 | ChiPartial | partial:m2244_7 | +| ir.cpp:2244:5:2244:5 | ChiTotal | total:m2243_6 | +| ir.cpp:2244:5:2244:5 | ChiTotal | total:m2243_8 | +| ir.cpp:2244:5:2244:5 | SideEffect | m2243_8 | +| ir.cpp:2244:5:2244:5 | SideEffect | ~m2243_6 | +| ir.cpp:2246:5:2246:5 | Address | &:r2246_1 | +| ir.cpp:2246:5:2246:5 | Address | &:r2246_24 | +| ir.cpp:2246:5:2246:5 | Address | &:r2246_32 | +| ir.cpp:2246:16:2246:16 | Address | &:r2246_50 | +| ir.cpp:2246:16:2246:16 | Address | &:r2246_50 | +| ir.cpp:2246:16:2246:16 | Address | &:r2246_67 | +| ir.cpp:2246:16:2246:16 | Address | &:r2246_67 | +| ir.cpp:2246:16:2246:16 | Arg(this) | this:r2246_50 | +| ir.cpp:2246:16:2246:16 | Arg(this) | this:r2246_67 | +| ir.cpp:2246:16:2246:16 | CallTarget | func:r2246_52 | +| ir.cpp:2246:16:2246:16 | CallTarget | func:r2246_68 | +| ir.cpp:2246:16:2246:16 | ChiPartial | partial:m2246_62 | +| ir.cpp:2246:16:2246:16 | ChiPartial | partial:m2246_65 | +| ir.cpp:2246:16:2246:16 | ChiPartial | partial:m2246_70 | +| ir.cpp:2246:16:2246:16 | ChiPartial | partial:m2246_73 | +| ir.cpp:2246:16:2246:16 | ChiTotal | total:m2246_51 | +| ir.cpp:2246:16:2246:16 | ChiTotal | total:m2246_57 | +| ir.cpp:2246:16:2246:16 | ChiTotal | total:m2246_66 | +| ir.cpp:2246:16:2246:16 | ChiTotal | total:m2248_5 | +| ir.cpp:2246:16:2246:16 | SideEffect | m2246_66 | +| ir.cpp:2246:16:2246:16 | SideEffect | ~m2246_57 | +| ir.cpp:2246:16:2246:16 | SideEffect | ~m2248_5 | +| ir.cpp:2246:20:2246:20 | Address | &:r2246_25 | +| ir.cpp:2246:20:2246:20 | Address | &:r2246_33 | +| ir.cpp:2246:20:2246:20 | Address | &:r2246_44 | +| ir.cpp:2246:20:2246:20 | Address | &:r2246_75 | +| ir.cpp:2246:20:2246:20 | Address | &:r2246_75 | +| ir.cpp:2246:20:2246:20 | Arg(0) | 0:r2246_45 | +| ir.cpp:2246:20:2246:20 | Arg(this) | this:r0_2 | +| ir.cpp:2246:20:2246:20 | Arg(this) | this:r0_5 | +| ir.cpp:2246:20:2246:20 | Arg(this) | this:r0_7 | +| ir.cpp:2246:20:2246:20 | Arg(this) | this:r0_9 | +| ir.cpp:2246:20:2246:20 | Arg(this) | this:r2246_75 | +| ir.cpp:2246:20:2246:20 | CallTarget | func:r2246_27 | +| ir.cpp:2246:20:2246:20 | CallTarget | func:r2246_35 | +| ir.cpp:2246:20:2246:20 | CallTarget | func:r2246_43 | +| ir.cpp:2246:20:2246:20 | CallTarget | func:r2246_54 | +| ir.cpp:2246:20:2246:20 | CallTarget | func:r2246_76 | +| ir.cpp:2246:20:2246:20 | ChiPartial | partial:m2246_29 | +| ir.cpp:2246:20:2246:20 | ChiPartial | partial:m2246_37 | +| ir.cpp:2246:20:2246:20 | ChiPartial | partial:m2246_47 | +| ir.cpp:2246:20:2246:20 | ChiPartial | partial:m2246_56 | +| ir.cpp:2246:20:2246:20 | ChiPartial | partial:m2246_78 | +| ir.cpp:2246:20:2246:20 | ChiPartial | partial:m2246_81 | +| ir.cpp:2246:20:2246:20 | ChiTotal | total:m2246_19 | +| ir.cpp:2246:20:2246:20 | ChiTotal | total:m2246_30 | +| ir.cpp:2246:20:2246:20 | ChiTotal | total:m2246_40 | +| ir.cpp:2246:20:2246:20 | ChiTotal | total:m2246_41 | +| ir.cpp:2246:20:2246:20 | ChiTotal | total:m2246_48 | +| ir.cpp:2246:20:2246:20 | ChiTotal | total:m2246_71 | +| ir.cpp:2246:20:2246:20 | Condition | r2246_46 | +| ir.cpp:2246:20:2246:20 | Load | m2246_23 | +| ir.cpp:2246:20:2246:20 | Load | m2246_23 | +| ir.cpp:2246:20:2246:20 | Load | m2246_39 | +| ir.cpp:2246:20:2246:20 | Phi | from 3:m2246_31 | +| ir.cpp:2246:20:2246:20 | Phi | from 3:~m2246_38 | +| ir.cpp:2246:20:2246:20 | Phi | from 5:m2246_82 | +| ir.cpp:2246:20:2246:20 | Phi | from 5:~m2246_79 | +| ir.cpp:2246:20:2246:20 | SideEffect | m2246_40 | +| ir.cpp:2246:20:2246:20 | SideEffect | ~m2246_19 | +| ir.cpp:2246:20:2246:20 | SideEffect | ~m2246_30 | +| ir.cpp:2246:20:2246:20 | SideEffect | ~m2246_41 | +| ir.cpp:2246:20:2246:20 | SideEffect | ~m2246_48 | +| ir.cpp:2246:20:2246:20 | SideEffect | ~m2246_71 | +| ir.cpp:2246:20:2246:20 | StoreValue | r2246_28 | +| ir.cpp:2246:20:2246:20 | StoreValue | r2246_36 | +| ir.cpp:2246:20:2246:20 | Unary | r2246_26 | +| ir.cpp:2246:20:2246:20 | Unary | r2246_34 | +| ir.cpp:2246:20:2246:20 | Unary | r2246_42 | +| ir.cpp:2246:20:2246:20 | Unary | r2246_53 | +| ir.cpp:2246:20:2246:20 | Unary | r2246_55 | +| ir.cpp:2246:20:2246:20 | Unary | r2246_77 | +| ir.cpp:2246:20:2246:50 | Address | &:r2246_2 | +| ir.cpp:2246:20:2246:50 | Address | &:r2246_2 | +| ir.cpp:2246:20:2246:50 | Arg(this) | this:r2246_2 | +| ir.cpp:2246:20:2246:50 | CallTarget | func:r2246_4 | +| ir.cpp:2246:20:2246:50 | ChiPartial | partial:m2246_18 | +| ir.cpp:2246:20:2246:50 | ChiPartial | partial:m2246_20 | +| ir.cpp:2246:20:2246:50 | ChiTotal | total:m2246_3 | +| ir.cpp:2246:20:2246:50 | ChiTotal | total:m2246_12 | +| ir.cpp:2246:20:2246:50 | SideEffect | ~m2246_12 | +| ir.cpp:2246:20:2246:50 | StoreValue | r2246_22 | +| ir.cpp:2246:20:2246:50 | Unary | r2246_2 | +| ir.cpp:2246:20:2246:51 | Address | &:r2246_60 | +| ir.cpp:2246:20:2246:51 | Arg(0) | 0:r2246_60 | +| ir.cpp:2246:20:2246:51 | SideEffect | ~m2246_63 | +| ir.cpp:2246:20:2246:51 | Unary | r2246_58 | +| ir.cpp:2246:20:2246:51 | Unary | r2246_59 | +| ir.cpp:2246:35:2246:49 | Address | &:r2246_5 | +| ir.cpp:2246:35:2246:49 | Address | &:r2246_5 | +| ir.cpp:2246:35:2246:49 | Address | &:r2246_5 | +| ir.cpp:2246:35:2246:49 | Arg(0) | 0:r2246_16 | +| ir.cpp:2246:35:2246:49 | Arg(this) | this:r2246_5 | +| ir.cpp:2246:35:2246:49 | CallTarget | func:r2246_7 | +| ir.cpp:2246:35:2246:49 | ChiPartial | partial:m2246_11 | +| ir.cpp:2246:35:2246:49 | ChiPartial | partial:m2246_14 | +| ir.cpp:2246:35:2246:49 | ChiTotal | total:m2242_35 | +| ir.cpp:2246:35:2246:49 | ChiTotal | total:m2246_6 | +| ir.cpp:2246:35:2246:49 | Load | m2246_15 | +| ir.cpp:2246:35:2246:49 | SideEffect | ~m2242_35 | +| ir.cpp:2246:42:2246:48 | Address | &:r2246_9 | +| ir.cpp:2246:42:2246:48 | Arg(0) | 0:r2246_9 | +| ir.cpp:2246:42:2246:48 | SideEffect | ~m2240_3 | +| ir.cpp:2246:42:2246:48 | Unary | r2246_8 | +| ir.cpp:2247:16:2247:17 | Address | &:r2247_1 | +| ir.cpp:2247:16:2247:17 | Address | &:r2247_1 | +| ir.cpp:2247:16:2247:17 | Arg(this) | this:r2247_1 | +| ir.cpp:2247:16:2247:17 | CallTarget | func:r2247_3 | +| ir.cpp:2247:16:2247:17 | ChiPartial | partial:m2247_5 | +| ir.cpp:2247:16:2247:17 | ChiPartial | partial:m2247_7 | +| ir.cpp:2247:16:2247:17 | ChiTotal | total:m2246_63 | +| ir.cpp:2247:16:2247:17 | ChiTotal | total:m2247_2 | +| ir.cpp:2247:16:2247:17 | SideEffect | ~m2246_63 | +| ir.cpp:2248:5:2248:5 | Address | &:r2248_1 | +| ir.cpp:2248:5:2248:5 | Address | &:r2248_1 | +| ir.cpp:2248:5:2248:5 | Arg(this) | this:r2248_1 | +| ir.cpp:2248:5:2248:5 | CallTarget | func:r2248_2 | +| ir.cpp:2248:5:2248:5 | ChiPartial | partial:m2248_4 | +| ir.cpp:2248:5:2248:5 | ChiPartial | partial:m2248_7 | +| ir.cpp:2248:5:2248:5 | ChiTotal | total:m2247_6 | +| ir.cpp:2248:5:2248:5 | ChiTotal | total:m2247_8 | +| ir.cpp:2248:5:2248:5 | SideEffect | m2247_8 | +| ir.cpp:2248:5:2248:5 | SideEffect | ~m2247_6 | +| ir.cpp:2250:16:2250:16 | Address | &:r2250_1 | +| ir.cpp:2250:16:2250:16 | Address | &:r2250_1 | +| ir.cpp:2250:16:2250:16 | Address | &:r2250_50 | +| ir.cpp:2250:16:2250:16 | Address | &:r2250_50 | +| ir.cpp:2250:16:2250:16 | Arg(this) | this:r2250_1 | +| ir.cpp:2250:16:2250:16 | Arg(this) | this:r2250_50 | +| ir.cpp:2250:16:2250:16 | CallTarget | func:r2250_51 | +| ir.cpp:2250:16:2250:16 | ChiPartial | partial:m2250_53 | +| ir.cpp:2250:16:2250:16 | ChiPartial | partial:m2250_56 | +| ir.cpp:2250:16:2250:16 | ChiTotal | total:m2250_23 | +| ir.cpp:2250:16:2250:16 | ChiTotal | total:m2250_46 | +| ir.cpp:2250:16:2250:16 | SideEffect | m2250_23 | +| ir.cpp:2250:16:2250:16 | SideEffect | ~m2250_46 | +| ir.cpp:2250:18:2250:24 | Address | &:r2250_5 | +| ir.cpp:2250:18:2250:24 | Arg(0) | 0:r2250_5 | +| ir.cpp:2250:18:2250:24 | SideEffect | ~m2240_3 | +| ir.cpp:2250:18:2250:24 | Unary | r2250_4 | +| ir.cpp:2250:18:2250:25 | CallTarget | func:r2250_3 | +| ir.cpp:2250:18:2250:25 | ChiPartial | partial:m2250_7 | +| ir.cpp:2250:18:2250:25 | ChiPartial | partial:m2250_10 | +| ir.cpp:2250:18:2250:25 | ChiTotal | total:m2246_48 | +| ir.cpp:2250:18:2250:25 | ChiTotal | total:m2250_2 | +| ir.cpp:2250:18:2250:25 | SideEffect | ~m2246_48 | +| ir.cpp:2250:28:2250:29 | Address | &:r2250_12 | +| ir.cpp:2250:28:2250:29 | Address | &:r2250_12 | +| ir.cpp:2250:28:2250:29 | Address | &:r2250_42 | +| ir.cpp:2250:28:2250:29 | Address | &:r2250_42 | +| ir.cpp:2250:28:2250:29 | Arg(this) | this:r2250_12 | +| ir.cpp:2250:28:2250:29 | Arg(this) | this:r2250_42 | +| ir.cpp:2250:28:2250:29 | CallTarget | func:r2250_43 | +| ir.cpp:2250:28:2250:29 | ChiPartial | partial:m2250_45 | +| ir.cpp:2250:28:2250:29 | ChiPartial | partial:m2250_48 | +| ir.cpp:2250:28:2250:29 | ChiTotal | total:m2250_22 | +| ir.cpp:2250:28:2250:29 | ChiTotal | total:m2250_24 | +| ir.cpp:2250:28:2250:29 | SideEffect | m2250_22 | +| ir.cpp:2250:28:2250:29 | SideEffect | ~m2250_24 | +| ir.cpp:2250:31:2250:37 | Address | &:r2250_16 | +| ir.cpp:2250:31:2250:37 | Arg(0) | 0:r2250_16 | +| ir.cpp:2250:31:2250:37 | SideEffect | ~m2240_3 | +| ir.cpp:2250:31:2250:37 | Unary | r2250_15 | +| ir.cpp:2250:31:2250:38 | CallTarget | func:r2250_14 | +| ir.cpp:2250:31:2250:38 | ChiPartial | partial:m2250_18 | +| ir.cpp:2250:31:2250:38 | ChiPartial | partial:m2250_21 | +| ir.cpp:2250:31:2250:38 | ChiTotal | total:m2250_8 | +| ir.cpp:2250:31:2250:38 | ChiTotal | total:m2250_13 | +| ir.cpp:2250:31:2250:38 | SideEffect | ~m2250_8 | +| ir.cpp:2250:41:2250:41 | Address | &:r2250_26 | +| ir.cpp:2250:41:2250:41 | Left | r2250_28 | +| ir.cpp:2250:41:2250:41 | Load | m2250_25 | +| ir.cpp:2250:41:2250:41 | Phi | from 6:m2242_14 | +| ir.cpp:2250:41:2250:41 | Phi | from 6:m2250_11 | +| ir.cpp:2250:41:2250:41 | Phi | from 6:~m2250_19 | +| ir.cpp:2250:41:2250:41 | Phi | from 8:m2250_39 | +| ir.cpp:2250:41:2250:41 | Phi | from 8:m2250_41 | +| ir.cpp:2250:41:2250:41 | Phi | from 8:~m2250_36 | +| ir.cpp:2250:41:2250:41 | Unary | r2250_27 | +| ir.cpp:2250:41:2250:46 | Condition | r2250_30 | +| ir.cpp:2250:46:2250:46 | Right | r2250_29 | +| ir.cpp:2250:49:2250:49 | Address | &:r2250_40 | +| ir.cpp:2250:53:2250:53 | Address | &:r2250_32 | +| ir.cpp:2250:53:2250:53 | Address | &:r2250_32 | +| ir.cpp:2250:53:2250:53 | Arg(this) | this:r2250_32 | +| ir.cpp:2250:53:2250:53 | ChiPartial | partial:m2250_38 | +| ir.cpp:2250:53:2250:53 | ChiTotal | total:m2250_23 | +| ir.cpp:2250:53:2250:53 | SideEffect | m2250_23 | +| ir.cpp:2250:55:2250:62 | CallTarget | func:r2250_33 | +| ir.cpp:2250:55:2250:62 | ChiPartial | partial:m2250_35 | +| ir.cpp:2250:55:2250:62 | ChiTotal | total:m2250_24 | +| ir.cpp:2250:55:2250:62 | SideEffect | ~m2250_24 | +| ir.cpp:2250:55:2250:62 | StoreValue | r2250_34 | +| ir.cpp:2251:9:2251:9 | Address | &:r2251_2 | +| ir.cpp:2251:13:2251:13 | StoreValue | r2251_1 | +| ir.cpp:2255:6:2255:19 | ChiPartial | partial:m2255_3 | +| ir.cpp:2255:6:2255:19 | ChiTotal | total:m2255_2 | +| ir.cpp:2255:6:2255:19 | SideEffect | ~m2260_5 | +| ir.cpp:2255:26:2255:26 | Address | &:r2255_5 | +| ir.cpp:2256:15:2256:15 | Address | &:r2256_1 | +| ir.cpp:2256:15:2256:15 | Address | &:r2256_1 | +| ir.cpp:2256:15:2256:15 | Arg(this) | this:r2256_1 | +| ir.cpp:2256:18:2256:33 | CallTarget | func:r2256_3 | +| ir.cpp:2256:18:2256:33 | ChiPartial | partial:m2256_7 | +| ir.cpp:2256:18:2256:33 | ChiPartial | partial:m2256_10 | +| ir.cpp:2256:18:2256:33 | ChiTotal | total:m2255_4 | +| ir.cpp:2256:18:2256:33 | ChiTotal | total:m2256_2 | +| ir.cpp:2256:18:2256:33 | SideEffect | ~m2255_4 | +| ir.cpp:2256:26:2256:32 | Address | &:r2256_5 | +| ir.cpp:2256:26:2256:32 | Arg(0) | 0:r2256_5 | +| ir.cpp:2256:26:2256:32 | SideEffect | ~m2255_3 | +| ir.cpp:2256:26:2256:32 | Unary | r2256_4 | +| ir.cpp:2256:36:2256:36 | Address | &:r2256_12 | +| ir.cpp:2256:36:2256:36 | Condition | r2256_13 | +| ir.cpp:2256:36:2256:36 | Load | m2255_6 | +| ir.cpp:2257:13:2257:13 | Address | &:r2257_1 | +| ir.cpp:2257:16:2257:17 | StoreValue | r2257_2 | +| ir.cpp:2259:13:2259:13 | Address | &:r2259_1 | +| ir.cpp:2259:16:2259:17 | StoreValue | r2259_2 | +| ir.cpp:2260:5:2260:5 | Address | &:r2260_1 | +| ir.cpp:2260:5:2260:5 | Address | &:r2260_1 | +| ir.cpp:2260:5:2260:5 | Arg(this) | this:r2260_1 | +| ir.cpp:2260:5:2260:5 | CallTarget | func:r2260_2 | +| ir.cpp:2260:5:2260:5 | ChiPartial | partial:m2260_4 | +| ir.cpp:2260:5:2260:5 | ChiPartial | partial:m2260_7 | +| ir.cpp:2260:5:2260:5 | ChiTotal | total:m2256_8 | +| ir.cpp:2260:5:2260:5 | ChiTotal | total:m2256_11 | +| ir.cpp:2260:5:2260:5 | SideEffect | m2256_11 | +| ir.cpp:2260:5:2260:5 | SideEffect | ~m2256_8 | +| ir.cpp:2270:6:2270:19 | ChiPartial | partial:m2270_3 | +| ir.cpp:2270:6:2270:19 | ChiTotal | total:m2270_2 | +| ir.cpp:2270:6:2270:19 | SideEffect | ~m2275_14 | +| ir.cpp:2270:26:2270:26 | Address | &:r2270_5 | +| ir.cpp:2271:8:2271:23 | Address | &:r2271_1 | +| ir.cpp:2271:8:2271:23 | Address | &:r2271_1 | +| ir.cpp:2271:8:2271:23 | Arg(this) | this:r2271_1 | +| ir.cpp:2271:8:2271:23 | Condition | r2271_19 | +| ir.cpp:2271:13:2271:13 | Address | &:r2271_11 | +| ir.cpp:2271:13:2271:13 | Address | &:r2271_11 | +| ir.cpp:2271:13:2271:13 | Arg(this) | this:r2271_11 | +| ir.cpp:2271:13:2271:13 | CallTarget | func:r2271_12 | +| ir.cpp:2271:13:2271:13 | ChiPartial | partial:m2271_14 | +| ir.cpp:2271:13:2271:13 | ChiPartial | partial:m2271_17 | +| ir.cpp:2271:13:2271:13 | ChiTotal | total:m2271_8 | +| ir.cpp:2271:13:2271:13 | ChiTotal | total:m2271_10 | +| ir.cpp:2271:13:2271:13 | SideEffect | m2271_10 | +| ir.cpp:2271:13:2271:13 | SideEffect | ~m2271_8 | +| ir.cpp:2271:13:2271:13 | Unary | r2271_13 | +| ir.cpp:2271:16:2271:23 | CallTarget | func:r2271_3 | +| ir.cpp:2271:16:2271:23 | ChiPartial | partial:m2271_7 | +| ir.cpp:2271:16:2271:23 | ChiPartial | partial:m2271_9 | +| ir.cpp:2271:16:2271:23 | ChiTotal | total:m2270_4 | +| ir.cpp:2271:16:2271:23 | ChiTotal | total:m2271_2 | +| ir.cpp:2271:16:2271:23 | SideEffect | ~m2270_4 | +| ir.cpp:2271:22:2271:22 | Address | &:r2271_4 | +| ir.cpp:2271:22:2271:22 | Arg(0) | 0:r2271_5 | +| ir.cpp:2271:22:2271:22 | Load | m2270_6 | +| ir.cpp:2272:16:2272:17 | Address | &:r2272_1 | +| ir.cpp:2272:16:2272:17 | Address | &:r2272_1 | +| ir.cpp:2272:16:2272:17 | Arg(this) | this:r2272_1 | +| ir.cpp:2272:16:2272:17 | CallTarget | func:r2272_3 | +| ir.cpp:2272:16:2272:17 | ChiPartial | partial:m2272_5 | +| ir.cpp:2272:16:2272:17 | ChiPartial | partial:m2272_7 | +| ir.cpp:2272:16:2272:17 | ChiTotal | total:m2271_15 | +| ir.cpp:2272:16:2272:17 | ChiTotal | total:m2272_2 | +| ir.cpp:2272:16:2272:17 | SideEffect | ~m2271_15 | +| ir.cpp:2273:5:2273:5 | Address | &:r2273_1 | +| ir.cpp:2273:5:2273:5 | Address | &:r2273_1 | +| ir.cpp:2273:5:2273:5 | Arg(this) | this:r2273_1 | +| ir.cpp:2273:5:2273:5 | CallTarget | func:r2273_2 | +| ir.cpp:2273:5:2273:5 | ChiPartial | partial:m2273_4 | +| ir.cpp:2273:5:2273:5 | ChiPartial | partial:m2273_7 | +| ir.cpp:2273:5:2273:5 | ChiTotal | total:m2272_6 | +| ir.cpp:2273:5:2273:5 | ChiTotal | total:m2272_8 | +| ir.cpp:2273:5:2273:5 | SideEffect | m2272_8 | +| ir.cpp:2273:5:2273:5 | SideEffect | ~m2272_6 | +| ir.cpp:2274:16:2274:17 | Address | &:r2274_1 | +| ir.cpp:2274:16:2274:17 | Address | &:r2274_1 | +| ir.cpp:2274:16:2274:17 | Arg(this) | this:r2274_1 | +| ir.cpp:2274:16:2274:17 | CallTarget | func:r2274_3 | +| ir.cpp:2274:16:2274:17 | ChiPartial | partial:m2274_5 | +| ir.cpp:2274:16:2274:17 | ChiPartial | partial:m2274_7 | +| ir.cpp:2274:16:2274:17 | ChiTotal | total:m2271_15 | +| ir.cpp:2274:16:2274:17 | ChiTotal | total:m2274_2 | +| ir.cpp:2274:16:2274:17 | SideEffect | ~m2271_15 | +| ir.cpp:2275:5:2275:5 | Address | &:r2275_1 | +| ir.cpp:2275:5:2275:5 | Address | &:r2275_1 | +| ir.cpp:2275:5:2275:5 | Address | &:r2275_10 | +| ir.cpp:2275:5:2275:5 | Address | &:r2275_10 | +| ir.cpp:2275:5:2275:5 | Arg(this) | this:r2275_1 | +| ir.cpp:2275:5:2275:5 | Arg(this) | this:r2275_10 | +| ir.cpp:2275:5:2275:5 | CallTarget | func:r2275_2 | +| ir.cpp:2275:5:2275:5 | CallTarget | func:r2275_11 | +| ir.cpp:2275:5:2275:5 | ChiPartial | partial:m2275_4 | +| ir.cpp:2275:5:2275:5 | ChiPartial | partial:m2275_7 | +| ir.cpp:2275:5:2275:5 | ChiPartial | partial:m2275_13 | +| ir.cpp:2275:5:2275:5 | ChiPartial | partial:m2275_16 | +| ir.cpp:2275:5:2275:5 | ChiTotal | total:m2271_18 | +| ir.cpp:2275:5:2275:5 | ChiTotal | total:m2274_6 | +| ir.cpp:2275:5:2275:5 | ChiTotal | total:m2274_8 | +| ir.cpp:2275:5:2275:5 | ChiTotal | total:m2275_9 | +| ir.cpp:2275:5:2275:5 | Phi | from 1:~m2273_5 | +| ir.cpp:2275:5:2275:5 | Phi | from 2:~m2275_5 | +| ir.cpp:2275:5:2275:5 | SideEffect | m2271_18 | +| ir.cpp:2275:5:2275:5 | SideEffect | m2274_8 | +| ir.cpp:2275:5:2275:5 | SideEffect | ~m2274_6 | +| ir.cpp:2275:5:2275:5 | SideEffect | ~m2275_9 | +| ir.cpp:2278:6:2278:25 | ChiPartial | partial:m2278_3 | +| ir.cpp:2278:6:2278:25 | ChiTotal | total:m2278_2 | +| ir.cpp:2278:6:2278:25 | SideEffect | ~m2289_13 | +| ir.cpp:2278:32:2278:32 | Address | &:r2278_5 | +| ir.cpp:2280:16:2280:16 | Address | &:r2280_1 | +| ir.cpp:2280:16:2280:16 | Address | &:r2280_1 | +| ir.cpp:2280:16:2280:16 | Arg(this) | this:r2280_1 | +| ir.cpp:2280:16:2280:16 | CallTarget | func:r2280_3 | +| ir.cpp:2280:16:2280:16 | ChiPartial | partial:m2280_5 | +| ir.cpp:2280:16:2280:16 | ChiPartial | partial:m2280_7 | +| ir.cpp:2280:16:2280:16 | ChiTotal | total:m2278_4 | +| ir.cpp:2280:16:2280:16 | ChiTotal | total:m2280_2 | +| ir.cpp:2280:16:2280:16 | SideEffect | ~m2278_4 | +| ir.cpp:2281:15:2281:15 | Address | &:r2281_2 | +| ir.cpp:2281:15:2281:15 | Condition | r2281_3 | +| ir.cpp:2281:15:2281:15 | Load | m2281_1 | +| ir.cpp:2281:15:2281:15 | Phi | from 0:m2278_6 | +| ir.cpp:2281:15:2281:15 | Phi | from 2:m2282_3 | +| ir.cpp:2282:13:2282:13 | Address | &:r2282_2 | +| ir.cpp:2282:17:2282:21 | StoreValue | r2282_1 | +| ir.cpp:2284:5:2284:5 | Address | &:r2284_1 | +| ir.cpp:2284:5:2284:5 | Address | &:r2284_1 | +| ir.cpp:2284:5:2284:5 | Arg(this) | this:r2284_1 | +| ir.cpp:2284:5:2284:5 | CallTarget | func:r2284_2 | +| ir.cpp:2284:5:2284:5 | ChiPartial | partial:m2284_4 | +| ir.cpp:2284:5:2284:5 | ChiPartial | partial:m2284_7 | +| ir.cpp:2284:5:2284:5 | ChiTotal | total:m2280_6 | +| ir.cpp:2284:5:2284:5 | ChiTotal | total:m2280_8 | +| ir.cpp:2284:5:2284:5 | SideEffect | m2280_8 | +| ir.cpp:2284:5:2284:5 | SideEffect | ~m2280_6 | +| ir.cpp:2287:16:2287:31 | Address | &:r2287_3 | +| ir.cpp:2287:16:2287:31 | Address | &:r2287_3 | +| ir.cpp:2287:16:2287:31 | Arg(this) | this:r2287_3 | +| ir.cpp:2287:16:2287:31 | Condition | r2287_21 | +| ir.cpp:2287:16:2287:31 | Phi | from 3:m2281_1 | +| ir.cpp:2287:16:2287:31 | Phi | from 3:~m2284_5 | +| ir.cpp:2287:16:2287:31 | Phi | from 5:m2288_3 | +| ir.cpp:2287:16:2287:31 | Phi | from 5:~m2289_5 | +| ir.cpp:2287:21:2287:21 | Address | &:r2287_13 | +| ir.cpp:2287:21:2287:21 | Address | &:r2287_13 | +| ir.cpp:2287:21:2287:21 | Arg(this) | this:r2287_13 | +| ir.cpp:2287:21:2287:21 | CallTarget | func:r2287_14 | +| ir.cpp:2287:21:2287:21 | ChiPartial | partial:m2287_16 | +| ir.cpp:2287:21:2287:21 | ChiPartial | partial:m2287_19 | +| ir.cpp:2287:21:2287:21 | ChiTotal | total:m2287_10 | +| ir.cpp:2287:21:2287:21 | ChiTotal | total:m2287_12 | +| ir.cpp:2287:21:2287:21 | SideEffect | m2287_12 | +| ir.cpp:2287:21:2287:21 | SideEffect | ~m2287_10 | +| ir.cpp:2287:21:2287:21 | Unary | r2287_15 | +| ir.cpp:2287:24:2287:31 | CallTarget | func:r2287_5 | +| ir.cpp:2287:24:2287:31 | ChiPartial | partial:m2287_9 | +| ir.cpp:2287:24:2287:31 | ChiPartial | partial:m2287_11 | +| ir.cpp:2287:24:2287:31 | ChiTotal | total:m2287_1 | +| ir.cpp:2287:24:2287:31 | ChiTotal | total:m2287_4 | +| ir.cpp:2287:24:2287:31 | SideEffect | ~m2287_1 | +| ir.cpp:2287:30:2287:30 | Address | &:r2287_6 | +| ir.cpp:2287:30:2287:30 | Arg(0) | 0:r2287_7 | +| ir.cpp:2287:30:2287:30 | Load | m2287_2 | +| ir.cpp:2288:13:2288:13 | Address | &:r2288_2 | +| ir.cpp:2288:17:2288:21 | StoreValue | r2288_1 | +| ir.cpp:2289:9:2289:9 | Address | &:r2289_1 | +| ir.cpp:2289:9:2289:9 | Address | &:r2289_1 | +| ir.cpp:2289:9:2289:9 | Address | &:r2289_9 | +| ir.cpp:2289:9:2289:9 | Address | &:r2289_9 | +| ir.cpp:2289:9:2289:9 | Arg(this) | this:r2289_1 | +| ir.cpp:2289:9:2289:9 | Arg(this) | this:r2289_9 | +| ir.cpp:2289:9:2289:9 | CallTarget | func:r2289_2 | +| ir.cpp:2289:9:2289:9 | CallTarget | func:r2289_10 | +| ir.cpp:2289:9:2289:9 | ChiPartial | partial:m2289_4 | +| ir.cpp:2289:9:2289:9 | ChiPartial | partial:m2289_7 | +| ir.cpp:2289:9:2289:9 | ChiPartial | partial:m2289_12 | +| ir.cpp:2289:9:2289:9 | ChiPartial | partial:m2289_15 | +| ir.cpp:2289:9:2289:9 | ChiTotal | total:m2287_17 | +| ir.cpp:2289:9:2289:9 | ChiTotal | total:m2287_17 | +| ir.cpp:2289:9:2289:9 | ChiTotal | total:m2287_20 | +| ir.cpp:2289:9:2289:9 | ChiTotal | total:m2287_20 | +| ir.cpp:2289:9:2289:9 | SideEffect | m2287_20 | +| ir.cpp:2289:9:2289:9 | SideEffect | m2287_20 | +| ir.cpp:2289:9:2289:9 | SideEffect | ~m2287_17 | +| ir.cpp:2289:9:2289:9 | SideEffect | ~m2287_17 | +| ir.cpp:2293:6:2293:13 | ChiPartial | partial:m2293_3 | +| ir.cpp:2293:6:2293:13 | ChiTotal | total:m2293_2 | +| ir.cpp:2293:6:2293:13 | SideEffect | m2293_3 | +| ir.cpp:2295:6:2295:24 | ChiPartial | partial:m2295_3 | +| ir.cpp:2295:6:2295:24 | ChiTotal | total:m2295_2 | +| ir.cpp:2295:6:2295:24 | Phi | from 2:~m2304_5 | +| ir.cpp:2295:6:2295:24 | Phi | from 4:~m2304_13 | +| ir.cpp:2295:6:2295:24 | Phi | from 5:~m2304_22 | +| ir.cpp:2295:6:2295:24 | SideEffect | ~m2295_7 | +| ir.cpp:2295:31:2295:31 | Address | &:r2295_5 | +| ir.cpp:2296:12:2296:12 | Address | &:r2296_1 | +| ir.cpp:2296:12:2296:12 | Address | &:r2296_1 | +| ir.cpp:2296:12:2296:12 | Arg(this) | this:r2296_1 | +| ir.cpp:2296:12:2296:12 | CallTarget | func:r2296_3 | +| ir.cpp:2296:12:2296:12 | ChiPartial | partial:m2296_5 | +| ir.cpp:2296:12:2296:12 | ChiPartial | partial:m2296_7 | +| ir.cpp:2296:12:2296:12 | ChiTotal | total:m2295_4 | +| ir.cpp:2296:12:2296:12 | ChiTotal | total:m2296_2 | +| ir.cpp:2296:12:2296:12 | SideEffect | ~m2295_4 | +| ir.cpp:2297:8:2297:8 | Address | &:r2297_1 | +| ir.cpp:2297:8:2297:8 | Condition | r2297_2 | +| ir.cpp:2297:8:2297:8 | Load | m2295_6 | +| ir.cpp:2300:8:2300:8 | Address | &:r2300_1 | +| ir.cpp:2300:8:2300:8 | Condition | r2300_2 | +| ir.cpp:2300:8:2300:8 | Load | m2295_6 | +| ir.cpp:2301:16:2301:23 | CallTarget | func:r2301_1 | +| ir.cpp:2301:16:2301:23 | ChiPartial | partial:m2301_3 | +| ir.cpp:2301:16:2301:23 | ChiTotal | total:m2296_6 | +| ir.cpp:2301:16:2301:23 | SideEffect | ~m2296_6 | +| ir.cpp:2304:1:2304:1 | Address | &:r2304_1 | +| ir.cpp:2304:1:2304:1 | Address | &:r2304_1 | +| ir.cpp:2304:1:2304:1 | Address | &:r2304_9 | +| ir.cpp:2304:1:2304:1 | Address | &:r2304_9 | +| ir.cpp:2304:1:2304:1 | Address | &:r2304_18 | +| ir.cpp:2304:1:2304:1 | Address | &:r2304_18 | +| ir.cpp:2304:1:2304:1 | Arg(this) | this:r2304_1 | +| ir.cpp:2304:1:2304:1 | Arg(this) | this:r2304_9 | +| ir.cpp:2304:1:2304:1 | Arg(this) | this:r2304_18 | +| ir.cpp:2304:1:2304:1 | CallTarget | func:r2304_2 | +| ir.cpp:2304:1:2304:1 | CallTarget | func:r2304_10 | +| ir.cpp:2304:1:2304:1 | CallTarget | func:r2304_19 | +| ir.cpp:2304:1:2304:1 | ChiPartial | partial:m2304_4 | +| ir.cpp:2304:1:2304:1 | ChiPartial | partial:m2304_7 | +| ir.cpp:2304:1:2304:1 | ChiPartial | partial:m2304_12 | +| ir.cpp:2304:1:2304:1 | ChiPartial | partial:m2304_15 | +| ir.cpp:2304:1:2304:1 | ChiPartial | partial:m2304_21 | +| ir.cpp:2304:1:2304:1 | ChiPartial | partial:m2304_24 | +| ir.cpp:2304:1:2304:1 | ChiTotal | total:m2296_6 | +| ir.cpp:2304:1:2304:1 | ChiTotal | total:m2296_6 | +| ir.cpp:2304:1:2304:1 | ChiTotal | total:m2296_8 | +| ir.cpp:2304:1:2304:1 | ChiTotal | total:m2296_8 | +| ir.cpp:2304:1:2304:1 | ChiTotal | total:m2296_8 | +| ir.cpp:2304:1:2304:1 | ChiTotal | total:m2301_4 | +| ir.cpp:2304:1:2304:1 | SideEffect | m2296_8 | +| ir.cpp:2304:1:2304:1 | SideEffect | m2296_8 | +| ir.cpp:2304:1:2304:1 | SideEffect | m2296_8 | +| ir.cpp:2304:1:2304:1 | SideEffect | ~m2296_6 | +| ir.cpp:2304:1:2304:1 | SideEffect | ~m2296_6 | +| ir.cpp:2304:1:2304:1 | SideEffect | ~m2301_4 | +| ir.cpp:2306:5:2306:24 | Address | &:r2306_9 | +| ir.cpp:2306:5:2306:24 | ChiPartial | partial:m2306_3 | +| ir.cpp:2306:5:2306:24 | ChiTotal | total:m2306_2 | +| ir.cpp:2306:5:2306:24 | Load | m2306_8 | +| ir.cpp:2306:5:2306:24 | Phi | from 2:m2309_3 | +| ir.cpp:2306:5:2306:24 | Phi | from 2:~m2312_5 | +| ir.cpp:2306:5:2306:24 | Phi | from 3:m2311_3 | +| ir.cpp:2306:5:2306:24 | Phi | from 3:~m2312_13 | +| ir.cpp:2306:5:2306:24 | SideEffect | ~m2306_7 | +| ir.cpp:2306:31:2306:31 | Address | &:r2306_5 | +| ir.cpp:2307:12:2307:12 | Address | &:r2307_1 | +| ir.cpp:2307:12:2307:12 | Address | &:r2307_1 | +| ir.cpp:2307:12:2307:12 | Arg(this) | this:r2307_1 | +| ir.cpp:2307:12:2307:12 | CallTarget | func:r2307_3 | +| ir.cpp:2307:12:2307:12 | ChiPartial | partial:m2307_5 | +| ir.cpp:2307:12:2307:12 | ChiPartial | partial:m2307_7 | +| ir.cpp:2307:12:2307:12 | ChiTotal | total:m2306_4 | +| ir.cpp:2307:12:2307:12 | ChiTotal | total:m2307_2 | +| ir.cpp:2307:12:2307:12 | SideEffect | ~m2306_4 | +| ir.cpp:2308:8:2308:8 | Address | &:r2308_1 | +| ir.cpp:2308:8:2308:8 | Condition | r2308_2 | +| ir.cpp:2308:8:2308:8 | Load | m2306_6 | +| ir.cpp:2309:9:2309:17 | Address | &:r2309_1 | +| ir.cpp:2309:16:2309:16 | StoreValue | r2309_2 | +| ir.cpp:2311:5:2311:13 | Address | &:r2311_1 | +| ir.cpp:2311:12:2311:12 | StoreValue | r2311_2 | +| ir.cpp:2312:1:2312:1 | Address | &:r2312_1 | +| ir.cpp:2312:1:2312:1 | Address | &:r2312_1 | +| ir.cpp:2312:1:2312:1 | Address | &:r2312_9 | +| ir.cpp:2312:1:2312:1 | Address | &:r2312_9 | +| ir.cpp:2312:1:2312:1 | Arg(this) | this:r2312_1 | +| ir.cpp:2312:1:2312:1 | Arg(this) | this:r2312_9 | +| ir.cpp:2312:1:2312:1 | CallTarget | func:r2312_2 | +| ir.cpp:2312:1:2312:1 | CallTarget | func:r2312_10 | +| ir.cpp:2312:1:2312:1 | ChiPartial | partial:m2312_4 | +| ir.cpp:2312:1:2312:1 | ChiPartial | partial:m2312_7 | +| ir.cpp:2312:1:2312:1 | ChiPartial | partial:m2312_12 | +| ir.cpp:2312:1:2312:1 | ChiPartial | partial:m2312_15 | +| ir.cpp:2312:1:2312:1 | ChiTotal | total:m2307_6 | +| ir.cpp:2312:1:2312:1 | ChiTotal | total:m2307_6 | +| ir.cpp:2312:1:2312:1 | ChiTotal | total:m2307_8 | +| ir.cpp:2312:1:2312:1 | ChiTotal | total:m2307_8 | +| ir.cpp:2312:1:2312:1 | SideEffect | m2307_8 | +| ir.cpp:2312:1:2312:1 | SideEffect | m2307_8 | +| ir.cpp:2312:1:2312:1 | SideEffect | ~m2307_6 | +| ir.cpp:2312:1:2312:1 | SideEffect | ~m2307_6 | +| ir.cpp:2314:6:2314:26 | ChiPartial | partial:m2314_3 | +| ir.cpp:2314:6:2314:26 | ChiTotal | total:m2314_2 | +| ir.cpp:2314:6:2314:26 | SideEffect | ~m2317_5 | +| ir.cpp:2315:12:2315:12 | Address | &:r2315_1 | +| ir.cpp:2315:12:2315:12 | Address | &:r2315_1 | +| ir.cpp:2315:12:2315:12 | Arg(this) | this:r2315_1 | +| ir.cpp:2315:12:2315:12 | CallTarget | func:r2315_3 | +| ir.cpp:2315:12:2315:12 | ChiPartial | partial:m2315_5 | +| ir.cpp:2315:12:2315:12 | ChiPartial | partial:m2315_7 | +| ir.cpp:2315:12:2315:12 | ChiTotal | total:m2314_4 | +| ir.cpp:2315:12:2315:12 | ChiTotal | total:m2315_2 | +| ir.cpp:2315:12:2315:12 | SideEffect | ~m2314_4 | +| ir.cpp:2316:12:2316:19 | CallTarget | func:r2316_1 | +| ir.cpp:2316:12:2316:19 | ChiPartial | partial:m2316_3 | +| ir.cpp:2316:12:2316:19 | ChiTotal | total:m2315_6 | +| ir.cpp:2316:12:2316:19 | SideEffect | ~m2315_6 | +| ir.cpp:2317:1:2317:1 | Address | &:r2317_1 | +| ir.cpp:2317:1:2317:1 | Address | &:r2317_1 | +| ir.cpp:2317:1:2317:1 | Arg(this) | this:r2317_1 | +| ir.cpp:2317:1:2317:1 | CallTarget | func:r2317_2 | +| ir.cpp:2317:1:2317:1 | ChiPartial | partial:m2317_4 | +| ir.cpp:2317:1:2317:1 | ChiPartial | partial:m2317_7 | +| ir.cpp:2317:1:2317:1 | ChiTotal | total:m2315_8 | +| ir.cpp:2317:1:2317:1 | ChiTotal | total:m2316_4 | +| ir.cpp:2317:1:2317:1 | SideEffect | m2315_8 | +| ir.cpp:2317:1:2317:1 | SideEffect | ~m2316_4 | +| ir.cpp:2327:32:2327:47 | Address | &:r2327_5 | +| ir.cpp:2327:32:2327:47 | ChiPartial | partial:m2327_3 | +| ir.cpp:2327:32:2327:47 | ChiTotal | total:m2327_2 | +| ir.cpp:2327:32:2327:47 | Load | m2329_3 | +| ir.cpp:2327:32:2327:47 | SideEffect | m2327_3 | +| ir.cpp:2329:9:2329:44 | Address | &:r2329_1 | +| ir.cpp:2329:16:2329:43 | StoreValue | r2329_2 | | 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 | @@ -10667,6 +12114,11 @@ | smart_ptr.cpp:12:24:12:28 | StoreValue | r12_7 | | smart_ptr.cpp:12:25:12:26 | Arg(0) | 0:r12_5 | | smart_ptr.cpp:12:25:12:26 | Unary | r12_4 | +| smart_ptr.cpp:13:1:13:1 | Address | &:r13_2 | +| smart_ptr.cpp:13:1:13:1 | Address | &:r13_2 | +| smart_ptr.cpp:13:1:13:1 | Arg(this) | this:r13_2 | +| smart_ptr.cpp:13:1:13:1 | CallTarget | func:r13_3 | +| smart_ptr.cpp:13:1:13:1 | SideEffect | m11_9 | | smart_ptr.cpp:17:6:17:24 | ChiPartial | partial:m17_3 | | smart_ptr.cpp:17:6:17:24 | ChiTotal | total:m17_2 | | smart_ptr.cpp:17:6:17:24 | SideEffect | ~m19_16 | @@ -10710,6 +12162,11 @@ | smart_ptr.cpp:19:20:19:21 | SideEffect | ~m18_8 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_5 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_6 | +| smart_ptr.cpp:20:1:20:1 | Address | &:r20_2 | +| smart_ptr.cpp:20:1:20:1 | Address | &:r20_2 | +| smart_ptr.cpp:20:1:20:1 | Arg(this) | this:r20_2 | +| smart_ptr.cpp:20:1:20:1 | CallTarget | func:r20_3 | +| smart_ptr.cpp:20:1:20:1 | SideEffect | m18_9 | | smart_ptr.cpp:28:6:28:27 | ChiPartial | partial:m28_3 | | smart_ptr.cpp:28:6:28:27 | ChiTotal | total:m28_2 | | smart_ptr.cpp:28:6:28:27 | SideEffect | ~m47_16 | @@ -10832,6 +12289,31 @@ | smart_ptr.cpp:47:43:47:63 | SideEffect | ~m47_16 | | smart_ptr.cpp:47:43:47:63 | Unary | r47_5 | | smart_ptr.cpp:47:43:47:63 | Unary | r47_6 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_2 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_2 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_7 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_7 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_12 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_12 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_17 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_17 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_22 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_22 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_2 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_7 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_12 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_17 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_22 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_3 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_8 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_13 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_18 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_23 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m29_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m33_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m37_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m41_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m45_2 | | struct_init.cpp:9:13:9:25 | Left | r9_3 | | struct_init.cpp:9:13:9:25 | Left | r9_3 | | struct_init.cpp:9:13:9:25 | SideEffect | ~m11_10 | 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 313f09530cd..91760c805b9 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -3526,42 +3526,66 @@ ir.cpp: # 615| void DeclareObject() # 615| Block 0 -# 615| v615_1(void) = EnterFunction : -# 615| mu615_2(unknown) = AliasedDefinition : -# 615| mu615_3(unknown) = InitializeNonLocal : -# 616| r616_1(glval) = VariableAddress[s1] : -# 616| mu616_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| mu616_5(unknown) = ^CallSideEffect : ~m? -# 616| mu616_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 -# 617| r617_1(glval) = VariableAddress[s2] : -# 617| mu617_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| mu617_7(unknown) = ^CallSideEffect : ~m? -# 617| v617_8(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m? -# 617| mu617_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 -# 618| r618_1(glval) = VariableAddress[s3] : -# 618| r618_2(glval) = FunctionAddress[ReturnObject] : -# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 -# 618| mu618_4(unknown) = ^CallSideEffect : ~m? -# 618| mu618_5(String) = Store[s3] : &:r618_1, r618_3 -# 619| r619_1(glval) = VariableAddress[s4] : -# 619| mu619_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| mu619_7(unknown) = ^CallSideEffect : ~m? -# 619| v619_8(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m? -# 619| mu619_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 -# 620| v620_1(void) = NoOp : -# 615| v615_4(void) = ReturnVoid : -# 615| v615_5(void) = AliasedUse : ~m? -# 615| v615_6(void) = ExitFunction : +# 615| v615_1(void) = EnterFunction : +# 615| mu615_2(unknown) = AliasedDefinition : +# 615| mu615_3(unknown) = InitializeNonLocal : +# 616| r616_1(glval) = VariableAddress[s1] : +# 616| mu616_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| mu616_5(unknown) = ^CallSideEffect : ~m? +# 616| mu616_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 +# 617| r617_1(glval) = VariableAddress[s2] : +# 617| mu617_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| mu617_7(unknown) = ^CallSideEffect : ~m? +# 617| v617_8(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m? +# 617| mu617_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 +# 618| r618_1(glval) = VariableAddress[s3] : +# 618| r618_2(glval) = FunctionAddress[ReturnObject] : +# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 +# 618| mu618_4(unknown) = ^CallSideEffect : ~m? +# 618| mu618_5(String) = Store[s3] : &:r618_1, r618_3 +# 619| r619_1(glval) = VariableAddress[s4] : +# 619| mu619_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| mu619_7(unknown) = ^CallSideEffect : ~m? +# 619| v619_8(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m? +# 619| mu619_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 +# 620| v620_1(void) = NoOp : +# 620| r620_2(glval) = VariableAddress[s4] : +# 620| r620_3(glval) = FunctionAddress[~String] : +# 620| v620_4(void) = Call[~String] : func:r620_3, this:r620_2 +# 620| mu620_5(unknown) = ^CallSideEffect : ~m? +# 620| v620_6(void) = ^IndirectReadSideEffect[-1] : &:r620_2, ~m? +# 620| mu620_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_2 +# 620| r620_8(glval) = VariableAddress[s3] : +# 620| r620_9(glval) = FunctionAddress[~String] : +# 620| v620_10(void) = Call[~String] : func:r620_9, this:r620_8 +# 620| mu620_11(unknown) = ^CallSideEffect : ~m? +# 620| v620_12(void) = ^IndirectReadSideEffect[-1] : &:r620_8, ~m? +# 620| mu620_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_8 +# 620| r620_14(glval) = VariableAddress[s2] : +# 620| r620_15(glval) = FunctionAddress[~String] : +# 620| v620_16(void) = Call[~String] : func:r620_15, this:r620_14 +# 620| mu620_17(unknown) = ^CallSideEffect : ~m? +# 620| v620_18(void) = ^IndirectReadSideEffect[-1] : &:r620_14, ~m? +# 620| mu620_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_14 +# 620| r620_20(glval) = VariableAddress[s1] : +# 620| r620_21(glval) = FunctionAddress[~String] : +# 620| v620_22(void) = Call[~String] : func:r620_21, this:r620_20 +# 620| mu620_23(unknown) = ^CallSideEffect : ~m? +# 620| v620_24(void) = ^IndirectReadSideEffect[-1] : &:r620_20, ~m? +# 620| mu620_25(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_20 +# 615| v615_4(void) = ReturnVoid : +# 615| v615_5(void) = AliasedUse : ~m? +# 615| v615_6(void) = ExitFunction : # 622| void CallMethods(String&, String*, String) # 622| Block 0 @@ -4924,6 +4948,24 @@ ir.cpp: # 839| r839_4(glval) = VariableAddress[pb] : # 839| mu839_5(Base *) = Store[pb] : &:r839_4, r839_3 # 840| v840_1(void) = NoOp : +# 840| r840_2(glval) = VariableAddress[d] : +# 840| r840_3(glval) = FunctionAddress[~Derived] : +# 840| v840_4(void) = Call[~Derived] : func:r840_3, this:r840_2 +# 840| mu840_5(unknown) = ^CallSideEffect : ~m? +# 840| v840_6(void) = ^IndirectReadSideEffect[-1] : &:r840_2, ~m? +# 840| mu840_7(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r840_2 +# 840| r840_8(glval) = VariableAddress[m] : +# 840| r840_9(glval) = FunctionAddress[~Middle] : +# 840| v840_10(void) = Call[~Middle] : func:r840_9, this:r840_8 +# 840| mu840_11(unknown) = ^CallSideEffect : ~m? +# 840| v840_12(void) = ^IndirectReadSideEffect[-1] : &:r840_8, ~m? +# 840| mu840_13(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r840_8 +# 840| r840_14(glval) = VariableAddress[b] : +# 840| r840_15(glval) = FunctionAddress[~Base] : +# 840| v840_16(void) = Call[~Base] : func:r840_15, this:r840_14 +# 840| mu840_17(unknown) = ^CallSideEffect : ~m? +# 840| v840_18(void) = ^IndirectReadSideEffect[-1] : &:r840_14, ~m? +# 840| mu840_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r840_14 # 799| v799_4(void) = ReturnVoid : # 799| v799_5(void) = AliasedUse : ~m? # 799| v799_6(void) = ExitFunction : @@ -4984,63 +5026,75 @@ ir.cpp: # 849| void DynamicCast() # 849| Block 0 -# 849| v849_1(void) = EnterFunction : -# 849| mu849_2(unknown) = AliasedDefinition : -# 849| mu849_3(unknown) = InitializeNonLocal : -# 850| r850_1(glval) = VariableAddress[b] : -# 850| mu850_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| mu850_5(unknown) = ^CallSideEffect : ~m? -# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 -# 851| r851_1(glval) = VariableAddress[d] : -# 851| mu851_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| mu851_5(unknown) = ^CallSideEffect : ~m? -# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 -# 853| r853_1(glval) = VariableAddress[pb] : -# 853| r853_2(glval) = VariableAddress[b] : -# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 -# 853| mu853_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| mu854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 -# 857| r857_1(glval) = VariableAddress[pd] : -# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, ~m? -# 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 -# 857| r857_4(glval) = VariableAddress[pb] : -# 857| mu857_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| mu858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 -# 860| r860_1(glval) = VariableAddress[pb] : -# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, ~m? -# 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 -# 860| r860_4(glval) = VariableAddress[pd] : -# 860| mu860_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| mu861_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, ~m? -# 863| r863_4(void *) = CompleteObjectAddress : r863_3 -# 863| mu863_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, ~m? -# 864| r864_4(void *) = CompleteObjectAddress : r864_3 -# 864| mu864_5(void *) = Store[pcv] : &:r864_1, r864_4 -# 865| v865_1(void) = NoOp : -# 849| v849_4(void) = ReturnVoid : -# 849| v849_5(void) = AliasedUse : ~m? -# 849| v849_6(void) = ExitFunction : +# 849| v849_1(void) = EnterFunction : +# 849| mu849_2(unknown) = AliasedDefinition : +# 849| mu849_3(unknown) = InitializeNonLocal : +# 850| r850_1(glval) = VariableAddress[b] : +# 850| mu850_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| mu850_5(unknown) = ^CallSideEffect : ~m? +# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +# 851| r851_1(glval) = VariableAddress[d] : +# 851| mu851_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| mu851_5(unknown) = ^CallSideEffect : ~m? +# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 +# 853| r853_1(glval) = VariableAddress[pb] : +# 853| r853_2(glval) = VariableAddress[b] : +# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 +# 853| mu853_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| mu854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 +# 857| r857_1(glval) = VariableAddress[pd] : +# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, ~m? +# 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 +# 857| r857_4(glval) = VariableAddress[pb] : +# 857| mu857_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| mu858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 +# 860| r860_1(glval) = VariableAddress[pb] : +# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, ~m? +# 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 +# 860| r860_4(glval) = VariableAddress[pd] : +# 860| mu860_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| mu861_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, ~m? +# 863| r863_4(void *) = CompleteObjectAddress : r863_3 +# 863| mu863_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, ~m? +# 864| r864_4(void *) = CompleteObjectAddress : r864_3 +# 864| mu864_5(void *) = Store[pcv] : &:r864_1, r864_4 +# 865| v865_1(void) = NoOp : +# 865| r865_2(glval) = VariableAddress[d] : +# 865| r865_3(glval) = FunctionAddress[~PolymorphicDerived] : +# 865| v865_4(void) = Call[~PolymorphicDerived] : func:r865_3, this:r865_2 +# 865| mu865_5(unknown) = ^CallSideEffect : ~m? +# 865| v865_6(void) = ^IndirectReadSideEffect[-1] : &:r865_2, ~m? +# 865| mu865_7(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r865_2 +# 865| r865_8(glval) = VariableAddress[b] : +# 865| r865_9(glval) = FunctionAddress[~PolymorphicBase] : +# 865| v865_10(void) = Call[~PolymorphicBase] : func:r865_9, this:r865_8 +# 865| mu865_11(unknown) = ^CallSideEffect : ~m? +# 865| v865_12(void) = ^IndirectReadSideEffect[-1] : &:r865_8, ~m? +# 865| mu865_13(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r865_8 +# 849| v849_4(void) = ReturnVoid : +# 849| v849_5(void) = AliasedUse : ~m? +# 849| v849_6(void) = ExitFunction : # 867| void String::String() # 867| Block 0 @@ -6038,6 +6092,18 @@ ir.cpp: # 1055| mu1055_6(unknown) = ^CallSideEffect : ~m? # 1055| v1055_7(void) = ^IndirectReadSideEffect[-1] : &:r1055_2, ~m? # 1056| v1056_1(void) = NoOp : +# 1056| r1056_2(glval) = VariableAddress[lambda_val_explicit] : +# 1056| r1056_3(glval) = FunctionAddress[~] : +# 1056| v1056_4(void) = Call[~] : func:r1056_3, this:r1056_2 +# 1056| mu1056_5(unknown) = ^CallSideEffect : ~m? +# 1056| v1056_6(void) = ^IndirectReadSideEffect[-1] : &:r1056_2, ~m? +# 1056| mu1056_7(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_2 +# 1056| r1056_8(glval) = VariableAddress[lambda_val] : +# 1056| r1056_9(glval) = FunctionAddress[~] : +# 1056| v1056_10(void) = Call[~] : func:r1056_9, this:r1056_8 +# 1056| mu1056_11(unknown) = ^CallSideEffect : ~m? +# 1056| v1056_12(void) = ^IndirectReadSideEffect[-1] : &:r1056_8, ~m? +# 1056| mu1056_13(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_8 # 1040| v1040_10(void) = ReturnIndirection[s] : &:r1040_8, ~m? # 1040| v1040_11(void) = ReturnVoid : # 1040| v1040_12(void) = AliasedUse : ~m? @@ -7307,6 +7373,12 @@ ir.cpp: # 1288| v1288_5(void) = Call[static_member_without_def] : func:r1288_4 # 1288| mu1288_6(unknown) = ^CallSideEffect : ~m? # 1289| v1289_1(void) = NoOp : +# 1289| r1289_2(glval) = VariableAddress[c] : +# 1289| r1289_3(glval) = FunctionAddress[~C] : +# 1289| v1289_4(void) = Call[~C] : func:r1289_3, this:r1289_2 +# 1289| mu1289_5(unknown) = ^CallSideEffect : ~m? +# 1289| v1289_6(void) = ^IndirectReadSideEffect[-1] : &:r1289_2, ~m? +# 1289| mu1289_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1289_2 # 1272| v1272_10(void) = ReturnIndirection[a_arg] : &:r1272_8, ~m? # 1272| v1272_11(void) = ReturnVoid : # 1272| v1272_12(void) = AliasedUse : ~m? @@ -7821,6 +7893,12 @@ ir.cpp: # 1378| mu1378_4(unknown) = ^CallSideEffect : ~m? # 1378| mu1378_5(String) = Store[#temp1378:5] : &:r1378_1, r1378_3 # 1379| v1379_1(void) = NoOp : +# 1379| r1379_2(glval) = VariableAddress[s] : +# 1379| r1379_3(glval) = FunctionAddress[~String] : +# 1379| v1379_4(void) = Call[~String] : func:r1379_3, this:r1379_2 +# 1379| mu1379_5(unknown) = ^CallSideEffect : ~m? +# 1379| v1379_6(void) = ^IndirectReadSideEffect[-1] : &:r1379_2, ~m? +# 1379| mu1379_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1379_2 # 1367| v1367_4(void) = ReturnVoid : # 1367| v1367_5(void) = AliasedUse : ~m? # 1367| v1367_6(void) = ExitFunction : @@ -7885,6 +7963,18 @@ ir.cpp: # 1390| mu1390_4(unknown) = ^CallSideEffect : ~m? # 1390| mu1390_5(destructor_only) = Store[#temp1390:5] : &:r1390_1, r1390_3 # 1391| v1391_1(void) = NoOp : +# 1391| r1391_2(glval) = VariableAddress[d2] : +# 1391| r1391_3(glval) = FunctionAddress[~destructor_only] : +# 1391| v1391_4(void) = Call[~destructor_only] : func:r1391_3, this:r1391_2 +# 1391| mu1391_5(unknown) = ^CallSideEffect : ~m? +# 1391| v1391_6(void) = ^IndirectReadSideEffect[-1] : &:r1391_2, ~m? +# 1391| mu1391_7(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1391_2 +# 1391| r1391_8(glval) = VariableAddress[d] : +# 1391| r1391_9(glval) = FunctionAddress[~destructor_only] : +# 1391| v1391_10(void) = Call[~destructor_only] : func:r1391_9, this:r1391_8 +# 1391| mu1391_11(unknown) = ^CallSideEffect : ~m? +# 1391| v1391_12(void) = ^IndirectReadSideEffect[-1] : &:r1391_8, ~m? +# 1391| mu1391_13(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1391_8 # 1381| v1381_4(void) = ReturnVoid : # 1381| v1381_5(void) = AliasedUse : ~m? # 1381| v1381_6(void) = ExitFunction : @@ -10431,6 +10521,12 @@ ir.cpp: # 1927| r1927_5(glval) = VariableAddress[z] : # 1927| mu1927_6(int) = Store[z] : &:r1927_5, r1927_3 # 1928| v1928_1(void) = NoOp : +# 1928| r1928_2(glval) = VariableAddress[c] : +# 1928| r1928_3(glval) = FunctionAddress[~C] : +# 1928| v1928_4(void) = Call[~C] : func:r1928_3, this:r1928_2 +# 1928| mu1928_5(unknown) = ^CallSideEffect : ~m? +# 1928| v1928_6(void) = ^IndirectReadSideEffect[-1] : &:r1928_2, ~m? +# 1928| mu1928_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1928_2 # 1920| v1920_4(void) = ReturnVoid : # 1920| v1920_5(void) = AliasedUse : ~m? # 1920| v1920_6(void) = ExitFunction : @@ -10664,6 +10760,12 @@ ir.cpp: # 1995| r1995_3(glval<..(*)(..)>) = VariableAddress[pfn] : # 1995| mu1995_4(..(*)(..)) = Store[pfn] : &:r1995_3, r1995_2 # 1996| v1996_1(void) = NoOp : +# 1996| r1996_2(glval) = VariableAddress[c] : +# 1996| r1996_3(glval) = FunctionAddress[~C] : +# 1996| v1996_4(void) = Call[~C] : func:r1996_3, this:r1996_2 +# 1996| mu1996_5(unknown) = ^CallSideEffect : ~m? +# 1996| v1996_6(void) = ^IndirectReadSideEffect[-1] : &:r1996_2, ~m? +# 1996| mu1996_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1996_2 # 1992| v1992_4(void) = ReturnVoid : # 1992| v1992_5(void) = AliasedUse : ~m? # 1992| v1992_6(void) = ExitFunction : @@ -11835,13 +11937,19 @@ ir.cpp: # 2137| v2137_10(void) = ExitFunction : # 2139| Block 2 -# 2139| r2139_1(glval) = VariableAddress[x] : -# 2139| r2139_2(glval) = FunctionAddress[set_x] : -# 2139| r2139_3(char) = Constant[97] : -# 2139| v2139_4(void) = Call[set_x] : func:r2139_2, this:r2139_1, 0:r2139_3 -# 2139| mu2139_5(unknown) = ^CallSideEffect : ~m? -# 2139| v2139_6(void) = ^IndirectReadSideEffect[-1] : &:r2139_1, ~m? -# 2139| mu2139_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2139_1 +# 2139| r2139_1(glval) = VariableAddress[x] : +# 2139| r2139_2(glval) = FunctionAddress[set_x] : +# 2139| r2139_3(char) = Constant[97] : +# 2139| v2139_4(void) = Call[set_x] : func:r2139_2, this:r2139_1, 0:r2139_3 +# 2139| mu2139_5(unknown) = ^CallSideEffect : ~m? +# 2139| v2139_6(void) = ^IndirectReadSideEffect[-1] : &:r2139_1, ~m? +# 2139| mu2139_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2139_1 +# 2139| r2139_8(glval) = VariableAddress[x] : +# 2139| r2139_9(glval) = FunctionAddress[~ClassWithDestructor] : +# 2139| v2139_10(void) = Call[~ClassWithDestructor] : func:r2139_9, this:r2139_8 +# 2139| mu2139_11(unknown) = ^CallSideEffect : ~m? +# 2139| v2139_12(void) = ^IndirectReadSideEffect[-1] : &:r2139_8, ~m? +# 2139| mu2139_13(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2139_8 #-----| Goto -> Block 3 # 2141| Block 3 @@ -11853,7 +11961,7 @@ ir.cpp: # 2141| mu2141_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2141_1 # 2141| r2141_7(bool) = Constant[1] : # 2141| v2141_8(void) = ConditionalBranch : r2141_7 -#-----| False -> Block 5 +#-----| False -> Block 6 #-----| True -> Block 4 # 2142| Block 4 @@ -11864,9 +11972,18 @@ ir.cpp: # 2142| mu2142_5(unknown) = ^CallSideEffect : ~m? # 2142| v2142_6(void) = ^IndirectReadSideEffect[-1] : &:r2142_1, ~m? # 2142| mu2142_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2142_1 -#-----| Goto -> Block 5 +#-----| Goto -> Block 6 -# 2144| Block 5 +# 2142| Block 5 +# 2142| r2142_8(glval) = VariableAddress[x] : +# 2142| r2142_9(glval) = FunctionAddress[~ClassWithDestructor] : +# 2142| v2142_10(void) = Call[~ClassWithDestructor] : func:r2142_9, this:r2142_8 +# 2142| mu2142_11(unknown) = ^CallSideEffect : ~m? +# 2142| v2142_12(void) = ^IndirectReadSideEffect[-1] : &:r2142_8, ~m? +# 2142| mu2142_13(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2142_8 +#-----| Goto -> Block 6 + +# 2144| Block 6 # 2144| r2144_1(glval) = VariableAddress[x] : # 2144| mu2144_2(ClassWithDestructor) = Uninitialized[x] : &:r2144_1 # 2144| r2144_3(glval) = FunctionAddress[ClassWithDestructor] : @@ -11877,10 +11994,10 @@ ir.cpp: # 2144| r2144_8(char) = Load[c] : &:r2144_7, ~m? # 2144| r2144_9(int) = Convert : r2144_8 # 2144| v2144_10(void) = Switch : r2144_9 -#-----| Case[97] -> Block 6 -#-----| Default -> Block 7 +#-----| Case[97] -> Block 7 +#-----| Default -> Block 8 -# 2145| Block 6 +# 2145| Block 7 # 2145| v2145_1(void) = NoOp : # 2146| r2146_1(glval) = VariableAddress[x] : # 2146| r2146_2(glval) = FunctionAddress[set_x] : @@ -11890,9 +12007,9 @@ ir.cpp: # 2146| v2146_6(void) = ^IndirectReadSideEffect[-1] : &:r2146_1, ~m? # 2146| mu2146_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2146_1 # 2147| v2147_1(void) = NoOp : -#-----| Goto -> Block 8 +#-----| Goto -> Block 10 -# 2148| Block 7 +# 2148| Block 8 # 2148| v2148_1(void) = NoOp : # 2149| r2149_1(glval) = VariableAddress[x] : # 2149| r2149_2(glval) = FunctionAddress[set_x] : @@ -11902,10 +12019,19 @@ ir.cpp: # 2149| v2149_6(void) = ^IndirectReadSideEffect[-1] : &:r2149_1, ~m? # 2149| mu2149_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2149_1 # 2150| v2150_1(void) = NoOp : -#-----| Goto -> Block 8 +#-----| Goto -> Block 10 -# 2151| Block 8 -# 2151| v2151_1(void) = NoOp : +# 2151| Block 9 +# 2151| r2151_1(glval) = VariableAddress[x] : +# 2151| r2151_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2151| v2151_3(void) = Call[~ClassWithDestructor] : func:r2151_2, this:r2151_1 +# 2151| mu2151_4(unknown) = ^CallSideEffect : ~m? +# 2151| v2151_5(void) = ^IndirectReadSideEffect[-1] : &:r2151_1, ~m? +# 2151| mu2151_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2151_1 +#-----| Goto -> Block 10 + +# 2151| Block 10 +# 2151| v2151_7(void) = NoOp : # 2153| r2153_1(glval) = VariableAddress[x] : # 2153| mu2153_2(ClassWithDestructor) = Uninitialized[x] : &:r2153_1 # 2153| r2153_3(glval) = FunctionAddress[ClassWithDestructor] : @@ -11947,9 +12073,9 @@ ir.cpp: # 2154| mu2154_28(unknown) = ^CallSideEffect : ~m? #-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? # 2154| mu2154_29(iterator) = Store[(__end)] : &:r2154_23, r2154_27 -#-----| Goto -> Block 9 +#-----| Goto -> Block 11 -# 2154| Block 9 +# 2154| Block 11 # 2154| r2154_30(glval) = VariableAddress[(__begin)] : #-----| r0_7(glval) = Convert : r2154_30 # 2154| r2154_31(glval) = FunctionAddress[operator!=] : @@ -11959,36 +12085,51 @@ ir.cpp: # 2154| mu2154_35(unknown) = ^CallSideEffect : ~m? #-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? # 2154| v2154_36(void) = ConditionalBranch : r2154_34 -#-----| False -> Block 11 -#-----| True -> Block 10 +#-----| False -> Block 14 +#-----| True -> Block 12 -# 2154| Block 10 -# 2154| r2154_37(glval) = VariableAddress[y] : -# 2154| r2154_38(glval) = VariableAddress[(__begin)] : -#-----| r0_9(glval) = Convert : r2154_38 -# 2154| r2154_39(glval) = FunctionAddress[operator*] : -# 2154| r2154_40(ClassWithDestructor &) = Call[operator*] : func:r2154_39, this:r0_9 -# 2154| mu2154_41(unknown) = ^CallSideEffect : ~m? -#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m? -# 2154| r2154_42(ClassWithDestructor) = Load[?] : &:r2154_40, ~m? -# 2154| mu2154_43(ClassWithDestructor) = Store[y] : &:r2154_37, r2154_42 -# 2155| r2155_1(glval) = VariableAddress[y] : -# 2155| r2155_2(glval) = FunctionAddress[set_x] : -# 2155| r2155_3(char) = Constant[97] : -# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 -# 2155| mu2155_5(unknown) = ^CallSideEffect : ~m? -# 2155| v2155_6(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, ~m? -# 2155| mu2155_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 -# 2154| r2154_44(glval) = VariableAddress[(__begin)] : -# 2154| r2154_45(glval) = FunctionAddress[operator++] : -# 2154| r2154_46(iterator &) = Call[operator++] : func:r2154_45, this:r2154_44 -# 2154| mu2154_47(unknown) = ^CallSideEffect : ~m? -# 2154| v2154_48(void) = ^IndirectReadSideEffect[-1] : &:r2154_44, ~m? -# 2154| mu2154_49(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_44 -# 2154| r2154_50(glval) = CopyValue : r2154_46 -#-----| Goto (back edge) -> Block 9 +# 2154| Block 12 +# 2154| r2154_37(glval) = VariableAddress[y] : +# 2154| r2154_38(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2154_38 +# 2154| r2154_39(glval) = FunctionAddress[operator*] : +# 2154| r2154_40(ClassWithDestructor &) = Call[operator*] : func:r2154_39, this:r0_9 +# 2154| mu2154_41(unknown) = ^CallSideEffect : ~m? +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m? +# 2154| r2154_42(ClassWithDestructor) = Load[?] : &:r2154_40, ~m? +# 2154| mu2154_43(ClassWithDestructor) = Store[y] : &:r2154_37, r2154_42 +# 2155| r2155_1(glval) = VariableAddress[y] : +# 2155| r2155_2(glval) = FunctionAddress[set_x] : +# 2155| r2155_3(char) = Constant[97] : +# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 +# 2155| mu2155_5(unknown) = ^CallSideEffect : ~m? +# 2155| v2155_6(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, ~m? +# 2155| mu2155_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 +# 2154| r2154_44(glval) = VariableAddress[y] : +# 2154| r2154_45(glval) = FunctionAddress[~ClassWithDestructor] : +# 2154| v2154_46(void) = Call[~ClassWithDestructor] : func:r2154_45, this:r2154_44 +# 2154| mu2154_47(unknown) = ^CallSideEffect : ~m? +# 2154| v2154_48(void) = ^IndirectReadSideEffect[-1] : &:r2154_44, ~m? +# 2154| mu2154_49(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2154_44 +# 2154| r2154_50(glval) = VariableAddress[(__begin)] : +# 2154| r2154_51(glval) = FunctionAddress[operator++] : +# 2154| r2154_52(iterator &) = Call[operator++] : func:r2154_51, this:r2154_50 +# 2154| mu2154_53(unknown) = ^CallSideEffect : ~m? +# 2154| v2154_54(void) = ^IndirectReadSideEffect[-1] : &:r2154_50, ~m? +# 2154| mu2154_55(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_50 +# 2154| r2154_56(glval) = CopyValue : r2154_52 +#-----| Goto (back edge) -> Block 11 -# 2157| Block 11 +# 2154| Block 13 +# 2154| r2154_57(glval>) = VariableAddress[ys] : +# 2154| r2154_58(glval) = FunctionAddress[~vector] : +# 2154| v2154_59(void) = Call[~vector] : func:r2154_58, this:r2154_57 +# 2154| mu2154_60(unknown) = ^CallSideEffect : ~m? +# 2154| v2154_61(void) = ^IndirectReadSideEffect[-1] : &:r2154_57, ~m? +# 2154| mu2154_62(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2154_57 +#-----| Goto -> Block 14 + +# 2157| Block 14 # 2157| r2157_1(glval>) = VariableAddress[ys] : # 2157| mu2157_2(vector) = Uninitialized[ys] : &:r2157_1 # 2157| r2157_3(glval) = FunctionAddress[vector] : @@ -12024,9 +12165,9 @@ ir.cpp: # 2157| mu2157_28(unknown) = ^CallSideEffect : ~m? #-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m? # 2157| mu2157_29(iterator) = Store[(__end)] : &:r2157_23, r2157_27 -#-----| Goto -> Block 12 +#-----| Goto -> Block 15 -# 2157| Block 12 +# 2157| Block 15 # 2157| r2157_30(glval) = VariableAddress[(__begin)] : #-----| r0_17(glval) = Convert : r2157_30 # 2157| r2157_31(glval) = FunctionAddress[operator!=] : @@ -12036,29 +12177,19 @@ ir.cpp: # 2157| mu2157_35(unknown) = ^CallSideEffect : ~m? #-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m? # 2157| v2157_36(void) = ConditionalBranch : r2157_34 -#-----| False -> Block 16 -#-----| True -> Block 14 +#-----| False -> Block 20 +#-----| True -> Block 16 -# 2157| Block 13 -# 2157| r2157_37(glval) = VariableAddress[(__begin)] : -# 2157| r2157_38(glval) = FunctionAddress[operator++] : -# 2157| r2157_39(iterator &) = Call[operator++] : func:r2157_38, this:r2157_37 -# 2157| mu2157_40(unknown) = ^CallSideEffect : ~m? -# 2157| v2157_41(void) = ^IndirectReadSideEffect[-1] : &:r2157_37, ~m? -# 2157| mu2157_42(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_37 -# 2157| r2157_43(glval) = CopyValue : r2157_39 -#-----| Goto (back edge) -> Block 12 - -# 2157| Block 14 -# 2157| r2157_44(glval) = VariableAddress[y] : -# 2157| r2157_45(glval) = VariableAddress[(__begin)] : -#-----| r0_19(glval) = Convert : r2157_45 -# 2157| r2157_46(glval) = FunctionAddress[operator*] : -# 2157| r2157_47(ClassWithDestructor &) = Call[operator*] : func:r2157_46, this:r0_19 -# 2157| mu2157_48(unknown) = ^CallSideEffect : ~m? +# 2157| Block 16 +# 2157| r2157_37(glval) = VariableAddress[y] : +# 2157| r2157_38(glval) = VariableAddress[(__begin)] : +#-----| r0_19(glval) = Convert : r2157_38 +# 2157| r2157_39(glval) = FunctionAddress[operator*] : +# 2157| r2157_40(ClassWithDestructor &) = Call[operator*] : func:r2157_39, this:r0_19 +# 2157| mu2157_41(unknown) = ^CallSideEffect : ~m? #-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~m? -# 2157| r2157_49(ClassWithDestructor) = Load[?] : &:r2157_47, ~m? -# 2157| mu2157_50(ClassWithDestructor) = Store[y] : &:r2157_44, r2157_49 +# 2157| r2157_42(ClassWithDestructor) = Load[?] : &:r2157_40, ~m? +# 2157| mu2157_43(ClassWithDestructor) = Store[y] : &:r2157_37, r2157_42 # 2158| r2158_1(glval) = VariableAddress[y] : # 2158| r2158_2(glval) = FunctionAddress[set_x] : # 2158| r2158_3(char) = Constant[97] : @@ -12076,14 +12207,57 @@ ir.cpp: # 2159| r2159_8(int) = Constant[98] : # 2159| r2159_9(bool) = CompareEQ : r2159_7, r2159_8 # 2159| v2159_10(void) = ConditionalBranch : r2159_9 -#-----| False -> Block 13 -#-----| True -> Block 15 +#-----| False -> Block 18 +#-----| True -> Block 17 -# 2160| Block 15 -# 2160| v2160_1(void) = NoOp : +# 2160| Block 17 +# 2160| v2160_1(void) = NoOp : +# 2157| r2157_44(glval) = VariableAddress[y] : +# 2157| r2157_45(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_46(void) = Call[~ClassWithDestructor] : func:r2157_45, this:r2157_44 +# 2157| mu2157_47(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_48(void) = ^IndirectReadSideEffect[-1] : &:r2157_44, ~m? +# 2157| mu2157_49(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_44 +# 2157| r2157_50(glval>) = VariableAddress[ys] : +# 2157| r2157_51(glval) = FunctionAddress[~vector] : +# 2157| v2157_52(void) = Call[~vector] : func:r2157_51, this:r2157_50 +# 2157| mu2157_53(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_54(void) = ^IndirectReadSideEffect[-1] : &:r2157_50, ~m? +# 2157| mu2157_55(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_50 +# 2172| r2172_1(glval) = VariableAddress[x] : +# 2172| r2172_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_3(void) = Call[~ClassWithDestructor] : func:r2172_2, this:r2172_1 +# 2172| mu2172_4(unknown) = ^CallSideEffect : ~m? +# 2172| v2172_5(void) = ^IndirectReadSideEffect[-1] : &:r2172_1, ~m? +# 2172| mu2172_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_1 #-----| Goto -> Block 1 -# 2163| Block 16 +# 2157| Block 18 +# 2157| r2157_56(glval) = VariableAddress[y] : +# 2157| r2157_57(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_58(void) = Call[~ClassWithDestructor] : func:r2157_57, this:r2157_56 +# 2157| mu2157_59(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_60(void) = ^IndirectReadSideEffect[-1] : &:r2157_56, ~m? +# 2157| mu2157_61(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_56 +# 2157| r2157_62(glval) = VariableAddress[(__begin)] : +# 2157| r2157_63(glval) = FunctionAddress[operator++] : +# 2157| r2157_64(iterator &) = Call[operator++] : func:r2157_63, this:r2157_62 +# 2157| mu2157_65(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_66(void) = ^IndirectReadSideEffect[-1] : &:r2157_62, ~m? +# 2157| mu2157_67(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_62 +# 2157| r2157_68(glval) = CopyValue : r2157_64 +#-----| Goto (back edge) -> Block 15 + +# 2157| Block 19 +# 2157| r2157_69(glval>) = VariableAddress[ys] : +# 2157| r2157_70(glval) = FunctionAddress[~vector] : +# 2157| v2157_71(void) = Call[~vector] : func:r2157_70, this:r2157_69 +# 2157| mu2157_72(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_73(void) = ^IndirectReadSideEffect[-1] : &:r2157_69, ~m? +# 2157| mu2157_74(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_69 +#-----| Goto -> Block 20 + +# 2163| Block 20 # 2163| r2163_1(glval>) = VariableAddress[ys] : # 2163| mu2163_2(vector) = Uninitialized[ys] : &:r2163_1 # 2163| r2163_3(glval) = FunctionAddress[vector] : @@ -12115,9 +12289,9 @@ ir.cpp: # 2163| mu2163_24(unknown) = ^CallSideEffect : ~m? #-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_25, ~m? # 2163| mu2163_25(iterator) = Store[(__end)] : &:r2163_19, r2163_23 -#-----| Goto -> Block 17 +#-----| Goto -> Block 21 -# 2163| Block 17 +# 2163| Block 21 # 2163| r2163_26(glval) = VariableAddress[(__begin)] : #-----| r0_27(glval) = Convert : r2163_26 # 2163| r2163_27(glval) = FunctionAddress[operator!=] : @@ -12127,10 +12301,10 @@ ir.cpp: # 2163| mu2163_31(unknown) = ^CallSideEffect : ~m? #-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? # 2163| v2163_32(void) = ConditionalBranch : r2163_30 -#-----| False -> Block 21 -#-----| True -> Block 19 +#-----| False -> Block 26 +#-----| True -> Block 23 -# 2163| Block 18 +# 2163| Block 22 # 2163| r2163_33(glval) = VariableAddress[(__begin)] : # 2163| r2163_34(glval) = FunctionAddress[operator++] : # 2163| r2163_35(iterator &) = Call[operator++] : func:r2163_34, this:r2163_33 @@ -12138,9 +12312,9 @@ ir.cpp: # 2163| v2163_37(void) = ^IndirectReadSideEffect[-1] : &:r2163_33, ~m? # 2163| mu2163_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2163_33 # 2163| r2163_39(glval) = CopyValue : r2163_35 -#-----| Goto (back edge) -> Block 17 +#-----| Goto (back edge) -> Block 21 -# 2163| Block 19 +# 2163| Block 23 # 2163| r2163_40(glval) = VariableAddress[y] : # 2163| r2163_41(glval) = VariableAddress[(__begin)] : #-----| r0_29(glval) = Convert : r2163_41 @@ -12155,17 +12329,1200 @@ ir.cpp: # 2164| r2164_3(int) = Constant[1] : # 2164| r2164_4(bool) = CompareEQ : r2164_2, r2164_3 # 2164| v2164_5(void) = ConditionalBranch : r2164_4 -#-----| False -> Block 18 -#-----| True -> Block 20 +#-----| False -> Block 22 +#-----| True -> Block 24 -# 2165| Block 20 -# 2165| v2165_1(void) = NoOp : +# 2165| Block 24 +# 2165| v2165_1(void) = NoOp : +# 2163| r2163_47(glval>) = VariableAddress[ys] : +# 2163| r2163_48(glval) = FunctionAddress[~vector] : +# 2163| v2163_49(void) = Call[~vector] : func:r2163_48, this:r2163_47 +# 2163| mu2163_50(unknown) = ^CallSideEffect : ~m? +# 2163| v2163_51(void) = ^IndirectReadSideEffect[-1] : &:r2163_47, ~m? +# 2163| mu2163_52(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_47 +# 2172| r2172_7(glval) = VariableAddress[x] : +# 2172| r2172_8(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_9(void) = Call[~ClassWithDestructor] : func:r2172_8, this:r2172_7 +# 2172| mu2172_10(unknown) = ^CallSideEffect : ~m? +# 2172| v2172_11(void) = ^IndirectReadSideEffect[-1] : &:r2172_7, ~m? +# 2172| mu2172_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_7 #-----| Goto -> Block 1 -# 2167| Block 21 -# 2167| v2167_1(void) = NoOp : +# 2163| Block 25 +# 2163| r2163_53(glval>) = VariableAddress[ys] : +# 2163| r2163_54(glval) = FunctionAddress[~vector] : +# 2163| v2163_55(void) = Call[~vector] : func:r2163_54, this:r2163_53 +# 2163| mu2163_56(unknown) = ^CallSideEffect : ~m? +# 2163| v2163_57(void) = ^IndirectReadSideEffect[-1] : &:r2163_53, ~m? +# 2163| mu2163_58(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_53 +#-----| Goto -> Block 26 + +# 2168| Block 26 +# 2168| r2168_1(glval>) = VariableAddress[ys] : +# 2168| mu2168_2(vector) = Uninitialized[ys] : &:r2168_1 +# 2168| r2168_3(glval) = FunctionAddress[vector] : +# 2168| r2168_4(glval) = VariableAddress[#temp2168:40] : +# 2168| r2168_5(glval) = VariableAddress[x] : +# 2168| r2168_6(ClassWithDestructor) = Load[x] : &:r2168_5, ~m? +# 2168| mu2168_7(ClassWithDestructor) = Store[#temp2168:40] : &:r2168_4, r2168_6 +# 2168| r2168_8(ClassWithDestructor) = Load[#temp2168:40] : &:r2168_4, ~m? +# 2168| v2168_9(void) = Call[vector] : func:r2168_3, this:r2168_1, 0:r2168_8 +# 2168| mu2168_10(unknown) = ^CallSideEffect : ~m? +# 2168| mu2168_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2168_1 +# 2168| r2168_12(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_13(glval>) = VariableAddress[ys] : +# 2168| r2168_14(vector &) = CopyValue : r2168_13 +# 2168| mu2168_15(vector &) = Store[(__range)] : &:r2168_12, r2168_14 +# 2168| r2168_16(glval) = VariableAddress[(__begin)] : +# 2168| r2168_17(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_18(vector &) = Load[(__range)] : &:r2168_17, ~m? +#-----| r0_31(glval>) = CopyValue : r2168_18 +#-----| r0_32(glval>) = Convert : r0_31 +# 2168| r2168_19(glval) = FunctionAddress[begin] : +# 2168| r2168_20(iterator) = Call[begin] : func:r2168_19, this:r0_32 +# 2168| mu2168_21(unknown) = ^CallSideEffect : ~m? +#-----| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_32, ~m? +# 2168| mu2168_22(iterator) = Store[(__begin)] : &:r2168_16, r2168_20 +# 2168| r2168_23(glval) = VariableAddress[(__end)] : +# 2168| r2168_24(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_25(vector &) = Load[(__range)] : &:r2168_24, ~m? +#-----| r0_34(glval>) = CopyValue : r2168_25 +#-----| r0_35(glval>) = Convert : r0_34 +# 2168| r2168_26(glval) = FunctionAddress[end] : +# 2168| r2168_27(iterator) = Call[end] : func:r2168_26, this:r0_35 +# 2168| mu2168_28(unknown) = ^CallSideEffect : ~m? +#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m? +# 2168| mu2168_29(iterator) = Store[(__end)] : &:r2168_23, r2168_27 +#-----| Goto -> Block 27 + +# 2168| Block 27 +# 2168| r2168_30(glval) = VariableAddress[(__begin)] : +#-----| r0_37(glval) = Convert : r2168_30 +# 2168| r2168_31(glval) = FunctionAddress[operator!=] : +# 2168| r2168_32(glval) = VariableAddress[(__end)] : +# 2168| r2168_33(iterator) = Load[(__end)] : &:r2168_32, ~m? +# 2168| r2168_34(bool) = Call[operator!=] : func:r2168_31, this:r0_37, 0:r2168_33 +# 2168| mu2168_35(unknown) = ^CallSideEffect : ~m? +#-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, ~m? +# 2168| v2168_36(void) = ConditionalBranch : r2168_34 +#-----| False -> Block 30 +#-----| True -> Block 28 + +# 2168| Block 28 +# 2168| r2168_37(glval) = VariableAddress[y] : +# 2168| r2168_38(glval) = VariableAddress[(__begin)] : +#-----| r0_39(glval) = Convert : r2168_38 +# 2168| r2168_39(glval) = FunctionAddress[operator*] : +# 2168| r2168_40(ClassWithDestructor &) = Call[operator*] : func:r2168_39, this:r0_39 +# 2168| mu2168_41(unknown) = ^CallSideEffect : ~m? +#-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, ~m? +# 2168| r2168_42(ClassWithDestructor) = Load[?] : &:r2168_40, ~m? +# 2168| mu2168_43(ClassWithDestructor) = Store[y] : &:r2168_37, r2168_42 +# 2169| r2169_1(glval) = VariableAddress[z1] : +# 2169| mu2169_2(ClassWithDestructor) = Uninitialized[z1] : &:r2169_1 +# 2169| r2169_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2169| v2169_4(void) = Call[ClassWithDestructor] : func:r2169_3, this:r2169_1 +# 2169| mu2169_5(unknown) = ^CallSideEffect : ~m? +# 2169| mu2169_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2169_1 +# 2170| r2170_1(glval) = VariableAddress[z2] : +# 2170| mu2170_2(ClassWithDestructor) = Uninitialized[z2] : &:r2170_1 +# 2170| r2170_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2170| v2170_4(void) = Call[ClassWithDestructor] : func:r2170_3, this:r2170_1 +# 2170| mu2170_5(unknown) = ^CallSideEffect : ~m? +# 2170| mu2170_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2170_1 +# 2171| r2171_1(glval) = VariableAddress[z2] : +# 2171| r2171_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2171| v2171_3(void) = Call[~ClassWithDestructor] : func:r2171_2, this:r2171_1 +# 2171| mu2171_4(unknown) = ^CallSideEffect : ~m? +# 2171| v2171_5(void) = ^IndirectReadSideEffect[-1] : &:r2171_1, ~m? +# 2171| mu2171_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2171_1 +# 2171| r2171_7(glval) = VariableAddress[z1] : +# 2171| r2171_8(glval) = FunctionAddress[~ClassWithDestructor] : +# 2171| v2171_9(void) = Call[~ClassWithDestructor] : func:r2171_8, this:r2171_7 +# 2171| mu2171_10(unknown) = ^CallSideEffect : ~m? +# 2171| v2171_11(void) = ^IndirectReadSideEffect[-1] : &:r2171_7, ~m? +# 2171| mu2171_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2171_7 +# 2168| r2168_44(glval) = VariableAddress[y] : +# 2168| r2168_45(glval) = FunctionAddress[~ClassWithDestructor] : +# 2168| v2168_46(void) = Call[~ClassWithDestructor] : func:r2168_45, this:r2168_44 +# 2168| mu2168_47(unknown) = ^CallSideEffect : ~m? +# 2168| v2168_48(void) = ^IndirectReadSideEffect[-1] : &:r2168_44, ~m? +# 2168| mu2168_49(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2168_44 +# 2168| r2168_50(glval) = VariableAddress[(__begin)] : +# 2168| r2168_51(glval) = FunctionAddress[operator++] : +# 2168| r2168_52(iterator &) = Call[operator++] : func:r2168_51, this:r2168_50 +# 2168| mu2168_53(unknown) = ^CallSideEffect : ~m? +# 2168| v2168_54(void) = ^IndirectReadSideEffect[-1] : &:r2168_50, ~m? +# 2168| mu2168_55(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_50 +# 2168| r2168_56(glval) = CopyValue : r2168_52 +#-----| Goto (back edge) -> Block 27 + +# 2168| Block 29 +# 2168| r2168_57(glval>) = VariableAddress[ys] : +# 2168| r2168_58(glval) = FunctionAddress[~vector] : +# 2168| v2168_59(void) = Call[~vector] : func:r2168_58, this:r2168_57 +# 2168| mu2168_60(unknown) = ^CallSideEffect : ~m? +# 2168| v2168_61(void) = ^IndirectReadSideEffect[-1] : &:r2168_57, ~m? +# 2168| mu2168_62(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2168_57 +#-----| Goto -> Block 30 + +# 2172| Block 30 +# 2172| v2172_13(void) = NoOp : +# 2172| r2172_14(glval) = VariableAddress[x] : +# 2172| r2172_15(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_16(void) = Call[~ClassWithDestructor] : func:r2172_15, this:r2172_14 +# 2172| mu2172_17(unknown) = ^CallSideEffect : ~m? +# 2172| v2172_18(void) = ^IndirectReadSideEffect[-1] : &:r2172_14, ~m? +# 2172| mu2172_19(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_14 #-----| Goto -> Block 1 +# 2174| void static_variable_with_destructor_1() +# 2174| Block 0 +# 2174| v2174_1(void) = EnterFunction : +# 2174| mu2174_2(unknown) = AliasedDefinition : +# 2174| mu2174_3(unknown) = InitializeNonLocal : +# 2175| r2175_1(glval) = VariableAddress[a] : +# 2175| mu2175_2(ClassWithDestructor) = Uninitialized[a] : &:r2175_1 +# 2175| r2175_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2175| v2175_4(void) = Call[ClassWithDestructor] : func:r2175_3, this:r2175_1 +# 2175| mu2175_5(unknown) = ^CallSideEffect : ~m? +# 2175| mu2175_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2175_1 +# 2176| r2176_1(glval) = VariableAddress[b#init] : +# 2176| r2176_2(bool) = Load[b#init] : &:r2176_1, ~m? +# 2176| v2176_3(void) = ConditionalBranch : r2176_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 2176| Block 1 +# 2176| r2176_4(glval) = VariableAddress[b] : +#-----| r0_1(glval) = FunctionAddress[ClassWithDestructor] : +#-----| v0_2(void) = Call[ClassWithDestructor] : func:r0_1, this:r2176_4 +#-----| mu0_3(unknown) = ^CallSideEffect : ~m? +#-----| mu0_4(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2176_4 +# 2176| r2176_5(bool) = Constant[1] : +# 2176| mu2176_6(bool) = Store[b#init] : &:r2176_1, r2176_5 +#-----| Goto -> Block 2 + +# 2177| Block 2 +# 2177| v2177_1(void) = NoOp : +# 2177| r2177_2(glval) = VariableAddress[a] : +# 2177| r2177_3(glval) = FunctionAddress[~ClassWithDestructor] : +# 2177| v2177_4(void) = Call[~ClassWithDestructor] : func:r2177_3, this:r2177_2 +# 2177| mu2177_5(unknown) = ^CallSideEffect : ~m? +# 2177| v2177_6(void) = ^IndirectReadSideEffect[-1] : &:r2177_2, ~m? +# 2177| mu2177_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2177_2 +# 2174| v2174_4(void) = ReturnVoid : +# 2174| v2174_5(void) = AliasedUse : ~m? +# 2174| v2174_6(void) = ExitFunction : + +# 2179| void static_variable_with_destructor_2() +# 2179| Block 0 +# 2179| v2179_1(void) = EnterFunction : +# 2179| mu2179_2(unknown) = AliasedDefinition : +# 2179| mu2179_3(unknown) = InitializeNonLocal : +# 2180| r2180_1(glval) = VariableAddress[a#init] : +# 2180| r2180_2(bool) = Load[a#init] : &:r2180_1, ~m? +# 2180| v2180_3(void) = ConditionalBranch : r2180_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 2180| Block 1 +# 2180| r2180_4(glval) = VariableAddress[a] : +#-----| r0_1(glval) = FunctionAddress[ClassWithDestructor] : +#-----| v0_2(void) = Call[ClassWithDestructor] : func:r0_1, this:r2180_4 +#-----| mu0_3(unknown) = ^CallSideEffect : ~m? +#-----| mu0_4(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2180_4 +# 2180| r2180_5(bool) = Constant[1] : +# 2180| mu2180_6(bool) = Store[a#init] : &:r2180_1, r2180_5 +#-----| Goto -> Block 2 + +# 2181| Block 2 +# 2181| r2181_1(glval) = VariableAddress[b] : +# 2181| mu2181_2(ClassWithDestructor) = Uninitialized[b] : &:r2181_1 +# 2181| r2181_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2181| v2181_4(void) = Call[ClassWithDestructor] : func:r2181_3, this:r2181_1 +# 2181| mu2181_5(unknown) = ^CallSideEffect : ~m? +# 2181| mu2181_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2181_1 +# 2182| v2182_1(void) = NoOp : +# 2182| r2182_2(glval) = VariableAddress[b] : +# 2182| r2182_3(glval) = FunctionAddress[~ClassWithDestructor] : +# 2182| v2182_4(void) = Call[~ClassWithDestructor] : func:r2182_3, this:r2182_2 +# 2182| mu2182_5(unknown) = ^CallSideEffect : ~m? +# 2182| v2182_6(void) = ^IndirectReadSideEffect[-1] : &:r2182_2, ~m? +# 2182| mu2182_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2182_2 +# 2179| v2179_4(void) = ReturnVoid : +# 2179| v2179_5(void) = AliasedUse : ~m? +# 2179| v2179_6(void) = ExitFunction : + +# 2184| void static_variable_with_destructor_3() +# 2184| Block 0 +# 2184| v2184_1(void) = EnterFunction : +# 2184| mu2184_2(unknown) = AliasedDefinition : +# 2184| mu2184_3(unknown) = InitializeNonLocal : +# 2185| r2185_1(glval) = VariableAddress[a] : +# 2185| mu2185_2(ClassWithDestructor) = Uninitialized[a] : &:r2185_1 +# 2185| r2185_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2185| v2185_4(void) = Call[ClassWithDestructor] : func:r2185_3, this:r2185_1 +# 2185| mu2185_5(unknown) = ^CallSideEffect : ~m? +# 2185| mu2185_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2185_1 +# 2186| r2186_1(glval) = VariableAddress[b] : +# 2186| mu2186_2(ClassWithDestructor) = Uninitialized[b] : &:r2186_1 +# 2186| r2186_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2186| v2186_4(void) = Call[ClassWithDestructor] : func:r2186_3, this:r2186_1 +# 2186| mu2186_5(unknown) = ^CallSideEffect : ~m? +# 2186| mu2186_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2186_1 +# 2187| r2187_1(glval) = VariableAddress[c#init] : +# 2187| r2187_2(bool) = Load[c#init] : &:r2187_1, ~m? +# 2187| v2187_3(void) = ConditionalBranch : r2187_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 2187| Block 1 +# 2187| r2187_4(glval) = VariableAddress[c] : +#-----| r0_1(glval) = FunctionAddress[ClassWithDestructor] : +#-----| v0_2(void) = Call[ClassWithDestructor] : func:r0_1, this:r2187_4 +#-----| mu0_3(unknown) = ^CallSideEffect : ~m? +#-----| mu0_4(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2187_4 +# 2187| r2187_5(bool) = Constant[1] : +# 2187| mu2187_6(bool) = Store[c#init] : &:r2187_1, r2187_5 +#-----| Goto -> Block 2 + +# 2188| Block 2 +# 2188| v2188_1(void) = NoOp : +# 2188| r2188_2(glval) = VariableAddress[b] : +# 2188| r2188_3(glval) = FunctionAddress[~ClassWithDestructor] : +# 2188| v2188_4(void) = Call[~ClassWithDestructor] : func:r2188_3, this:r2188_2 +# 2188| mu2188_5(unknown) = ^CallSideEffect : ~m? +# 2188| v2188_6(void) = ^IndirectReadSideEffect[-1] : &:r2188_2, ~m? +# 2188| mu2188_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_2 +# 2188| r2188_8(glval) = VariableAddress[a] : +# 2188| r2188_9(glval) = FunctionAddress[~ClassWithDestructor] : +# 2188| v2188_10(void) = Call[~ClassWithDestructor] : func:r2188_9, this:r2188_8 +# 2188| mu2188_11(unknown) = ^CallSideEffect : ~m? +# 2188| v2188_12(void) = ^IndirectReadSideEffect[-1] : &:r2188_8, ~m? +# 2188| mu2188_13(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_8 +# 2184| v2184_4(void) = ReturnVoid : +# 2184| v2184_5(void) = AliasedUse : ~m? +# 2184| v2184_6(void) = ExitFunction : + +# 2190| ClassWithDestructor global_class_with_destructor +# 2190| Block 0 +# 2190| v2190_1(void) = EnterFunction : +# 2190| mu2190_2(unknown) = AliasedDefinition : +# 2190| r2190_3(glval) = VariableAddress[global_class_with_destructor] : +# 2190| r2190_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2190| v2190_5(void) = Call[ClassWithDestructor] : func:r2190_4, this:r2190_3 +# 2190| mu2190_6(unknown) = ^CallSideEffect : ~m? +# 2190| mu2190_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2190_3 +# 2190| v2190_8(void) = ReturnVoid : +# 2190| v2190_9(void) = AliasedUse : ~m? +# 2190| v2190_10(void) = ExitFunction : + +# 2194| ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| mu2194_2(unknown) = AliasedDefinition : +# 2194| mu2194_3(unknown) = InitializeNonLocal : +# 2194| r2194_4(glval) = VariableAddress[t] : +# 2194| mu2194_5(ClassWithDestructor &) = InitializeParameter[t] : &:r2194_4 +# 2194| r2194_6(ClassWithDestructor &) = Load[t] : &:r2194_4, ~m? +# 2194| mu2194_7(unknown) = InitializeIndirection[t] : &:r2194_6 +# 2194| r2194_8(glval) = VariableAddress[#return] : +# 2194| r2194_9(glval) = VariableAddress[t] : +# 2194| r2194_10(ClassWithDestructor &) = Load[t] : &:r2194_9, ~m? +# 2194| r2194_11(glval) = CopyValue : r2194_10 +# 2194| r2194_12(ClassWithDestructor &) = CopyValue : r2194_11 +# 2194| mu2194_13(ClassWithDestructor &) = Store[#return] : &:r2194_8, r2194_12 +# 2194| v2194_14(void) = ReturnIndirection[t] : &:r2194_6, ~m? +# 2194| r2194_15(glval) = VariableAddress[#return] : +# 2194| v2194_16(void) = ReturnValue : &:r2194_15, ~m? +# 2194| v2194_17(void) = AliasedUse : ~m? +# 2194| v2194_18(void) = ExitFunction : + +# 2194| int& vacuous_destructor_call::get(int&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| mu2194_2(unknown) = AliasedDefinition : +# 2194| mu2194_3(unknown) = InitializeNonLocal : +# 2194| r2194_4(glval) = VariableAddress[t] : +# 2194| mu2194_5(int &) = InitializeParameter[t] : &:r2194_4 +# 2194| r2194_6(int &) = Load[t] : &:r2194_4, ~m? +# 2194| mu2194_7(unknown) = InitializeIndirection[t] : &:r2194_6 +# 2194| r2194_8(glval) = VariableAddress[#return] : +# 2194| r2194_9(glval) = VariableAddress[t] : +# 2194| r2194_10(int &) = Load[t] : &:r2194_9, ~m? +# 2194| r2194_11(glval) = CopyValue : r2194_10 +# 2194| r2194_12(int &) = CopyValue : r2194_11 +# 2194| mu2194_13(int &) = Store[#return] : &:r2194_8, r2194_12 +# 2194| v2194_14(void) = ReturnIndirection[t] : &:r2194_6, ~m? +# 2194| r2194_15(glval) = VariableAddress[#return] : +# 2194| v2194_16(void) = ReturnValue : &:r2194_15, ~m? +# 2194| v2194_17(void) = AliasedUse : ~m? +# 2194| v2194_18(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(ClassWithDestructor&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| mu2197_2(unknown) = AliasedDefinition : +# 2197| mu2197_3(unknown) = InitializeNonLocal : +# 2197| r2197_4(glval) = VariableAddress[t] : +# 2197| mu2197_5(ClassWithDestructor &) = InitializeParameter[t] : &:r2197_4 +# 2197| r2197_6(ClassWithDestructor &) = Load[t] : &:r2197_4, ~m? +# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(ClassWithDestructor &) = Load[t] : &:r2198_2, ~m? +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(ClassWithDestructor &) = CopyValue : r2198_4 +# 2198| r2198_6(ClassWithDestructor &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| mu2198_7(unknown) = ^CallSideEffect : ~m? +# 2198| v2198_8(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m? +# 2198| mu2198_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| r2198_10(glval) = CopyValue : r2198_6 +# 2198| r2198_11(glval) = FunctionAddress[~ClassWithDestructor] : +# 2198| v2198_12(void) = Call[~ClassWithDestructor] : func:r2198_11 +# 2198| mu2198_13(unknown) = ^CallSideEffect : ~m? +# 2198| v2198_14(void) = ^IndirectReadSideEffect[-1] : &:r2198_10, ~m? +# 2198| mu2198_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2198_10 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m? +# 2197| v2197_9(void) = ReturnVoid : +# 2197| v2197_10(void) = AliasedUse : ~m? +# 2197| v2197_11(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(int&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| mu2197_2(unknown) = AliasedDefinition : +# 2197| mu2197_3(unknown) = InitializeNonLocal : +# 2197| r2197_4(glval) = VariableAddress[t] : +# 2197| mu2197_5(int &) = InitializeParameter[t] : &:r2197_4 +# 2197| r2197_6(int &) = Load[t] : &:r2197_4, ~m? +# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(int &) = Load[t] : &:r2198_2, ~m? +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(int &) = CopyValue : r2198_4 +# 2198| r2198_6(int &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| mu2198_7(unknown) = ^CallSideEffect : ~m? +# 2198| v2198_8(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m? +# 2198| mu2198_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| r2198_10(glval) = CopyValue : r2198_6 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m? +# 2197| v2197_9(void) = ReturnVoid : +# 2197| v2197_10(void) = AliasedUse : ~m? +# 2197| v2197_11(void) = ExitFunction : + +# 2201| void vacuous_destructor_call::non_vacuous_destructor_call() +# 2201| Block 0 +# 2201| v2201_1(void) = EnterFunction : +# 2201| mu2201_2(unknown) = AliasedDefinition : +# 2201| mu2201_3(unknown) = InitializeNonLocal : +# 2202| r2202_1(glval) = VariableAddress[c] : +# 2202| mu2202_2(ClassWithDestructor) = Uninitialized[c] : &:r2202_1 +# 2202| r2202_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2202| v2202_4(void) = Call[ClassWithDestructor] : func:r2202_3, this:r2202_1 +# 2202| mu2202_5(unknown) = ^CallSideEffect : ~m? +# 2202| mu2202_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 +# 2203| r2203_1(glval) = FunctionAddress[call_destructor] : +# 2203| r2203_2(glval) = VariableAddress[c] : +# 2203| r2203_3(ClassWithDestructor &) = CopyValue : r2203_2 +# 2203| v2203_4(void) = Call[call_destructor] : func:r2203_1, 0:r2203_3 +# 2203| mu2203_5(unknown) = ^CallSideEffect : ~m? +# 2203| v2203_6(void) = ^BufferReadSideEffect[0] : &:r2203_3, ~m? +# 2203| mu2203_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r2203_3 +# 2204| v2204_1(void) = NoOp : +# 2204| r2204_2(glval) = VariableAddress[c] : +# 2204| r2204_3(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_4(void) = Call[~ClassWithDestructor] : func:r2204_3, this:r2204_2 +# 2204| mu2204_5(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_6(void) = ^IndirectReadSideEffect[-1] : &:r2204_2, ~m? +# 2204| mu2204_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_2 +# 2201| v2201_4(void) = ReturnVoid : +# 2201| v2201_5(void) = AliasedUse : ~m? +# 2201| v2201_6(void) = ExitFunction : + +# 2206| void vacuous_destructor_call::vacuous_destructor_call() +# 2206| Block 0 +# 2206| v2206_1(void) = EnterFunction : +# 2206| mu2206_2(unknown) = AliasedDefinition : +# 2206| mu2206_3(unknown) = InitializeNonLocal : +# 2207| r2207_1(glval) = VariableAddress[i] : +# 2207| mu2207_2(int) = Uninitialized[i] : &:r2207_1 +# 2208| r2208_1(glval) = FunctionAddress[call_destructor] : +# 2208| r2208_2(glval) = VariableAddress[i] : +# 2208| r2208_3(int &) = CopyValue : r2208_2 +# 2208| v2208_4(void) = Call[call_destructor] : func:r2208_1, 0:r2208_3 +# 2208| mu2208_5(unknown) = ^CallSideEffect : ~m? +# 2208| v2208_6(void) = ^BufferReadSideEffect[0] : &:r2208_3, ~m? +# 2208| mu2208_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r2208_3 +# 2209| v2209_1(void) = NoOp : +# 2206| v2206_4(void) = ReturnVoid : +# 2206| v2206_5(void) = AliasedUse : ~m? +# 2206| v2206_6(void) = ExitFunction : + +# 2212| void TryCatchDestructors(bool) +# 2212| Block 0 +# 2212| v2212_1(void) = EnterFunction : +# 2212| mu2212_2(unknown) = AliasedDefinition : +# 2212| mu2212_3(unknown) = InitializeNonLocal : +# 2212| r2212_4(glval) = VariableAddress[b] : +# 2212| mu2212_5(bool) = InitializeParameter[b] : &:r2212_4 +# 2214| r2214_1(glval) = VariableAddress[s] : +# 2214| mu2214_2(String) = Uninitialized[s] : &:r2214_1 +# 2214| r2214_3(glval) = FunctionAddress[String] : +# 2214| v2214_4(void) = Call[String] : func:r2214_3, this:r2214_1 +# 2214| mu2214_5(unknown) = ^CallSideEffect : ~m? +# 2214| mu2214_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2214_1 +# 2215| r2215_1(glval) = VariableAddress[b] : +# 2215| r2215_2(bool) = Load[b] : &:r2215_1, ~m? +# 2215| v2215_3(void) = ConditionalBranch : r2215_2 +#-----| False -> Block 5 +#-----| True -> Block 3 + +# 2212| Block 1 +# 2212| v2212_6(void) = AliasedUse : ~m? +# 2212| v2212_7(void) = ExitFunction : + +# 2212| Block 2 +# 2212| v2212_8(void) = Unwind : +#-----| Goto -> Block 1 + +# 2216| Block 3 +# 2216| r2216_1(glval) = VariableAddress[#throw2216:7] : +# 2216| r2216_2(glval) = StringConstant["string literal"] : +# 2216| r2216_3(char *) = Convert : r2216_2 +# 2216| mu2216_4(char *) = Store[#throw2216:7] : &:r2216_1, r2216_3 +# 2216| v2216_5(void) = ThrowValue : &:r2216_1, ~m? +#-----| Exception -> Block 6 + +# 2219| Block 4 +# 2219| r2219_1(glval) = VariableAddress[s] : +# 2219| r2219_2(glval) = FunctionAddress[~String] : +# 2219| v2219_3(void) = Call[~String] : func:r2219_2, this:r2219_1 +# 2219| mu2219_4(unknown) = ^CallSideEffect : ~m? +# 2219| v2219_5(void) = ^IndirectReadSideEffect[-1] : &:r2219_1, ~m? +# 2219| mu2219_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2219_1 +#-----| Goto -> Block 5 + +# 2218| Block 5 +# 2218| r2218_1(glval) = VariableAddress[s2] : +# 2218| mu2218_2(String) = Uninitialized[s2] : &:r2218_1 +# 2218| r2218_3(glval) = FunctionAddress[String] : +# 2218| v2218_4(void) = Call[String] : func:r2218_3, this:r2218_1 +# 2218| mu2218_5(unknown) = ^CallSideEffect : ~m? +# 2218| mu2218_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2218_1 +# 2219| r2219_7(glval) = VariableAddress[s2] : +# 2219| r2219_8(glval) = FunctionAddress[~String] : +# 2219| v2219_9(void) = Call[~String] : func:r2219_8, this:r2219_7 +# 2219| mu2219_10(unknown) = ^CallSideEffect : ~m? +# 2219| v2219_11(void) = ^IndirectReadSideEffect[-1] : &:r2219_7, ~m? +# 2219| mu2219_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2219_7 +# 2219| r2219_13(glval) = VariableAddress[s] : +# 2219| r2219_14(glval) = FunctionAddress[~String] : +# 2219| v2219_15(void) = Call[~String] : func:r2219_14, this:r2219_13 +# 2219| mu2219_16(unknown) = ^CallSideEffect : ~m? +# 2219| v2219_17(void) = ^IndirectReadSideEffect[-1] : &:r2219_13, ~m? +# 2219| mu2219_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r2219_13 +#-----| Goto -> Block 11 + +# 2220| Block 6 +# 2220| v2220_1(void) = CatchByType[const char *] : +#-----| Exception -> Block 8 +#-----| Goto -> Block 7 + +# 2220| Block 7 +# 2220| r2220_2(glval) = VariableAddress[s] : +# 2220| mu2220_3(char *) = InitializeParameter[s] : &:r2220_2 +# 2220| r2220_4(char *) = Load[s] : &:r2220_2, ~m? +# 2220| mu2220_5(unknown) = InitializeIndirection[s] : &:r2220_4 +# 2221| r2221_1(glval) = VariableAddress[#throw2221:5] : +# 2221| mu2221_2(String) = Uninitialized[#throw2221:5] : &:r2221_1 +# 2221| r2221_3(glval) = FunctionAddress[String] : +# 2221| r2221_4(glval) = VariableAddress[s] : +# 2221| r2221_5(char *) = Load[s] : &:r2221_4, ~m? +# 2221| v2221_6(void) = Call[String] : func:r2221_3, this:r2221_1, 0:r2221_5 +# 2221| mu2221_7(unknown) = ^CallSideEffect : ~m? +# 2221| v2221_8(void) = ^BufferReadSideEffect[0] : &:r2221_5, ~m? +# 2221| mu2221_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2221_1 +# 2221| v2221_10(void) = ThrowValue : &:r2221_1, ~m? +#-----| Exception -> Block 2 + +# 2223| Block 8 +# 2223| v2223_1(void) = CatchByType[const String &] : +#-----| Exception -> Block 10 +#-----| Goto -> Block 9 + +# 2223| Block 9 +# 2223| r2223_2(glval) = VariableAddress[e] : +# 2223| mu2223_3(String &) = InitializeParameter[e] : &:r2223_2 +# 2223| r2223_4(String &) = Load[e] : &:r2223_2, ~m? +# 2223| mu2223_5(unknown) = InitializeIndirection[e] : &:r2223_4 +# 2223| v2223_6(void) = NoOp : +#-----| Goto -> Block 11 + +# 2225| Block 10 +# 2225| v2225_1(void) = CatchAny : +# 2226| v2226_1(void) = ReThrow : +#-----| Exception -> Block 2 + +# 2228| Block 11 +# 2228| v2228_1(void) = NoOp : +# 2212| v2212_9(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 2230| void IfDestructors(bool) +# 2230| Block 0 +# 2230| v2230_1(void) = EnterFunction : +# 2230| mu2230_2(unknown) = AliasedDefinition : +# 2230| mu2230_3(unknown) = InitializeNonLocal : +# 2230| r2230_4(glval) = VariableAddress[b] : +# 2230| mu2230_5(bool) = InitializeParameter[b] : &:r2230_4 +# 2231| r2231_1(glval) = VariableAddress[s1] : +# 2231| mu2231_2(String) = Uninitialized[s1] : &:r2231_1 +# 2231| r2231_3(glval) = FunctionAddress[String] : +# 2231| v2231_4(void) = Call[String] : func:r2231_3, this:r2231_1 +# 2231| mu2231_5(unknown) = ^CallSideEffect : ~m? +# 2231| mu2231_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2231_1 +# 2232| r2232_1(glval) = VariableAddress[b] : +# 2232| r2232_2(bool) = Load[b] : &:r2232_1, ~m? +# 2232| v2232_3(void) = ConditionalBranch : r2232_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2233| Block 1 +# 2233| r2233_1(glval) = VariableAddress[s2] : +# 2233| mu2233_2(String) = Uninitialized[s2] : &:r2233_1 +# 2233| r2233_3(glval) = FunctionAddress[String] : +# 2233| v2233_4(void) = Call[String] : func:r2233_3, this:r2233_1 +# 2233| mu2233_5(unknown) = ^CallSideEffect : ~m? +# 2233| mu2233_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2233_1 +# 2234| r2234_1(glval) = VariableAddress[s2] : +# 2234| r2234_2(glval) = FunctionAddress[~String] : +# 2234| v2234_3(void) = Call[~String] : func:r2234_2, this:r2234_1 +# 2234| mu2234_4(unknown) = ^CallSideEffect : ~m? +# 2234| v2234_5(void) = ^IndirectReadSideEffect[-1] : &:r2234_1, ~m? +# 2234| mu2234_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2234_1 +#-----| Goto -> Block 3 + +# 2235| Block 2 +# 2235| r2235_1(glval) = VariableAddress[s3] : +# 2235| mu2235_2(String) = Uninitialized[s3] : &:r2235_1 +# 2235| r2235_3(glval) = FunctionAddress[String] : +# 2235| v2235_4(void) = Call[String] : func:r2235_3, this:r2235_1 +# 2235| mu2235_5(unknown) = ^CallSideEffect : ~m? +# 2235| mu2235_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2235_1 +# 2236| r2236_1(glval) = VariableAddress[s3] : +# 2236| r2236_2(glval) = FunctionAddress[~String] : +# 2236| v2236_3(void) = Call[~String] : func:r2236_2, this:r2236_1 +# 2236| mu2236_4(unknown) = ^CallSideEffect : ~m? +# 2236| v2236_5(void) = ^IndirectReadSideEffect[-1] : &:r2236_1, ~m? +# 2236| mu2236_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2236_1 +#-----| Goto -> Block 3 + +# 2237| Block 3 +# 2237| r2237_1(glval) = VariableAddress[s4] : +# 2237| mu2237_2(String) = Uninitialized[s4] : &:r2237_1 +# 2237| r2237_3(glval) = FunctionAddress[String] : +# 2237| v2237_4(void) = Call[String] : func:r2237_3, this:r2237_1 +# 2237| mu2237_5(unknown) = ^CallSideEffect : ~m? +# 2237| mu2237_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2237_1 +# 2238| v2238_1(void) = NoOp : +# 2238| r2238_2(glval) = VariableAddress[s4] : +# 2238| r2238_3(glval) = FunctionAddress[~String] : +# 2238| v2238_4(void) = Call[~String] : func:r2238_3, this:r2238_2 +# 2238| mu2238_5(unknown) = ^CallSideEffect : ~m? +# 2238| v2238_6(void) = ^IndirectReadSideEffect[-1] : &:r2238_2, ~m? +# 2238| mu2238_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2238_2 +# 2238| r2238_8(glval) = VariableAddress[s1] : +# 2238| r2238_9(glval) = FunctionAddress[~String] : +# 2238| v2238_10(void) = Call[~String] : func:r2238_9, this:r2238_8 +# 2238| mu2238_11(unknown) = ^CallSideEffect : ~m? +# 2238| v2238_12(void) = ^IndirectReadSideEffect[-1] : &:r2238_8, ~m? +# 2238| mu2238_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2238_8 +# 2230| v2230_6(void) = ReturnVoid : +# 2230| v2230_7(void) = AliasedUse : ~m? +# 2230| v2230_8(void) = ExitFunction : + +# 2240| void ForDestructors() +# 2240| Block 0 +# 2240| v2240_1(void) = EnterFunction : +# 2240| mu2240_2(unknown) = AliasedDefinition : +# 2240| mu2240_3(unknown) = InitializeNonLocal : +# 2241| r2241_1(glval) = VariableAddress[c] : +# 2241| r2241_2(char) = Constant[97] : +# 2241| mu2241_3(char) = Store[c] : &:r2241_1, r2241_2 +# 2242| r2242_1(glval) = VariableAddress[s] : +# 2242| mu2242_2(String) = Uninitialized[s] : &:r2242_1 +# 2242| r2242_3(glval) = FunctionAddress[String] : +# 2242| r2242_4(glval) = StringConstant["hello"] : +# 2242| r2242_5(char *) = Convert : r2242_4 +# 2242| v2242_6(void) = Call[String] : func:r2242_3, this:r2242_1, 0:r2242_5 +# 2242| mu2242_7(unknown) = ^CallSideEffect : ~m? +# 2242| v2242_8(void) = ^BufferReadSideEffect[0] : &:r2242_5, ~m? +# 2242| mu2242_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2242_1 +#-----| Goto -> Block 1 + +# 2242| Block 1 +# 2242| r2242_10(glval) = VariableAddress[c] : +# 2242| r2242_11(char) = Load[c] : &:r2242_10, ~m? +# 2242| r2242_12(int) = Convert : r2242_11 +# 2242| r2242_13(int) = Constant[0] : +# 2242| r2242_14(bool) = CompareNE : r2242_12, r2242_13 +# 2242| v2242_15(void) = ConditionalBranch : r2242_14 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2243| Block 2 +# 2243| r2243_1(glval) = VariableAddress[s2] : +# 2243| mu2243_2(String) = Uninitialized[s2] : &:r2243_1 +# 2243| r2243_3(glval) = FunctionAddress[String] : +# 2243| v2243_4(void) = Call[String] : func:r2243_3, this:r2243_1 +# 2243| mu2243_5(unknown) = ^CallSideEffect : ~m? +# 2243| mu2243_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2243_1 +# 2244| r2244_1(glval) = VariableAddress[s2] : +# 2244| r2244_2(glval) = FunctionAddress[~String] : +# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1 +# 2244| mu2244_4(unknown) = ^CallSideEffect : ~m? +# 2244| v2244_5(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, ~m? +# 2244| mu2244_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1 +# 2242| r2242_16(glval) = VariableAddress[s] : +# 2242| r2242_17(glval) = FunctionAddress[pop_back] : +# 2242| r2242_18(char) = Call[pop_back] : func:r2242_17, this:r2242_16 +# 2242| mu2242_19(unknown) = ^CallSideEffect : ~m? +# 2242| v2242_20(void) = ^IndirectReadSideEffect[-1] : &:r2242_16, ~m? +# 2242| mu2242_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r2242_16 +# 2242| r2242_22(glval) = VariableAddress[c] : +# 2242| mu2242_23(char) = Store[c] : &:r2242_22, r2242_18 +#-----| Goto (back edge) -> Block 1 + +# 2242| Block 3 +# 2242| r2242_24(glval) = VariableAddress[s] : +# 2242| r2242_25(glval) = FunctionAddress[~String] : +# 2242| v2242_26(void) = Call[~String] : func:r2242_25, this:r2242_24 +# 2242| mu2242_27(unknown) = ^CallSideEffect : ~m? +# 2242| v2242_28(void) = ^IndirectReadSideEffect[-1] : &:r2242_24, ~m? +# 2242| mu2242_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r2242_24 +# 2246| r2246_1(glval &&>) = VariableAddress[(__range)] : +# 2246| r2246_2(glval>) = VariableAddress[#temp2246:20] : +# 2246| mu2246_3(vector) = Uninitialized[#temp2246:20] : &:r2246_2 +# 2246| r2246_4(glval) = FunctionAddress[vector] : +# 2246| r2246_5(glval) = VariableAddress[#temp2246:35] : +# 2246| mu2246_6(String) = Uninitialized[#temp2246:35] : &:r2246_5 +# 2246| r2246_7(glval) = FunctionAddress[String] : +# 2246| r2246_8(glval) = StringConstant["hello"] : +# 2246| r2246_9(char *) = Convert : r2246_8 +# 2246| v2246_10(void) = Call[String] : func:r2246_7, this:r2246_5, 0:r2246_9 +# 2246| mu2246_11(unknown) = ^CallSideEffect : ~m? +# 2246| v2246_12(void) = ^BufferReadSideEffect[0] : &:r2246_9, ~m? +# 2246| mu2246_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2246_5 +# 2246| r2246_14(String) = Load[#temp2246:35] : &:r2246_5, ~m? +# 2246| v2246_15(void) = Call[vector] : func:r2246_4, this:r2246_2, 0:r2246_14 +# 2246| mu2246_16(unknown) = ^CallSideEffect : ~m? +# 2246| mu2246_17(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2246_2 +# 2246| r2246_18(vector &) = CopyValue : r2246_2 +# 2246| mu2246_19(vector &&) = Store[(__range)] : &:r2246_1, r2246_18 +# 2246| r2246_20(glval) = VariableAddress[(__begin)] : +# 2246| r2246_21(glval &&>) = VariableAddress[(__range)] : +# 2246| r2246_22(vector &&) = Load[(__range)] : &:r2246_21, ~m? +#-----| r0_1(glval>) = CopyValue : r2246_22 +#-----| r0_2(glval>) = Convert : r0_1 +# 2246| r2246_23(glval) = FunctionAddress[begin] : +# 2246| r2246_24(iterator) = Call[begin] : func:r2246_23, this:r0_2 +# 2246| mu2246_25(unknown) = ^CallSideEffect : ~m? +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? +# 2246| mu2246_26(iterator) = Store[(__begin)] : &:r2246_20, r2246_24 +# 2246| r2246_27(glval) = VariableAddress[(__end)] : +# 2246| r2246_28(glval &&>) = VariableAddress[(__range)] : +# 2246| r2246_29(vector &&) = Load[(__range)] : &:r2246_28, ~m? +#-----| r0_4(glval>) = CopyValue : r2246_29 +#-----| r0_5(glval>) = Convert : r0_4 +# 2246| r2246_30(glval) = FunctionAddress[end] : +# 2246| r2246_31(iterator) = Call[end] : func:r2246_30, this:r0_5 +# 2246| mu2246_32(unknown) = ^CallSideEffect : ~m? +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? +# 2246| mu2246_33(iterator) = Store[(__end)] : &:r2246_27, r2246_31 +#-----| Goto -> Block 4 + +# 2246| Block 4 +# 2246| r2246_34(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r2246_34 +# 2246| r2246_35(glval) = FunctionAddress[operator!=] : +# 2246| r2246_36(glval) = VariableAddress[(__end)] : +# 2246| r2246_37(iterator) = Load[(__end)] : &:r2246_36, ~m? +# 2246| r2246_38(bool) = Call[operator!=] : func:r2246_35, this:r0_7, 0:r2246_37 +# 2246| mu2246_39(unknown) = ^CallSideEffect : ~m? +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? +# 2246| v2246_40(void) = ConditionalBranch : r2246_38 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2246| Block 5 +# 2246| r2246_41(glval) = VariableAddress[s] : +# 2246| mu2246_42(String) = Uninitialized[s] : &:r2246_41 +# 2246| r2246_43(glval) = FunctionAddress[String] : +# 2246| r2246_44(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2246_44 +# 2246| r2246_45(glval) = FunctionAddress[operator*] : +# 2246| r2246_46(String &) = Call[operator*] : func:r2246_45, this:r0_9 +# 2246| mu2246_47(unknown) = ^CallSideEffect : ~m? +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m? +# 2246| r2246_48(glval) = CopyValue : r2246_46 +# 2246| r2246_49(glval) = Convert : r2246_48 +# 2246| r2246_50(String &) = CopyValue : r2246_49 +# 2246| v2246_51(void) = Call[String] : func:r2246_43, this:r2246_41, 0:r2246_50 +# 2246| mu2246_52(unknown) = ^CallSideEffect : ~m? +# 2246| v2246_53(void) = ^BufferReadSideEffect[0] : &:r2246_50, ~m? +# 2246| mu2246_54(String) = ^IndirectMayWriteSideEffect[-1] : &:r2246_41 +# 2247| r2247_1(glval) = VariableAddress[s2] : +# 2247| mu2247_2(String) = Uninitialized[s2] : &:r2247_1 +# 2247| r2247_3(glval) = FunctionAddress[String] : +# 2247| v2247_4(void) = Call[String] : func:r2247_3, this:r2247_1 +# 2247| mu2247_5(unknown) = ^CallSideEffect : ~m? +# 2247| mu2247_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2247_1 +# 2248| r2248_1(glval) = VariableAddress[s2] : +# 2248| r2248_2(glval) = FunctionAddress[~String] : +# 2248| v2248_3(void) = Call[~String] : func:r2248_2, this:r2248_1 +# 2248| mu2248_4(unknown) = ^CallSideEffect : ~m? +# 2248| v2248_5(void) = ^IndirectReadSideEffect[-1] : &:r2248_1, ~m? +# 2248| mu2248_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2248_1 +# 2246| r2246_55(glval) = VariableAddress[s] : +# 2246| r2246_56(glval) = FunctionAddress[~String] : +# 2246| v2246_57(void) = Call[~String] : func:r2246_56, this:r2246_55 +# 2246| mu2246_58(unknown) = ^CallSideEffect : ~m? +# 2246| v2246_59(void) = ^IndirectReadSideEffect[-1] : &:r2246_55, ~m? +# 2246| mu2246_60(String) = ^IndirectMayWriteSideEffect[-1] : &:r2246_55 +# 2246| r2246_61(glval) = VariableAddress[(__begin)] : +# 2246| r2246_62(glval) = FunctionAddress[operator++] : +# 2246| r2246_63(iterator &) = Call[operator++] : func:r2246_62, this:r2246_61 +# 2246| mu2246_64(unknown) = ^CallSideEffect : ~m? +# 2246| v2246_65(void) = ^IndirectReadSideEffect[-1] : &:r2246_61, ~m? +# 2246| mu2246_66(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2246_61 +# 2246| r2246_67(glval) = CopyValue : r2246_63 +#-----| Goto (back edge) -> Block 4 + +# 2250| Block 6 +# 2250| r2250_1(glval) = VariableAddress[s] : +# 2250| mu2250_2(String) = Uninitialized[s] : &:r2250_1 +# 2250| r2250_3(glval) = FunctionAddress[String] : +# 2250| r2250_4(glval) = StringConstant["hello"] : +# 2250| r2250_5(char *) = Convert : r2250_4 +# 2250| v2250_6(void) = Call[String] : func:r2250_3, this:r2250_1, 0:r2250_5 +# 2250| mu2250_7(unknown) = ^CallSideEffect : ~m? +# 2250| v2250_8(void) = ^BufferReadSideEffect[0] : &:r2250_5, ~m? +# 2250| mu2250_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_1 +# 2250| r2250_10(glval) = VariableAddress[s2] : +# 2250| mu2250_11(String) = Uninitialized[s2] : &:r2250_10 +# 2250| r2250_12(glval) = FunctionAddress[String] : +# 2250| r2250_13(glval) = StringConstant["world"] : +# 2250| r2250_14(char *) = Convert : r2250_13 +# 2250| v2250_15(void) = Call[String] : func:r2250_12, this:r2250_10, 0:r2250_14 +# 2250| mu2250_16(unknown) = ^CallSideEffect : ~m? +# 2250| v2250_17(void) = ^BufferReadSideEffect[0] : &:r2250_14, ~m? +# 2250| mu2250_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_10 +#-----| Goto -> Block 7 + +# 2250| Block 7 +# 2250| r2250_19(glval) = VariableAddress[c] : +# 2250| r2250_20(char) = Load[c] : &:r2250_19, ~m? +# 2250| r2250_21(int) = Convert : r2250_20 +# 2250| r2250_22(int) = Constant[0] : +# 2250| r2250_23(bool) = CompareNE : r2250_21, r2250_22 +# 2250| v2250_24(void) = ConditionalBranch : r2250_23 +#-----| False -> Block 9 +#-----| True -> Block 8 + +# 2251| Block 8 +# 2251| r2251_1(char) = Constant[0] : +# 2251| r2251_2(glval) = VariableAddress[c] : +# 2251| mu2251_3(char) = Store[c] : &:r2251_2, r2251_1 +# 2250| r2250_25(glval) = VariableAddress[s] : +# 2250| r2250_26(glval) = FunctionAddress[pop_back] : +# 2250| r2250_27(char) = Call[pop_back] : func:r2250_26, this:r2250_25 +# 2250| mu2250_28(unknown) = ^CallSideEffect : ~m? +# 2250| v2250_29(void) = ^IndirectReadSideEffect[-1] : &:r2250_25, ~m? +# 2250| mu2250_30(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_25 +# 2250| r2250_31(glval) = VariableAddress[c] : +# 2250| mu2250_32(char) = Store[c] : &:r2250_31, r2250_27 +#-----| Goto (back edge) -> Block 7 + +# 2250| Block 9 +# 2250| r2250_33(glval) = VariableAddress[s2] : +# 2250| r2250_34(glval) = FunctionAddress[~String] : +# 2250| v2250_35(void) = Call[~String] : func:r2250_34, this:r2250_33 +# 2250| mu2250_36(unknown) = ^CallSideEffect : ~m? +# 2250| v2250_37(void) = ^IndirectReadSideEffect[-1] : &:r2250_33, ~m? +# 2250| mu2250_38(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_33 +# 2250| r2250_39(glval) = VariableAddress[s] : +# 2250| r2250_40(glval) = FunctionAddress[~String] : +# 2250| v2250_41(void) = Call[~String] : func:r2250_40, this:r2250_39 +# 2250| mu2250_42(unknown) = ^CallSideEffect : ~m? +# 2250| v2250_43(void) = ^IndirectReadSideEffect[-1] : &:r2250_39, ~m? +# 2250| mu2250_44(String) = ^IndirectMayWriteSideEffect[-1] : &:r2250_39 +# 2253| v2253_1(void) = NoOp : +# 2240| v2240_4(void) = ReturnVoid : +# 2240| v2240_5(void) = AliasedUse : ~m? +# 2240| v2240_6(void) = ExitFunction : + +# 2255| void IfDestructors2(bool) +# 2255| Block 0 +# 2255| v2255_1(void) = EnterFunction : +# 2255| mu2255_2(unknown) = AliasedDefinition : +# 2255| mu2255_3(unknown) = InitializeNonLocal : +# 2255| r2255_4(glval) = VariableAddress[b] : +# 2255| mu2255_5(bool) = InitializeParameter[b] : &:r2255_4 +# 2256| r2256_1(glval) = VariableAddress[s] : +# 2256| mu2256_2(String) = Uninitialized[s] : &:r2256_1 +# 2256| r2256_3(glval) = FunctionAddress[String] : +# 2256| r2256_4(glval) = StringConstant["hello"] : +# 2256| r2256_5(char *) = Convert : r2256_4 +# 2256| v2256_6(void) = Call[String] : func:r2256_3, this:r2256_1, 0:r2256_5 +# 2256| mu2256_7(unknown) = ^CallSideEffect : ~m? +# 2256| v2256_8(void) = ^BufferReadSideEffect[0] : &:r2256_5, ~m? +# 2256| mu2256_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2256_1 +# 2256| r2256_10(glval) = VariableAddress[b] : +# 2256| r2256_11(bool) = Load[b] : &:r2256_10, ~m? +# 2256| v2256_12(void) = ConditionalBranch : r2256_11 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2257| Block 1 +# 2257| r2257_1(glval) = VariableAddress[x] : +# 2257| r2257_2(int) = Constant[0] : +# 2257| mu2257_3(int) = Store[x] : &:r2257_1, r2257_2 +#-----| Goto -> Block 3 + +# 2259| Block 2 +# 2259| r2259_1(glval) = VariableAddress[y] : +# 2259| r2259_2(int) = Constant[0] : +# 2259| mu2259_3(int) = Store[y] : &:r2259_1, r2259_2 +#-----| Goto -> Block 3 + +# 2260| Block 3 +# 2260| r2260_1(glval) = VariableAddress[s] : +# 2260| r2260_2(glval) = FunctionAddress[~String] : +# 2260| v2260_3(void) = Call[~String] : func:r2260_2, this:r2260_1 +# 2260| mu2260_4(unknown) = ^CallSideEffect : ~m? +# 2260| v2260_5(void) = ^IndirectReadSideEffect[-1] : &:r2260_1, ~m? +# 2260| mu2260_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2260_1 +# 2261| v2261_1(void) = NoOp : +# 2255| v2255_6(void) = ReturnVoid : +# 2255| v2255_7(void) = AliasedUse : ~m? +# 2255| v2255_8(void) = ExitFunction : + +# 2270| void IfDestructors3(bool) +# 2270| Block 0 +# 2270| v2270_1(void) = EnterFunction : +# 2270| mu2270_2(unknown) = AliasedDefinition : +# 2270| mu2270_3(unknown) = InitializeNonLocal : +# 2270| r2270_4(glval) = VariableAddress[b] : +# 2270| mu2270_5(bool) = InitializeParameter[b] : &:r2270_4 +# 2271| r2271_1(glval) = VariableAddress[B] : +# 2271| mu2271_2(Bool) = Uninitialized[B] : &:r2271_1 +# 2271| r2271_3(glval) = FunctionAddress[Bool] : +# 2271| r2271_4(glval) = VariableAddress[b] : +# 2271| r2271_5(bool) = Load[b] : &:r2271_4, ~m? +# 2271| v2271_6(void) = Call[Bool] : func:r2271_3, this:r2271_1, 0:r2271_5 +# 2271| mu2271_7(unknown) = ^CallSideEffect : ~m? +# 2271| mu2271_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2271_1 +# 2271| r2271_9(glval) = VariableAddress[B] : +# 2271| r2271_10(glval) = FunctionAddress[operator bool] : +# 2271| r2271_11(bool) = Call[operator bool] : func:r2271_10, this:r2271_9 +# 2271| mu2271_12(unknown) = ^CallSideEffect : ~m? +# 2271| v2271_13(void) = ^IndirectReadSideEffect[-1] : &:r2271_9, ~m? +# 2271| mu2271_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2271_9 +# 2271| r2271_15(bool) = CopyValue : r2271_11 +# 2271| v2271_16(void) = ConditionalBranch : r2271_15 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2272| Block 1 +# 2272| r2272_1(glval) = VariableAddress[s1] : +# 2272| mu2272_2(String) = Uninitialized[s1] : &:r2272_1 +# 2272| r2272_3(glval) = FunctionAddress[String] : +# 2272| v2272_4(void) = Call[String] : func:r2272_3, this:r2272_1 +# 2272| mu2272_5(unknown) = ^CallSideEffect : ~m? +# 2272| mu2272_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2272_1 +# 2273| r2273_1(glval) = VariableAddress[s1] : +# 2273| r2273_2(glval) = FunctionAddress[~String] : +# 2273| v2273_3(void) = Call[~String] : func:r2273_2, this:r2273_1 +# 2273| mu2273_4(unknown) = ^CallSideEffect : ~m? +# 2273| v2273_5(void) = ^IndirectReadSideEffect[-1] : &:r2273_1, ~m? +# 2273| mu2273_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2273_1 +#-----| Goto -> Block 3 + +# 2274| Block 2 +# 2274| r2274_1(glval) = VariableAddress[s2] : +# 2274| mu2274_2(String) = Uninitialized[s2] : &:r2274_1 +# 2274| r2274_3(glval) = FunctionAddress[String] : +# 2274| v2274_4(void) = Call[String] : func:r2274_3, this:r2274_1 +# 2274| mu2274_5(unknown) = ^CallSideEffect : ~m? +# 2274| mu2274_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2274_1 +# 2275| r2275_1(glval) = VariableAddress[s2] : +# 2275| r2275_2(glval) = FunctionAddress[~String] : +# 2275| v2275_3(void) = Call[~String] : func:r2275_2, this:r2275_1 +# 2275| mu2275_4(unknown) = ^CallSideEffect : ~m? +# 2275| v2275_5(void) = ^IndirectReadSideEffect[-1] : &:r2275_1, ~m? +# 2275| mu2275_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2275_1 +#-----| Goto -> Block 3 + +# 2275| Block 3 +# 2275| r2275_7(glval) = VariableAddress[B] : +# 2275| r2275_8(glval) = FunctionAddress[~Bool] : +# 2275| v2275_9(void) = Call[~Bool] : func:r2275_8, this:r2275_7 +# 2275| mu2275_10(unknown) = ^CallSideEffect : ~m? +# 2275| v2275_11(void) = ^IndirectReadSideEffect[-1] : &:r2275_7, ~m? +# 2275| mu2275_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2275_7 +# 2276| v2276_1(void) = NoOp : +# 2270| v2270_6(void) = ReturnVoid : +# 2270| v2270_7(void) = AliasedUse : ~m? +# 2270| v2270_8(void) = ExitFunction : + +# 2278| void WhileLoopDestructors(bool) +# 2278| Block 0 +# 2278| v2278_1(void) = EnterFunction : +# 2278| mu2278_2(unknown) = AliasedDefinition : +# 2278| mu2278_3(unknown) = InitializeNonLocal : +# 2278| r2278_4(glval) = VariableAddress[b] : +# 2278| mu2278_5(bool) = InitializeParameter[b] : &:r2278_4 +# 2280| r2280_1(glval) = VariableAddress[s] : +# 2280| mu2280_2(String) = Uninitialized[s] : &:r2280_1 +# 2280| r2280_3(glval) = FunctionAddress[String] : +# 2280| v2280_4(void) = Call[String] : func:r2280_3, this:r2280_1 +# 2280| mu2280_5(unknown) = ^CallSideEffect : ~m? +# 2280| mu2280_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_1 +#-----| Goto -> Block 1 + +# 2281| Block 1 +# 2281| r2281_1(glval) = VariableAddress[b] : +# 2281| r2281_2(bool) = Load[b] : &:r2281_1, ~m? +# 2281| v2281_3(void) = ConditionalBranch : r2281_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2282| Block 2 +# 2282| r2282_1(bool) = Constant[0] : +# 2282| r2282_2(glval) = VariableAddress[b] : +# 2282| mu2282_3(bool) = Store[b] : &:r2282_2, r2282_1 +#-----| Goto (back edge) -> Block 1 + +# 2284| Block 3 +# 2284| r2284_1(glval) = VariableAddress[s] : +# 2284| r2284_2(glval) = FunctionAddress[~String] : +# 2284| v2284_3(void) = Call[~String] : func:r2284_2, this:r2284_1 +# 2284| mu2284_4(unknown) = ^CallSideEffect : ~m? +# 2284| v2284_5(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, ~m? +# 2284| mu2284_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1 +#-----| Goto -> Block 4 + +# 2287| Block 4 +# 2287| r2287_1(glval) = VariableAddress[B] : +# 2287| mu2287_2(Bool) = Uninitialized[B] : &:r2287_1 +# 2287| r2287_3(glval) = FunctionAddress[Bool] : +# 2287| r2287_4(glval) = VariableAddress[b] : +# 2287| r2287_5(bool) = Load[b] : &:r2287_4, ~m? +# 2287| v2287_6(void) = Call[Bool] : func:r2287_3, this:r2287_1, 0:r2287_5 +# 2287| mu2287_7(unknown) = ^CallSideEffect : ~m? +# 2287| mu2287_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2287_1 +# 2287| r2287_9(glval) = VariableAddress[B] : +# 2287| r2287_10(glval) = FunctionAddress[operator bool] : +# 2287| r2287_11(bool) = Call[operator bool] : func:r2287_10, this:r2287_9 +# 2287| mu2287_12(unknown) = ^CallSideEffect : ~m? +# 2287| v2287_13(void) = ^IndirectReadSideEffect[-1] : &:r2287_9, ~m? +# 2287| mu2287_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2287_9 +# 2287| r2287_15(bool) = CopyValue : r2287_11 +# 2287| v2287_16(void) = ConditionalBranch : r2287_15 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2288| Block 5 +# 2288| r2288_1(bool) = Constant[0] : +# 2288| r2288_2(glval) = VariableAddress[b] : +# 2288| mu2288_3(bool) = Store[b] : &:r2288_2, r2288_1 +# 2289| r2289_1(glval) = VariableAddress[B] : +# 2289| r2289_2(glval) = FunctionAddress[~Bool] : +# 2289| v2289_3(void) = Call[~Bool] : func:r2289_2, this:r2289_1 +# 2289| mu2289_4(unknown) = ^CallSideEffect : ~m? +# 2289| v2289_5(void) = ^IndirectReadSideEffect[-1] : &:r2289_1, ~m? +# 2289| mu2289_6(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2289_1 +#-----| Goto (back edge) -> Block 4 + +# 2289| Block 6 +# 2289| r2289_7(glval) = VariableAddress[B] : +# 2289| r2289_8(glval) = FunctionAddress[~Bool] : +# 2289| v2289_9(void) = Call[~Bool] : func:r2289_8, this:r2289_7 +# 2289| mu2289_10(unknown) = ^CallSideEffect : ~m? +# 2289| v2289_11(void) = ^IndirectReadSideEffect[-1] : &:r2289_7, ~m? +# 2289| mu2289_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2289_7 +# 2291| v2291_1(void) = NoOp : +# 2278| v2278_6(void) = ReturnVoid : +# 2278| v2278_7(void) = AliasedUse : ~m? +# 2278| v2278_8(void) = ExitFunction : + +# 2293| void VoidFunc() +# 2293| Block 0 +# 2293| v2293_1(void) = EnterFunction : +# 2293| mu2293_2(unknown) = AliasedDefinition : +# 2293| mu2293_3(unknown) = InitializeNonLocal : +# 2293| v2293_4(void) = NoOp : +# 2293| v2293_5(void) = ReturnVoid : +# 2293| v2293_6(void) = AliasedUse : ~m? +# 2293| v2293_7(void) = ExitFunction : + +# 2295| void IfReturnDestructors(bool) +# 2295| Block 0 +# 2295| v2295_1(void) = EnterFunction : +# 2295| mu2295_2(unknown) = AliasedDefinition : +# 2295| mu2295_3(unknown) = InitializeNonLocal : +# 2295| r2295_4(glval) = VariableAddress[b] : +# 2295| mu2295_5(bool) = InitializeParameter[b] : &:r2295_4 +# 2296| r2296_1(glval) = VariableAddress[s] : +# 2296| mu2296_2(String) = Uninitialized[s] : &:r2296_1 +# 2296| r2296_3(glval) = FunctionAddress[String] : +# 2296| v2296_4(void) = Call[String] : func:r2296_3, this:r2296_1 +# 2296| mu2296_5(unknown) = ^CallSideEffect : ~m? +# 2296| mu2296_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2296_1 +# 2297| r2297_1(glval) = VariableAddress[b] : +# 2297| r2297_2(bool) = Load[b] : &:r2297_1, ~m? +# 2297| v2297_3(void) = ConditionalBranch : r2297_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2295| Block 1 +# 2295| v2295_6(void) = ReturnVoid : +# 2295| v2295_7(void) = AliasedUse : ~m? +# 2295| v2295_8(void) = ExitFunction : + +# 2298| Block 2 +# 2298| v2298_1(void) = NoOp : +# 2304| r2304_1(glval) = VariableAddress[s] : +# 2304| r2304_2(glval) = FunctionAddress[~String] : +# 2304| v2304_3(void) = Call[~String] : func:r2304_2, this:r2304_1 +# 2304| mu2304_4(unknown) = ^CallSideEffect : ~m? +# 2304| v2304_5(void) = ^IndirectReadSideEffect[-1] : &:r2304_1, ~m? +# 2304| mu2304_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2304_1 +#-----| Goto -> Block 1 + +# 2300| Block 3 +# 2300| r2300_1(glval) = VariableAddress[b] : +# 2300| r2300_2(bool) = Load[b] : &:r2300_1, ~m? +# 2300| v2300_3(void) = ConditionalBranch : r2300_2 +#-----| False -> Block 5 +#-----| True -> Block 4 + +# 2301| Block 4 +# 2301| r2301_1(glval) = FunctionAddress[VoidFunc] : +# 2301| v2301_2(void) = Call[VoidFunc] : func:r2301_1 +# 2301| mu2301_3(unknown) = ^CallSideEffect : ~m? +# 2301| v2301_4(void) = NoOp : +# 2304| r2304_7(glval) = VariableAddress[s] : +# 2304| r2304_8(glval) = FunctionAddress[~String] : +# 2304| v2304_9(void) = Call[~String] : func:r2304_8, this:r2304_7 +# 2304| mu2304_10(unknown) = ^CallSideEffect : ~m? +# 2304| v2304_11(void) = ^IndirectReadSideEffect[-1] : &:r2304_7, ~m? +# 2304| mu2304_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2304_7 +#-----| Goto -> Block 1 + +# 2303| Block 5 +# 2303| r2303_1(glval) = VariableAddress[s] : +# 2304| v2304_13(void) = NoOp : +# 2304| r2304_14(glval) = VariableAddress[s] : +# 2304| r2304_15(glval) = FunctionAddress[~String] : +# 2304| v2304_16(void) = Call[~String] : func:r2304_15, this:r2304_14 +# 2304| mu2304_17(unknown) = ^CallSideEffect : ~m? +# 2304| v2304_18(void) = ^IndirectReadSideEffect[-1] : &:r2304_14, ~m? +# 2304| mu2304_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r2304_14 +#-----| Goto -> Block 1 + +# 2306| int IfReturnDestructors3(bool) +# 2306| Block 0 +# 2306| v2306_1(void) = EnterFunction : +# 2306| mu2306_2(unknown) = AliasedDefinition : +# 2306| mu2306_3(unknown) = InitializeNonLocal : +# 2306| r2306_4(glval) = VariableAddress[b] : +# 2306| mu2306_5(bool) = InitializeParameter[b] : &:r2306_4 +# 2307| r2307_1(glval) = VariableAddress[s] : +# 2307| mu2307_2(String) = Uninitialized[s] : &:r2307_1 +# 2307| r2307_3(glval) = FunctionAddress[String] : +# 2307| v2307_4(void) = Call[String] : func:r2307_3, this:r2307_1 +# 2307| mu2307_5(unknown) = ^CallSideEffect : ~m? +# 2307| mu2307_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2307_1 +# 2308| r2308_1(glval) = VariableAddress[b] : +# 2308| r2308_2(bool) = Load[b] : &:r2308_1, ~m? +# 2308| v2308_3(void) = ConditionalBranch : r2308_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2306| Block 1 +# 2306| r2306_6(glval) = VariableAddress[#return] : +# 2306| v2306_7(void) = ReturnValue : &:r2306_6, ~m? +# 2306| v2306_8(void) = AliasedUse : ~m? +# 2306| v2306_9(void) = ExitFunction : + +# 2309| Block 2 +# 2309| r2309_1(glval) = VariableAddress[#return] : +# 2309| r2309_2(int) = Constant[1] : +# 2309| mu2309_3(int) = Store[#return] : &:r2309_1, r2309_2 +# 2312| r2312_1(glval) = VariableAddress[s] : +# 2312| r2312_2(glval) = FunctionAddress[~String] : +# 2312| v2312_3(void) = Call[~String] : func:r2312_2, this:r2312_1 +# 2312| mu2312_4(unknown) = ^CallSideEffect : ~m? +# 2312| v2312_5(void) = ^IndirectReadSideEffect[-1] : &:r2312_1, ~m? +# 2312| mu2312_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2312_1 +#-----| Goto -> Block 1 + +# 2311| Block 3 +# 2311| r2311_1(glval) = VariableAddress[#return] : +# 2311| r2311_2(int) = Constant[0] : +# 2311| mu2311_3(int) = Store[#return] : &:r2311_1, r2311_2 +# 2312| r2312_7(glval) = VariableAddress[s] : +# 2312| r2312_8(glval) = FunctionAddress[~String] : +# 2312| v2312_9(void) = Call[~String] : func:r2312_8, this:r2312_7 +# 2312| mu2312_10(unknown) = ^CallSideEffect : ~m? +# 2312| v2312_11(void) = ^IndirectReadSideEffect[-1] : &:r2312_7, ~m? +# 2312| mu2312_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2312_7 +#-----| Goto -> Block 1 + +# 2314| void VoidReturnDestructors() +# 2314| Block 0 +# 2314| v2314_1(void) = EnterFunction : +# 2314| mu2314_2(unknown) = AliasedDefinition : +# 2314| mu2314_3(unknown) = InitializeNonLocal : +# 2315| r2315_1(glval) = VariableAddress[s] : +# 2315| mu2315_2(String) = Uninitialized[s] : &:r2315_1 +# 2315| r2315_3(glval) = FunctionAddress[String] : +# 2315| v2315_4(void) = Call[String] : func:r2315_3, this:r2315_1 +# 2315| mu2315_5(unknown) = ^CallSideEffect : ~m? +# 2315| mu2315_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2315_1 +# 2316| r2316_1(glval) = FunctionAddress[VoidFunc] : +# 2316| v2316_2(void) = Call[VoidFunc] : func:r2316_1 +# 2316| mu2316_3(unknown) = ^CallSideEffect : ~m? +# 2316| v2316_4(void) = NoOp : +# 2317| r2317_1(glval) = VariableAddress[s] : +# 2317| r2317_2(glval) = FunctionAddress[~String] : +# 2317| v2317_3(void) = Call[~String] : func:r2317_2, this:r2317_1 +# 2317| mu2317_4(unknown) = ^CallSideEffect : ~m? +# 2317| v2317_5(void) = ^IndirectReadSideEffect[-1] : &:r2317_1, ~m? +# 2317| mu2317_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2317_1 +# 2314| v2314_4(void) = ReturnVoid : +# 2314| v2314_5(void) = AliasedUse : ~m? +# 2314| v2314_6(void) = ExitFunction : + +# 2327| return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() +# 2327| Block 0 +# 2327| v2327_1(void) = EnterFunction : +# 2327| mu2327_2(unknown) = AliasedDefinition : +# 2327| mu2327_3(unknown) = InitializeNonLocal : +# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : +# 2329| r2329_2(..()(..)) = FunctionAddress[VoidToInt] : +# 2329| mu2329_3(..:: *) = Store[#return] : &:r2329_1, r2329_2 +# 2327| r2327_4(glval<..:: *>) = VariableAddress[#return] : +# 2327| v2327_5(void) = ReturnValue : &:r2327_4, ~m? +# 2327| v2327_6(void) = AliasedUse : ~m? +# 2327| v2327_7(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 @@ -12244,6 +13601,11 @@ smart_ptr.cpp: # 12| v12_12(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m? # 12| mu12_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 # 13| v13_1(void) = NoOp : +# 13| r13_2(glval>>) = VariableAddress[up] : +# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : +# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 +# 13| v13_5(void) = ^IndirectReadSideEffect[-1] : &:r13_2, ~m? +# 13| mu13_6(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r13_2 # 10| v10_8(void) = ReturnIndirection[p] : &:r10_6, ~m? # 10| v10_9(void) = ReturnVoid : # 10| v10_10(void) = AliasedUse : ~m? @@ -12283,6 +13645,11 @@ smart_ptr.cpp: # 19| v19_15(void) = ^BufferReadSideEffect[0] : &:r19_12, ~m? # 19| mu19_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_12 # 20| v20_1(void) = NoOp : +# 20| r20_2(glval>) = VariableAddress[sp] : +# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : +# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 +# 20| v20_5(void) = ^IndirectReadSideEffect[-1] : &:r20_2, ~m? +# 20| mu20_6(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r20_2 # 17| v17_8(void) = ReturnIndirection[p] : &:r17_6, ~m? # 17| v17_9(void) = ReturnVoid : # 17| v17_10(void) = AliasedUse : ~m? @@ -12382,6 +13749,31 @@ smart_ptr.cpp: # 47| mu47_14(unknown) = ^CallSideEffect : ~m? # 47| v47_15(void) = ^BufferReadSideEffect[0] : &:r47_12, ~m? # 48| v48_1(void) = NoOp : +# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 +# 48| v48_5(void) = ^IndirectReadSideEffect[-1] : &:r48_2, ~m? +# 48| mu48_6(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_2 +# 48| r48_7(glval>>) = VariableAddress[sp_const_sp_int] : +# 48| r48_8(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_9(void) = Call[~shared_ptr] : func:r48_8, this:r48_7 +# 48| v48_10(void) = ^IndirectReadSideEffect[-1] : &:r48_7, ~m? +# 48| mu48_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_7 +# 48| r48_12(glval>>) = VariableAddress[sp_sp_const_int] : +# 48| r48_13(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_14(void) = Call[~shared_ptr] : func:r48_13, this:r48_12 +# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_12, ~m? +# 48| mu48_16(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_12 +# 48| r48_17(glval>) = VariableAddress[sp_const_int_pointer] : +# 48| r48_18(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_19(void) = Call[~shared_ptr] : func:r48_18, this:r48_17 +# 48| v48_20(void) = ^IndirectReadSideEffect[-1] : &:r48_17, ~m? +# 48| mu48_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_17 +# 48| r48_22(glval>) = VariableAddress[sp_const_int] : +# 48| r48_23(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_24(void) = Call[~shared_ptr] : func:r48_23, this:r48_22 +# 48| v48_25(void) = ^IndirectReadSideEffect[-1] : &:r48_22, ~m? +# 48| mu48_26(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_22 # 28| v28_4(void) = ReturnVoid : # 28| v28_5(void) = AliasedUse : ~m? # 28| v28_6(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/points_to/points_to.expected b/cpp/ql/test/library-tests/ir/points_to/points_to.expected index 48de9172b36..8ec8033d086 100644 --- a/cpp/ql/test/library-tests/ir/points_to/points_to.expected +++ b/cpp/ql/test/library-tests/ir/points_to/points_to.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected b/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected index fa8f9be95b9..e60a795b9c0 100644 --- a/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected +++ b/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected @@ -11,8 +11,7 @@ | copy.cpp:13:9:13:9 | operator= | protected_cc::Sub2& protected_cc::Sub2::operator=(protected_cc::Sub2 const&) | | | | copy.cpp:13:9:13:9 | operator= | protected_cc::Sub2& protected_cc::Sub2::operator=(protected_cc::Sub2&&) | | | | copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember() | deleted | | -| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember const&) | | | -| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember&&) | | | +| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember const&) | deleted | | | copy.cpp:17:9:17:9 | operator= | protected_cc::HasMember& protected_cc::HasMember::operator=(protected_cc::HasMember const&) | | | | copy.cpp:17:9:17:9 | operator= | protected_cc::HasMember& protected_cc::HasMember::operator=(protected_cc::HasMember&&) | | | | copy.cpp:25:5:25:5 | C | void deleted_cc::C::C(deleted_cc::C const&) | deleted | | diff --git a/cpp/ql/test/library-tests/specifiers2/specifiers2.expected b/cpp/ql/test/library-tests/specifiers2/specifiers2.expected index 8950906cb63..b4dd73b148f 100644 --- a/cpp/ql/test/library-tests/specifiers2/specifiers2.expected +++ b/cpp/ql/test/library-tests/specifiers2/specifiers2.expected @@ -186,7 +186,6 @@ | Variable | specifiers2pp.cpp:16:13:16:22 | privateInt | privateInt | private | | Variable | specifiers2pp.cpp:17:21:17:30 | mutableInt | mutableInt | private | | Variable | specifiers2pp.cpp:20:13:20:24 | protectedInt | protectedInt | protected | -| Variable | specifiers2pp.cpp:52:25:52:27 | vci | vci | static | | VariableDeclarationEntry | specifiers2.c:5:12:5:12 | declaration of i | i | extern | | VariableDeclarationEntry | specifiers2.c:6:12:6:12 | declaration of i | i | extern | | VariableDeclarationEntry | specifiers2.c:8:12:8:12 | declaration of j | j | extern | diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index c2e0783d70f..b2b0a6bf736 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -7,9 +7,9 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | +| statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | ambiguousSuccessors unexplainedLoop 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 caff6369ad9..a3dae8f8a36 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -8,11 +8,11 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| VacuousDestructorCall.cpp:3:3:3:3 | VariableAddress: x | Instruction 'VariableAddress: x' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| VacuousDestructorCall.cpp:4:3:4:3 | Load: y | Instruction 'Load: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | +| statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | +| statements.cpp:26:3:26:3 | IndirectMayWriteSideEffect: inner | Instruction 'IndirectMayWriteSideEffect: inner' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | +| statements.cpp:28:1:28:1 | IndirectMayWriteSideEffect: before | Instruction 'IndirectMayWriteSideEffect: before' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_expr.cpp:29:11:32:11 | CopyValue: (statement expression) | Instruction 'CopyValue: (statement expression)' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_in_type.cpp:5:53:5:53 | Constant: 1 | Instruction 'Constant: 1' has no successors in function '$@'. | stmt_in_type.cpp:2:6:2:12 | void cpp_fun() | void cpp_fun() | @@ -30,7 +30,6 @@ 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*) | | 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) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index c2e0783d70f..b2b0a6bf736 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -7,9 +7,9 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | +| statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | ambiguousSuccessors unexplainedLoop diff --git a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected index a512dfbd914..2539c728d87 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected @@ -1,21 +1,99 @@ -| NonConstantFormat.c:30:10:30:16 | access to array | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| NonConstantFormat.c:41:9:41:27 | call to any_random_function | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| NonConstantFormat.c:45:9:45:48 | call to gettext | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| nested.cpp:21:23:21:26 | fmt0 | The format string argument to snprintf should be constant to prevent security issues and other potential errors. | -| nested.cpp:79:32:79:38 | call to get_fmt | The format string argument to diagnostic should be constant to prevent security issues and other potential errors. | -| nested.cpp:87:18:87:20 | fmt | The format string argument to diagnostic should be constant to prevent security issues and other potential errors. | -| test.cpp:51:10:51:21 | call to make_message | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:130:20:130:26 | access to array | The format string argument to sprintf should be constant to prevent security issues and other potential errors. | -| test.cpp:157:12:157:15 | data | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:170:12:170:14 | res | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:195:31:195:33 | str | The format string argument to StringCchPrintfW should be constant to prevent security issues and other potential errors. | -| test.cpp:197:11:197:14 | wstr | The format string argument to wprintf should be constant to prevent security issues and other potential errors. | -| test.cpp:205:12:205:20 | ... + ... | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:206:12:206:16 | hello | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:211:12:211:16 | hello | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:217:12:217:16 | hello | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:223:12:223:16 | hello | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:228:12:228:18 | ++ ... | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:235:12:235:16 | hello | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:242:12:242:16 | hello | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| test.cpp:247:12:247:16 | hello | The format string argument to printf should be constant to prevent security issues and other potential errors. | +edges +| NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | provenance | | +| NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | provenance | | +| nested.cpp:19:29:19:32 | *fmt0 | nested.cpp:21:23:21:26 | *fmt0 | provenance | | +| nested.cpp:27:32:27:34 | *fmt | nested.cpp:28:16:28:18 | *fmt | provenance | | +| nested.cpp:28:16:28:18 | *fmt | nested.cpp:19:29:19:32 | *fmt0 | provenance | | +| nested.cpp:34:37:34:39 | *fmt | nested.cpp:35:19:35:21 | *fmt | provenance | | +| nested.cpp:35:19:35:21 | *fmt | nested.cpp:27:32:27:34 | *fmt | provenance | | +| nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:34:37:34:39 | *fmt | provenance | | +| nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | provenance | | +| test.cpp:27:39:27:39 | n | test.cpp:27:13:27:24 | **make_message | provenance | | +| test.cpp:46:14:46:17 | argc | test.cpp:51:23:51:30 | ... - ... | provenance | | +| test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | provenance | | +| test.cpp:51:23:51:30 | ... - ... | test.cpp:27:39:27:39 | n | provenance | | +| test.cpp:51:23:51:30 | ... - ... | test.cpp:51:10:51:21 | *call to make_message | provenance | | +| test.cpp:155:27:155:30 | data | test.cpp:157:12:157:15 | data | provenance | | +| test.cpp:167:31:167:34 | data | test.cpp:170:12:170:14 | *res | provenance | | +| test.cpp:193:32:193:34 | str | test.cpp:195:31:195:33 | str | provenance | | +| test.cpp:193:32:193:34 | str | test.cpp:197:11:197:14 | *wstr | provenance | | +| test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | provenance | | +| test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | provenance | | +| test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | provenance | | +| test.cpp:215:25:215:36 | *call to get_string | test.cpp:217:12:217:16 | *hello | provenance | | +| test.cpp:221:25:221:36 | *call to get_string | test.cpp:223:12:223:16 | *hello | provenance | | +| test.cpp:227:25:227:36 | *call to get_string | test.cpp:228:12:228:18 | *++ ... | provenance | | +| test.cpp:232:25:232:36 | *call to get_string | test.cpp:235:12:235:16 | *hello | provenance | | +| test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | provenance | | +| test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | provenance | | +nodes +| NonConstantFormat.c:28:27:28:30 | **argv | semmle.label | **argv | +| NonConstantFormat.c:30:10:30:16 | *access to array | semmle.label | *access to array | +| NonConstantFormat.c:41:9:41:45 | *call to any_random_function | semmle.label | *call to any_random_function | +| NonConstantFormat.c:45:9:45:48 | *call to gettext | semmle.label | *call to gettext | +| NonConstantFormat.c:45:11:45:47 | *call to any_random_function | semmle.label | *call to any_random_function | +| nested.cpp:19:29:19:32 | *fmt0 | semmle.label | *fmt0 | +| nested.cpp:21:23:21:26 | *fmt0 | semmle.label | *fmt0 | +| nested.cpp:27:32:27:34 | *fmt | semmle.label | *fmt | +| nested.cpp:28:16:28:18 | *fmt | semmle.label | *fmt | +| nested.cpp:34:37:34:39 | *fmt | semmle.label | *fmt | +| nested.cpp:35:19:35:21 | *fmt | semmle.label | *fmt | +| nested.cpp:42:24:42:34 | *call to ext_fmt_str | semmle.label | *call to ext_fmt_str | +| nested.cpp:79:32:79:38 | *call to get_fmt | semmle.label | *call to get_fmt | +| nested.cpp:86:19:86:46 | *call to __builtin_alloca | semmle.label | *call to __builtin_alloca | +| nested.cpp:87:18:87:20 | *fmt | semmle.label | *fmt | +| test.cpp:27:13:27:24 | **make_message | semmle.label | **make_message | +| test.cpp:27:39:27:39 | n | semmle.label | n | +| test.cpp:46:14:46:17 | argc | semmle.label | argc | +| test.cpp:46:27:46:30 | **argv | semmle.label | **argv | +| test.cpp:51:10:51:21 | *call to make_message | semmle.label | *call to make_message | +| test.cpp:51:23:51:30 | ... - ... | semmle.label | ... - ... | +| test.cpp:130:20:130:26 | *access to array | semmle.label | *access to array | +| test.cpp:155:27:155:30 | data | semmle.label | data | +| test.cpp:157:12:157:15 | data | semmle.label | data | +| test.cpp:167:31:167:34 | data | semmle.label | data | +| test.cpp:170:12:170:14 | *res | semmle.label | *res | +| test.cpp:193:32:193:34 | str | semmle.label | str | +| test.cpp:195:31:195:33 | str | semmle.label | str | +| test.cpp:197:11:197:14 | *wstr | semmle.label | *wstr | +| test.cpp:204:25:204:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:205:12:205:20 | *... + ... | semmle.label | *... + ... | +| test.cpp:206:12:206:16 | *hello | semmle.label | *hello | +| test.cpp:209:25:209:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:211:12:211:16 | *hello | semmle.label | *hello | +| test.cpp:215:25:215:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:217:12:217:16 | *hello | semmle.label | *hello | +| test.cpp:221:25:221:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:223:12:223:16 | *hello | semmle.label | *hello | +| test.cpp:227:25:227:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:228:12:228:18 | *++ ... | semmle.label | *++ ... | +| test.cpp:232:25:232:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:235:12:235:16 | *hello | semmle.label | *hello | +| test.cpp:239:25:239:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:242:12:242:16 | *hello | semmle.label | *hello | +| test.cpp:245:25:245:36 | *call to get_string | semmle.label | *call to get_string | +| test.cpp:247:12:247:16 | *hello | semmle.label | *hello | +subpaths +| test.cpp:51:23:51:30 | ... - ... | test.cpp:27:39:27:39 | n | test.cpp:27:13:27:24 | **make_message | test.cpp:51:10:51:21 | *call to make_message | +#select +| NonConstantFormat.c:30:10:30:16 | *access to array | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:30:3:30:8 | call to printf | printf | +| NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:41:2:41:7 | call to printf | printf | +| NonConstantFormat.c:45:9:45:48 | *call to gettext | NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:45:2:45:7 | call to printf | printf | +| nested.cpp:21:23:21:26 | *fmt0 | nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:21:23:21:26 | *fmt0 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:21:5:21:12 | call to snprintf | snprintf | +| nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:79:5:79:14 | call to diagnostic | diagnostic | +| nested.cpp:87:18:87:20 | *fmt | nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:87:7:87:16 | call to diagnostic | diagnostic | +| test.cpp:51:10:51:21 | *call to make_message | test.cpp:46:14:46:17 | argc | test.cpp:51:10:51:21 | *call to make_message | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:51:3:51:8 | call to printf | printf | +| test.cpp:130:20:130:26 | *access to array | test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:130:2:130:10 | call to sprintf | sprintf | +| test.cpp:157:12:157:15 | data | test.cpp:155:27:155:30 | data | test.cpp:157:12:157:15 | data | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:157:5:157:10 | call to printf | printf | +| test.cpp:170:12:170:14 | *res | test.cpp:167:31:167:34 | data | test.cpp:170:12:170:14 | *res | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:170:5:170:10 | call to printf | printf | +| test.cpp:195:31:195:33 | str | test.cpp:193:32:193:34 | str | test.cpp:195:31:195:33 | str | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:195:3:195:18 | call to StringCchPrintfW | StringCchPrintfW | +| test.cpp:197:11:197:14 | *wstr | test.cpp:193:32:193:34 | str | test.cpp:197:11:197:14 | *wstr | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:197:3:197:9 | call to wprintf | wprintf | +| test.cpp:205:12:205:20 | *... + ... | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:205:5:205:10 | call to printf | printf | +| test.cpp:206:12:206:16 | *hello | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:206:5:206:10 | call to printf | printf | +| test.cpp:211:12:211:16 | *hello | test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:211:5:211:10 | call to printf | printf | +| test.cpp:217:12:217:16 | *hello | test.cpp:215:25:215:36 | *call to get_string | test.cpp:217:12:217:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:217:5:217:10 | call to printf | printf | +| test.cpp:223:12:223:16 | *hello | test.cpp:221:25:221:36 | *call to get_string | test.cpp:223:12:223:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:223:5:223:10 | call to printf | printf | +| test.cpp:228:12:228:18 | *++ ... | test.cpp:227:25:227:36 | *call to get_string | test.cpp:228:12:228:18 | *++ ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:228:5:228:10 | call to printf | printf | +| test.cpp:235:12:235:16 | *hello | test.cpp:232:25:232:36 | *call to get_string | test.cpp:235:12:235:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:235:5:235:10 | call to printf | printf | +| test.cpp:242:12:242:16 | *hello | test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:242:5:242:10 | call to printf | printf | +| test.cpp:247:12:247:16 | *hello | test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:247:5:247:10 | call to printf | printf | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected index d50edce5f2f..a52bd778a04 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected @@ -46,6 +46,8 @@ edges | test.cpp:187:11:187:15 | strncat output argument | test.cpp:188:20:188:24 | *flags | provenance | | | test.cpp:187:18:187:25 | *filename | test.cpp:187:11:187:15 | strncat output argument | provenance | | | test.cpp:187:18:187:25 | *filename | test.cpp:187:11:187:15 | strncat output argument | provenance | | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:186:19:186:25 | *command | provenance | | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:186:19:186:25 | *command | provenance | | | test.cpp:188:20:188:24 | *flags | test.cpp:188:11:188:17 | strncat output argument | provenance | | | test.cpp:188:20:188:24 | *flags | test.cpp:188:11:188:17 | strncat output argument | provenance | | | test.cpp:194:9:194:16 | fread output argument | test.cpp:196:26:196:33 | *filename | provenance | | @@ -57,9 +59,6 @@ edges | test.cpp:218:9:218:16 | fread output argument | test.cpp:220:19:220:26 | *filename | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:220:10:220:16 | strncat output argument | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:220:10:220:16 | strncat output argument | provenance | | -| test.cpp:220:10:220:16 | strncat output argument | test.cpp:220:10:220:16 | strncat output argument | provenance | | -| test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | -| test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | | test.cpp:220:19:220:26 | *filename | test.cpp:220:10:220:16 | strncat output argument | provenance | | @@ -118,6 +117,8 @@ nodes | test.cpp:183:32:183:38 | *command | semmle.label | *command | | test.cpp:183:32:183:38 | *command | semmle.label | *command | | test.cpp:183:32:183:38 | *command | semmle.label | *command | +| test.cpp:186:19:186:25 | *command | semmle.label | *command | +| test.cpp:186:19:186:25 | *command | semmle.label | *command | | test.cpp:186:47:186:54 | *filename | semmle.label | *filename | | test.cpp:187:11:187:15 | strncat output argument | semmle.label | strncat output argument | | test.cpp:187:11:187:15 | strncat output argument | semmle.label | strncat output argument | @@ -142,6 +143,8 @@ nodes | test.cpp:222:32:222:38 | *command | semmle.label | *command | | test.cpp:222:32:222:38 | *command | semmle.label | *command | subpaths +| test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:186:19:186:25 | *command | test.cpp:196:10:196:16 | concat output argument | +| test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:186:19:186:25 | *command | test.cpp:196:10:196:16 | concat output argument | | test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | strncat output argument | test.cpp:196:10:196:16 | concat output argument | | test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | strncat output argument | test.cpp:196:10:196:16 | concat output argument | #select diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected index 21e6445c8fd..db6712b11d3 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected @@ -47,6 +47,7 @@ edges | test.cpp:222:15:222:20 | buffer | test.cpp:214:24:214:24 | p | provenance | | | test.cpp:228:27:228:54 | call to malloc | test.cpp:232:10:232:15 | buffer | provenance | | | test.cpp:235:40:235:45 | buffer | test.cpp:236:5:236:26 | ... = ... | provenance | | +| test.cpp:236:5:236:9 | *p_str [post update] [string] | test.cpp:235:27:235:31 | *p_str [string] | provenance | | | test.cpp:236:5:236:26 | ... = ... | test.cpp:236:5:236:9 | *p_str [post update] [string] | provenance | | | test.cpp:241:20:241:38 | call to malloc | test.cpp:242:22:242:27 | buffer | provenance | | | test.cpp:242:16:242:19 | set_string output argument [string] | test.cpp:243:12:243:14 | *str [string] | provenance | | @@ -110,6 +111,7 @@ nodes | test.cpp:222:15:222:20 | buffer | semmle.label | buffer | | test.cpp:228:27:228:54 | call to malloc | semmle.label | call to malloc | | test.cpp:232:10:232:15 | buffer | semmle.label | buffer | +| test.cpp:235:27:235:31 | *p_str [string] | semmle.label | *p_str [string] | | test.cpp:235:40:235:45 | buffer | semmle.label | buffer | | test.cpp:236:5:236:9 | *p_str [post update] [string] | semmle.label | *p_str [post update] [string] | | test.cpp:236:5:236:26 | ... = ... | semmle.label | ... = ... | @@ -126,6 +128,7 @@ nodes | test.cpp:264:13:264:30 | call to malloc | semmle.label | call to malloc | | test.cpp:266:12:266:12 | p | semmle.label | p | subpaths +| test.cpp:242:22:242:27 | buffer | test.cpp:235:40:235:45 | buffer | test.cpp:235:27:235:31 | *p_str [string] | test.cpp:242:16:242:19 | set_string output argument [string] | | test.cpp:242:22:242:27 | buffer | test.cpp:235:40:235:45 | buffer | test.cpp:236:5:236:9 | *p_str [post update] [string] | test.cpp:242:16:242:19 | set_string output argument [string] | #select | test.cpp:42:5:42:11 | call to strncpy | test.cpp:18:19:18:24 | call to malloc | test.cpp:42:18:42:23 | string | This write may overflow $@ by 1 element. | test.cpp:42:18:42:23 | string | string | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected index fa6e1c36b53..b3eb5bbca97 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected @@ -3,11 +3,14 @@ edges | main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | provenance | | | overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:30:17:30:20 | *arg1 | provenance | | | overflowdestination.cpp:43:8:43:10 | fgets output argument | overflowdestination.cpp:46:15:46:17 | *src | provenance | | +| overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:50:52:50:54 | *src | provenance | | | overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:53:15:53:17 | *src | provenance | | | overflowdestination.cpp:57:52:57:54 | *src | overflowdestination.cpp:64:16:64:19 | *src2 | provenance | | | overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:75:30:75:32 | *src | provenance | | | overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:76:30:76:32 | *src | provenance | | | overflowdestination.cpp:75:30:75:32 | *src | overflowdestination.cpp:50:52:50:54 | *src | provenance | | +| overflowdestination.cpp:75:30:75:32 | *src | overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | provenance | | +| overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | overflowdestination.cpp:76:30:76:32 | *src | provenance | | | overflowdestination.cpp:76:30:76:32 | *src | overflowdestination.cpp:57:52:57:54 | *src | provenance | | nodes | main.cpp:6:27:6:30 | **argv | semmle.label | **argv | @@ -17,13 +20,16 @@ nodes | overflowdestination.cpp:43:8:43:10 | fgets output argument | semmle.label | fgets output argument | | overflowdestination.cpp:46:15:46:17 | *src | semmle.label | *src | | overflowdestination.cpp:50:52:50:54 | *src | semmle.label | *src | +| overflowdestination.cpp:50:52:50:54 | *src | semmle.label | *src | | overflowdestination.cpp:53:15:53:17 | *src | semmle.label | *src | | overflowdestination.cpp:57:52:57:54 | *src | semmle.label | *src | | overflowdestination.cpp:64:16:64:19 | *src2 | semmle.label | *src2 | | overflowdestination.cpp:73:8:73:10 | fgets output argument | semmle.label | fgets output argument | | overflowdestination.cpp:75:30:75:32 | *src | semmle.label | *src | +| overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | semmle.label | overflowdest_test2 output argument | | overflowdestination.cpp:76:30:76:32 | *src | semmle.label | *src | subpaths +| overflowdestination.cpp:75:30:75:32 | *src | overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | #select | overflowdestination.cpp:30:2:30:8 | call to strncpy | main.cpp:6:27:6:30 | **argv | overflowdestination.cpp:30:17:30:20 | *arg1 | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | | overflowdestination.cpp:46:2:46:7 | call to memcpy | overflowdestination.cpp:43:8:43:10 | fgets output argument | overflowdestination.cpp:46:15:46:17 | *src | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected index c5cfefdbff0..cde0ba8bc75 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected @@ -1,6 +1,44 @@ edges +| main.cpp:6:27:6:30 | **argv | main.cpp:7:33:7:36 | **argv | provenance | | +| main.cpp:6:27:6:30 | **argv | main.cpp:8:34:8:37 | **argv | provenance | | +| main.cpp:6:27:6:30 | **argv | main.cpp:9:29:9:32 | **argv | provenance | | | main.cpp:6:27:6:30 | **argv | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:7:33:7:36 | **argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | provenance | | +| main.cpp:7:33:7:36 | **argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | provenance | | +| main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:8:34:8:37 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:8:34:8:37 | *argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:9:29:9:32 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:9:29:9:32 | *argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:10:20:10:23 | *argv | provenance | | +| main.cpp:8:34:8:37 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | provenance | | +| main.cpp:8:34:8:37 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | provenance | | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:9:29:9:32 | **argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:9:29:9:32 | *argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:10:20:10:23 | *argv | provenance | | +| main.cpp:9:29:9:32 | **argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | provenance | | +| main.cpp:9:29:9:32 | **argv | tests_restrict.c:15:41:15:44 | **argv | provenance | | +| main.cpp:9:29:9:32 | *argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | provenance | | +| main.cpp:9:29:9:32 | *argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | provenance | | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | **argv | provenance | | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | *argv | provenance | | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | main.cpp:10:20:10:23 | *argv | provenance | | | main.cpp:10:20:10:23 | **argv | tests.cpp:657:32:657:35 | **argv | provenance | | +| main.cpp:10:20:10:23 | *argv | tests.cpp:657:32:657:35 | **argv | provenance | | +| main.cpp:10:20:10:23 | *argv | tests.cpp:657:32:657:35 | *argv | provenance | | +| overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | provenance | | +| overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | *argv | provenance | | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | provenance | | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | provenance | | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | provenance | | | tests.cpp:613:19:613:24 | *source | tests.cpp:615:17:615:22 | *source | provenance | | | tests.cpp:622:19:622:24 | *source | tests.cpp:625:2:625:16 | *... = ... | provenance | | | tests.cpp:625:2:625:2 | *s [post update] [*home] | tests.cpp:628:14:628:14 | *s [*home] | provenance | | @@ -10,11 +48,35 @@ edges | tests.cpp:628:16:628:19 | *home | tests.cpp:628:14:628:19 | *home | provenance | | | tests.cpp:657:32:657:35 | **argv | tests.cpp:682:9:682:15 | *access to array | provenance | | | tests.cpp:657:32:657:35 | **argv | tests.cpp:683:9:683:15 | *access to array | provenance | | +| tests.cpp:657:32:657:35 | *argv | tests.cpp:682:9:682:15 | *access to array | provenance | | +| tests.cpp:657:32:657:35 | *argv | tests.cpp:683:9:683:15 | *access to array | provenance | | | tests.cpp:682:9:682:15 | *access to array | tests.cpp:613:19:613:24 | *source | provenance | | | tests.cpp:683:9:683:15 | *access to array | tests.cpp:622:19:622:24 | *source | provenance | | +| tests_restrict.c:15:41:15:44 | **argv | tests_restrict.c:15:41:15:44 | **argv | provenance | | +| tests_restrict.c:15:41:15:44 | *argv | tests_restrict.c:15:41:15:44 | *argv | provenance | | nodes | main.cpp:6:27:6:30 | **argv | semmle.label | **argv | +| main.cpp:7:33:7:36 | **argv | semmle.label | **argv | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | semmle.label | overflowdesination_main output argument | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | semmle.label | overflowdesination_main output argument | +| main.cpp:8:34:8:37 | **argv | semmle.label | **argv | +| main.cpp:8:34:8:37 | *argv | semmle.label | *argv | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | semmle.label | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | semmle.label | test_buffer_overrun_main output argument | +| main.cpp:9:29:9:32 | **argv | semmle.label | **argv | +| main.cpp:9:29:9:32 | *argv | semmle.label | *argv | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | semmle.label | tests_restrict_main output argument | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | semmle.label | tests_restrict_main output argument | | main.cpp:10:20:10:23 | **argv | semmle.label | **argv | +| main.cpp:10:20:10:23 | *argv | semmle.label | *argv | +| overflowdestination.cpp:23:45:23:48 | **argv | semmle.label | **argv | +| overflowdestination.cpp:23:45:23:48 | **argv | semmle.label | **argv | +| overflowdestination.cpp:23:45:23:48 | *argv | semmle.label | *argv | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | semmle.label | **argv | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | semmle.label | **argv | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | semmle.label | *argv | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | semmle.label | *argv | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | semmle.label | *argv | | tests.cpp:613:19:613:24 | *source | semmle.label | *source | | tests.cpp:615:17:615:22 | *source | semmle.label | *source | | tests.cpp:622:19:622:24 | *source | semmle.label | *source | @@ -24,9 +86,24 @@ nodes | tests.cpp:628:14:628:19 | *home | semmle.label | *home | | tests.cpp:628:16:628:19 | *home | semmle.label | *home | | tests.cpp:657:32:657:35 | **argv | semmle.label | **argv | +| tests.cpp:657:32:657:35 | *argv | semmle.label | *argv | | tests.cpp:682:9:682:15 | *access to array | semmle.label | *access to array | | tests.cpp:683:9:683:15 | *access to array | semmle.label | *access to array | +| tests_restrict.c:15:41:15:44 | **argv | semmle.label | **argv | +| tests_restrict.c:15:41:15:44 | **argv | semmle.label | **argv | +| tests_restrict.c:15:41:15:44 | *argv | semmle.label | *argv | +| tests_restrict.c:15:41:15:44 | *argv | semmle.label | *argv | subpaths +| main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | +| main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | *argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | +| main.cpp:8:34:8:37 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:9:29:9:32 | **argv | tests_restrict.c:15:41:15:44 | **argv | tests_restrict.c:15:41:15:44 | **argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | **argv | tests_restrict.c:15:41:15:44 | **argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | *argv | tests_restrict.c:15:41:15:44 | *argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | #select | tests.cpp:615:2:615:7 | call to strcpy | main.cpp:6:27:6:30 | **argv | tests.cpp:615:17:615:22 | *source | This 'call to strcpy' with input from $@ may overflow the destination. | main.cpp:6:27:6:30 | **argv | a command-line argument | | tests.cpp:628:2:628:7 | call to strcpy | main.cpp:6:27:6:30 | **argv | tests.cpp:628:14:628:19 | *home | This 'call to strcpy' with input from $@ may overflow the destination. | main.cpp:6:27:6:30 | **argv | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected index 8f09b2ee7f5..6b0a955e7b1 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected @@ -1,20 +1,28 @@ edges +| argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:95:9:95:15 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:96:15:96:21 | *access to array | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:96:15:96:21 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:101:9:101:10 | *i1 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:102:15:102:16 | *i1 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:102:15:102:16 | *i1 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:106:9:106:13 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:107:15:107:19 | *access to array | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:107:15:107:19 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:110:9:110:11 | ** ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:111:15:111:17 | ** ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:116:9:116:10 | *i3 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:117:15:117:16 | *i3 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:117:15:117:16 | *i3 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:121:9:121:10 | *i4 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:122:15:122:16 | *i4 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:127:9:127:10 | *i5 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:128:15:128:16 | *i5 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:128:15:128:16 | *i5 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:131:9:131:14 | *... + ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:132:15:132:20 | *... + ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:135:9:135:12 | *... ++ | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:136:15:136:18 | *-- ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | @@ -23,24 +31,100 @@ edges | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:145:15:145:16 | *i7 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:150:9:150:10 | *i8 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:151:15:151:16 | *i8 | provenance | | +| argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:96:15:96:21 | printWrapper output argument | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:101:9:101:10 | *i1 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:102:15:102:16 | *i1 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:102:15:102:16 | *i1 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:106:9:106:13 | *access to array | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:107:15:107:19 | *access to array | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:107:15:107:19 | *access to array | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:110:9:110:11 | ** ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:111:15:111:17 | ** ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:116:9:116:10 | *i3 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:117:15:117:16 | *i3 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:117:15:117:16 | *i3 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:121:9:121:10 | *i4 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:127:9:127:10 | *i5 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:128:15:128:16 | *i5 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:128:15:128:16 | *i5 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:131:9:131:14 | *... + ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:135:9:135:12 | *... ++ | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:136:15:136:18 | *-- ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:140:15:140:32 | *... ? ... : ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:144:9:144:10 | *i7 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:145:15:145:16 | *i7 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:150:9:150:10 | *i8 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:151:15:151:16 | *i8 | provenance | | +| argvLocal.c:102:15:102:16 | *i1 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:102:15:102:16 | *i1 | argvLocal.c:102:15:102:16 | printWrapper output argument | provenance | | +| argvLocal.c:102:15:102:16 | printWrapper output argument | argvLocal.c:144:9:144:10 | *i7 | provenance | | +| argvLocal.c:102:15:102:16 | printWrapper output argument | argvLocal.c:145:15:145:16 | *i7 | provenance | | +| argvLocal.c:107:15:107:19 | *access to array | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:107:15:107:19 | *access to array | argvLocal.c:107:15:107:19 | printWrapper output argument | provenance | | +| argvLocal.c:107:15:107:19 | printWrapper output argument | argvLocal.c:110:9:110:11 | ** ... | provenance | | +| argvLocal.c:107:15:107:19 | printWrapper output argument | argvLocal.c:111:15:111:17 | ** ... | provenance | | +| argvLocal.c:117:15:117:16 | *i3 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:117:15:117:16 | *i3 | argvLocal.c:117:15:117:16 | printWrapper output argument | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:121:9:121:10 | *i4 | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:135:9:135:12 | *... ++ | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:136:15:136:18 | *-- ... | provenance | | +| argvLocal.c:122:15:122:16 | *i4 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:122:15:122:16 | *i4 | argvLocal.c:122:15:122:16 | printWrapper output argument | provenance | | +| argvLocal.c:122:15:122:16 | printWrapper output argument | argvLocal.c:135:9:135:12 | *... ++ | provenance | | +| argvLocal.c:122:15:122:16 | printWrapper output argument | argvLocal.c:136:15:136:18 | *-- ... | provenance | | +| argvLocal.c:128:15:128:16 | *i5 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:128:15:128:16 | *i5 | argvLocal.c:128:15:128:16 | printWrapper output argument | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:131:9:131:14 | *... + ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:140:15:140:32 | *... ? ... : ... | provenance | | +| argvLocal.c:132:15:132:20 | *... + ... | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:132:15:132:20 | *... + ... | argvLocal.c:132:15:132:20 | printWrapper output argument | provenance | | +| argvLocal.c:132:15:132:20 | printWrapper output argument | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | +| argvLocal.c:132:15:132:20 | printWrapper output argument | argvLocal.c:140:15:140:32 | *... ? ... : ... | provenance | | nodes +| argvLocal.c:9:25:9:31 | *correct | semmle.label | *correct | +| argvLocal.c:9:25:9:31 | *correct | semmle.label | *correct | | argvLocal.c:13:27:13:30 | **argv | semmle.label | **argv | | argvLocal.c:95:9:95:15 | *access to array | semmle.label | *access to array | | argvLocal.c:96:15:96:21 | *access to array | semmle.label | *access to array | +| argvLocal.c:96:15:96:21 | *access to array | semmle.label | *access to array | +| argvLocal.c:96:15:96:21 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:101:9:101:10 | *i1 | semmle.label | *i1 | | argvLocal.c:102:15:102:16 | *i1 | semmle.label | *i1 | +| argvLocal.c:102:15:102:16 | *i1 | semmle.label | *i1 | +| argvLocal.c:102:15:102:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:106:9:106:13 | *access to array | semmle.label | *access to array | | argvLocal.c:107:15:107:19 | *access to array | semmle.label | *access to array | +| argvLocal.c:107:15:107:19 | *access to array | semmle.label | *access to array | +| argvLocal.c:107:15:107:19 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:110:9:110:11 | ** ... | semmle.label | ** ... | | argvLocal.c:111:15:111:17 | ** ... | semmle.label | ** ... | | argvLocal.c:116:9:116:10 | *i3 | semmle.label | *i3 | | argvLocal.c:117:15:117:16 | *i3 | semmle.label | *i3 | +| argvLocal.c:117:15:117:16 | *i3 | semmle.label | *i3 | +| argvLocal.c:117:15:117:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:121:9:121:10 | *i4 | semmle.label | *i4 | | argvLocal.c:122:15:122:16 | *i4 | semmle.label | *i4 | +| argvLocal.c:122:15:122:16 | *i4 | semmle.label | *i4 | +| argvLocal.c:122:15:122:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:127:9:127:10 | *i5 | semmle.label | *i5 | | argvLocal.c:128:15:128:16 | *i5 | semmle.label | *i5 | +| argvLocal.c:128:15:128:16 | *i5 | semmle.label | *i5 | +| argvLocal.c:128:15:128:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:131:9:131:14 | *... + ... | semmle.label | *... + ... | | argvLocal.c:132:15:132:20 | *... + ... | semmle.label | *... + ... | +| argvLocal.c:132:15:132:20 | *... + ... | semmle.label | *... + ... | +| argvLocal.c:132:15:132:20 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:135:9:135:12 | *... ++ | semmle.label | *... ++ | | argvLocal.c:136:15:136:18 | *-- ... | semmle.label | *-- ... | | argvLocal.c:139:9:139:26 | *... ? ... : ... | semmle.label | *... ? ... : ... | @@ -50,6 +134,13 @@ nodes | argvLocal.c:150:9:150:10 | *i8 | semmle.label | *i8 | | argvLocal.c:151:15:151:16 | *i8 | semmle.label | *i8 | subpaths +| argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:96:15:96:21 | printWrapper output argument | +| argvLocal.c:102:15:102:16 | *i1 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:102:15:102:16 | printWrapper output argument | +| argvLocal.c:107:15:107:19 | *access to array | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:107:15:107:19 | printWrapper output argument | +| argvLocal.c:117:15:117:16 | *i3 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:117:15:117:16 | printWrapper output argument | +| argvLocal.c:122:15:122:16 | *i4 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:122:15:122:16 | printWrapper output argument | +| argvLocal.c:128:15:128:16 | *i5 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:128:15:128:16 | printWrapper output argument | +| argvLocal.c:132:15:132:20 | *... + ... | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:132:15:132:20 | printWrapper output argument | #select | argvLocal.c:95:9:95:15 | *access to array | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:95:9:95:15 | *access to array | The value of this argument may come from $@ and is being used as a formatting argument to printf(format). | argvLocal.c:13:27:13:30 | **argv | a command-line argument | | argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:96:15:96:21 | *access to array | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(correct), which calls printf(format). | argvLocal.c:13:27:13:30 | **argv | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/consts/NonConstantFormat.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/consts/NonConstantFormat.expected index bc0712a43e0..91f3d367db6 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/consts/NonConstantFormat.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/consts/NonConstantFormat.expected @@ -1,14 +1,83 @@ -| consts.cpp:86:9:86:10 | v1 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:91:9:91:10 | v2 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:95:9:95:10 | v3 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:100:9:100:10 | v4 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:103:9:103:15 | call to varFunc | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:107:9:107:10 | v5 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:112:9:112:10 | v6 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:116:9:116:13 | access to array | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:121:9:121:10 | v8 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:126:9:126:27 | call to nonConstFuncToArray | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:130:9:130:10 | v9 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:135:9:135:11 | v10 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:140:9:140:11 | v11 | The format string argument to printf should be constant to prevent security issues and other potential errors. | -| consts.cpp:145:9:145:11 | v12 | The format string argument to printf should be constant to prevent security issues and other potential errors. | +edges +| consts.cpp:24:7:24:9 | **gv1 | consts.cpp:24:7:24:9 | **gv1 | provenance | | +| consts.cpp:24:7:24:9 | **gv1 | consts.cpp:29:7:29:25 | **nonConstFuncToArray | provenance | | +| consts.cpp:29:7:29:25 | **nonConstFuncToArray | consts.cpp:126:9:126:30 | *call to nonConstFuncToArray | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:24:7:24:9 | **gv1 | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:86:9:86:10 | *v1 | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:95:9:95:10 | *v3 | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:100:9:100:10 | *v4 | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:116:9:116:13 | *access to array | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:121:9:121:10 | *v8 | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:130:9:130:10 | *v9 | provenance | | +| consts.cpp:85:7:85:8 | gets output argument | consts.cpp:135:9:135:11 | *v10 | provenance | | +| consts.cpp:90:7:90:10 | *call to gets | consts.cpp:91:9:91:10 | *v2 | provenance | | +| consts.cpp:90:7:90:10 | *call to gets | consts.cpp:116:9:116:13 | *access to array | provenance | | +| consts.cpp:90:7:90:10 | *call to gets | consts.cpp:121:9:121:10 | *v8 | provenance | | +| consts.cpp:90:12:90:13 | gets output argument | consts.cpp:24:7:24:9 | **gv1 | provenance | | +| consts.cpp:90:12:90:13 | gets output argument | consts.cpp:95:9:95:10 | *v3 | provenance | | +| consts.cpp:90:12:90:13 | gets output argument | consts.cpp:100:9:100:10 | *v4 | provenance | | +| consts.cpp:90:12:90:13 | gets output argument | consts.cpp:116:9:116:13 | *access to array | provenance | | +| consts.cpp:90:12:90:13 | gets output argument | consts.cpp:121:9:121:10 | *v8 | provenance | | +| consts.cpp:90:12:90:13 | gets output argument | consts.cpp:130:9:130:10 | *v9 | provenance | | +| consts.cpp:90:12:90:13 | gets output argument | consts.cpp:135:9:135:11 | *v10 | provenance | | +| consts.cpp:106:13:106:19 | *call to varFunc | consts.cpp:107:9:107:10 | *v5 | provenance | | +| consts.cpp:111:7:111:13 | *call to varFunc | consts.cpp:112:9:112:10 | *v6 | provenance | | +| consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | *v11 | provenance | | +| consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | v11 | provenance | | +| consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | *v12 | provenance | | +| consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | v12 | provenance | | +nodes +| consts.cpp:24:7:24:9 | **gv1 | semmle.label | **gv1 | +| consts.cpp:29:7:29:25 | **nonConstFuncToArray | semmle.label | **nonConstFuncToArray | +| consts.cpp:85:7:85:8 | gets output argument | semmle.label | gets output argument | +| consts.cpp:86:9:86:10 | *v1 | semmle.label | *v1 | +| consts.cpp:90:7:90:10 | *call to gets | semmle.label | *call to gets | +| consts.cpp:90:12:90:13 | gets output argument | semmle.label | gets output argument | +| consts.cpp:91:9:91:10 | *v2 | semmle.label | *v2 | +| consts.cpp:95:9:95:10 | *v3 | semmle.label | *v3 | +| consts.cpp:100:9:100:10 | *v4 | semmle.label | *v4 | +| consts.cpp:103:9:103:17 | *call to varFunc | semmle.label | *call to varFunc | +| consts.cpp:106:13:106:19 | *call to varFunc | semmle.label | *call to varFunc | +| consts.cpp:107:9:107:10 | *v5 | semmle.label | *v5 | +| consts.cpp:111:7:111:13 | *call to varFunc | semmle.label | *call to varFunc | +| consts.cpp:112:9:112:10 | *v6 | semmle.label | *v6 | +| consts.cpp:116:9:116:13 | *access to array | semmle.label | *access to array | +| consts.cpp:121:9:121:10 | *v8 | semmle.label | *v8 | +| consts.cpp:126:9:126:30 | *call to nonConstFuncToArray | semmle.label | *call to nonConstFuncToArray | +| consts.cpp:130:9:130:10 | *v9 | semmle.label | *v9 | +| consts.cpp:135:9:135:11 | *v10 | semmle.label | *v10 | +| consts.cpp:139:13:139:16 | readString output argument | semmle.label | readString output argument | +| consts.cpp:139:13:139:16 | readString output argument | semmle.label | readString output argument | +| consts.cpp:140:9:140:11 | *v11 | semmle.label | *v11 | +| consts.cpp:140:9:140:11 | v11 | semmle.label | v11 | +| consts.cpp:144:16:144:18 | readStringRef output argument | semmle.label | readStringRef output argument | +| consts.cpp:144:16:144:18 | readStringRef output argument | semmle.label | readStringRef output argument | +| consts.cpp:145:9:145:11 | *v12 | semmle.label | *v12 | +| consts.cpp:145:9:145:11 | v12 | semmle.label | v12 | +subpaths +#select +| consts.cpp:86:9:86:10 | *v1 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:86:9:86:10 | *v1 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:86:2:86:7 | call to printf | printf | +| consts.cpp:91:9:91:10 | *v2 | consts.cpp:90:7:90:10 | *call to gets | consts.cpp:91:9:91:10 | *v2 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:91:2:91:7 | call to printf | printf | +| consts.cpp:95:9:95:10 | *v3 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:95:9:95:10 | *v3 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:95:2:95:7 | call to printf | printf | +| consts.cpp:95:9:95:10 | *v3 | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:95:9:95:10 | *v3 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:95:2:95:7 | call to printf | printf | +| consts.cpp:100:9:100:10 | *v4 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:100:9:100:10 | *v4 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:100:2:100:7 | call to printf | printf | +| consts.cpp:100:9:100:10 | *v4 | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:100:9:100:10 | *v4 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:100:2:100:7 | call to printf | printf | +| consts.cpp:103:9:103:17 | *call to varFunc | consts.cpp:103:9:103:17 | *call to varFunc | consts.cpp:103:9:103:17 | *call to varFunc | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:103:2:103:7 | call to printf | printf | +| consts.cpp:107:9:107:10 | *v5 | consts.cpp:106:13:106:19 | *call to varFunc | consts.cpp:107:9:107:10 | *v5 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:107:2:107:7 | call to printf | printf | +| consts.cpp:112:9:112:10 | *v6 | consts.cpp:111:7:111:13 | *call to varFunc | consts.cpp:112:9:112:10 | *v6 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:112:2:112:7 | call to printf | printf | +| consts.cpp:116:9:116:13 | *access to array | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:116:9:116:13 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:116:2:116:7 | call to printf | printf | +| consts.cpp:116:9:116:13 | *access to array | consts.cpp:90:7:90:10 | *call to gets | consts.cpp:116:9:116:13 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:116:2:116:7 | call to printf | printf | +| consts.cpp:116:9:116:13 | *access to array | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:116:9:116:13 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:116:2:116:7 | call to printf | printf | +| consts.cpp:121:9:121:10 | *v8 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:121:9:121:10 | *v8 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:121:2:121:7 | call to printf | printf | +| consts.cpp:121:9:121:10 | *v8 | consts.cpp:90:7:90:10 | *call to gets | consts.cpp:121:9:121:10 | *v8 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:121:2:121:7 | call to printf | printf | +| consts.cpp:121:9:121:10 | *v8 | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:121:9:121:10 | *v8 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:121:2:121:7 | call to printf | printf | +| consts.cpp:126:9:126:30 | *call to nonConstFuncToArray | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:126:9:126:30 | *call to nonConstFuncToArray | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:126:2:126:7 | call to printf | printf | +| consts.cpp:126:9:126:30 | *call to nonConstFuncToArray | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:126:9:126:30 | *call to nonConstFuncToArray | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:126:2:126:7 | call to printf | printf | +| consts.cpp:130:9:130:10 | *v9 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:130:9:130:10 | *v9 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:130:2:130:7 | call to printf | printf | +| consts.cpp:130:9:130:10 | *v9 | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:130:9:130:10 | *v9 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:130:2:130:7 | call to printf | printf | +| consts.cpp:135:9:135:11 | *v10 | consts.cpp:85:7:85:8 | gets output argument | consts.cpp:135:9:135:11 | *v10 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:135:2:135:7 | call to printf | printf | +| consts.cpp:135:9:135:11 | *v10 | consts.cpp:90:12:90:13 | gets output argument | consts.cpp:135:9:135:11 | *v10 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:135:2:135:7 | call to printf | printf | +| consts.cpp:140:9:140:11 | *v11 | consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | *v11 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:140:2:140:7 | call to printf | printf | +| consts.cpp:140:9:140:11 | v11 | consts.cpp:139:13:139:16 | readString output argument | consts.cpp:140:9:140:11 | v11 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:140:2:140:7 | call to printf | printf | +| consts.cpp:145:9:145:11 | *v12 | consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | *v12 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:145:2:145:7 | call to printf | printf | +| consts.cpp:145:9:145:11 | v12 | consts.cpp:144:16:144:18 | readStringRef output argument | consts.cpp:145:9:145:11 | v12 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | consts.cpp:145:2:145:7 | call to printf | printf | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected index 087a0a88662..20b69b653c9 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected @@ -1,29 +1,46 @@ edges | globalVars.c:8:7:8:10 | **copy | globalVars.c:27:9:27:12 | *copy | provenance | | | globalVars.c:8:7:8:10 | **copy | globalVars.c:30:15:30:18 | *copy | provenance | | +| globalVars.c:8:7:8:10 | **copy | globalVars.c:30:15:30:18 | *copy | provenance | | | globalVars.c:8:7:8:10 | **copy | globalVars.c:35:11:35:14 | *copy | provenance | | | globalVars.c:9:7:9:11 | **copy2 | globalVars.c:38:9:38:13 | *copy2 | provenance | | | globalVars.c:9:7:9:11 | **copy2 | globalVars.c:41:15:41:19 | *copy2 | provenance | | +| globalVars.c:9:7:9:11 | **copy2 | globalVars.c:41:15:41:19 | *copy2 | provenance | | | globalVars.c:9:7:9:11 | **copy2 | globalVars.c:50:9:50:13 | *copy2 | provenance | | | globalVars.c:11:22:11:25 | **argv | globalVars.c:8:7:8:10 | **copy | provenance | | | globalVars.c:15:21:15:23 | *val | globalVars.c:9:7:9:11 | **copy2 | provenance | | +| globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | *str | provenance | | | globalVars.c:23:27:23:30 | **argv | globalVars.c:24:11:24:14 | **argv | provenance | | | globalVars.c:24:11:24:14 | **argv | globalVars.c:11:22:11:25 | **argv | provenance | | +| globalVars.c:30:15:30:18 | *copy | globalVars.c:19:25:19:27 | *str | provenance | | +| globalVars.c:30:15:30:18 | *copy | globalVars.c:30:15:30:18 | printWrapper output argument | provenance | | +| globalVars.c:30:15:30:18 | printWrapper output argument | globalVars.c:35:11:35:14 | *copy | provenance | | | globalVars.c:35:11:35:14 | *copy | globalVars.c:15:21:15:23 | *val | provenance | | +| globalVars.c:41:15:41:19 | *copy2 | globalVars.c:19:25:19:27 | *str | provenance | | +| globalVars.c:41:15:41:19 | *copy2 | globalVars.c:41:15:41:19 | printWrapper output argument | provenance | | +| globalVars.c:41:15:41:19 | printWrapper output argument | globalVars.c:50:9:50:13 | *copy2 | provenance | | nodes | globalVars.c:8:7:8:10 | **copy | semmle.label | **copy | | globalVars.c:9:7:9:11 | **copy2 | semmle.label | **copy2 | | globalVars.c:11:22:11:25 | **argv | semmle.label | **argv | | globalVars.c:15:21:15:23 | *val | semmle.label | *val | +| globalVars.c:19:25:19:27 | *str | semmle.label | *str | +| globalVars.c:19:25:19:27 | *str | semmle.label | *str | | globalVars.c:23:27:23:30 | **argv | semmle.label | **argv | | globalVars.c:24:11:24:14 | **argv | semmle.label | **argv | | globalVars.c:27:9:27:12 | *copy | semmle.label | *copy | | globalVars.c:30:15:30:18 | *copy | semmle.label | *copy | +| globalVars.c:30:15:30:18 | *copy | semmle.label | *copy | +| globalVars.c:30:15:30:18 | printWrapper output argument | semmle.label | printWrapper output argument | | globalVars.c:35:11:35:14 | *copy | semmle.label | *copy | | globalVars.c:38:9:38:13 | *copy2 | semmle.label | *copy2 | | globalVars.c:41:15:41:19 | *copy2 | semmle.label | *copy2 | +| globalVars.c:41:15:41:19 | *copy2 | semmle.label | *copy2 | +| globalVars.c:41:15:41:19 | printWrapper output argument | semmle.label | printWrapper output argument | | globalVars.c:50:9:50:13 | *copy2 | semmle.label | *copy2 | subpaths +| globalVars.c:30:15:30:18 | *copy | globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | *str | globalVars.c:30:15:30:18 | printWrapper output argument | +| globalVars.c:41:15:41:19 | *copy2 | globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | *str | globalVars.c:41:15:41:19 | printWrapper output argument | #select | globalVars.c:27:9:27:12 | *copy | globalVars.c:23:27:23:30 | **argv | globalVars.c:27:9:27:12 | *copy | The value of this argument may come from $@ and is being used as a formatting argument to printf(format). | globalVars.c:23:27:23:30 | **argv | a command-line argument | | globalVars.c:30:15:30:18 | *copy | globalVars.c:23:27:23:30 | **argv | globalVars.c:30:15:30:18 | *copy | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(str), which calls printf(format). | globalVars.c:23:27:23:30 | **argv | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected index ddeb3fed32f..42992d988ba 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected @@ -1,7 +1,6 @@ edges | test2.cpp:62:18:62:25 | password | test2.cpp:65:31:65:34 | cpy1 | provenance | | | test2.cpp:72:15:72:24 | password | test2.cpp:73:30:73:32 | *buf | provenance | | -| test2.cpp:72:15:72:24 | password | test2.cpp:76:30:76:32 | *buf | provenance | | | test2.cpp:98:45:98:52 | password | test2.cpp:99:27:99:32 | *buffer | provenance | | | test.cpp:70:38:70:48 | thePassword | test.cpp:73:43:73:53 | thePassword | provenance | | | test.cpp:73:63:73:73 | thePassword | test.cpp:73:43:73:53 | thePassword | provenance | | @@ -17,7 +16,6 @@ nodes | test2.cpp:65:31:65:34 | cpy1 | semmle.label | cpy1 | | test2.cpp:72:15:72:24 | password | semmle.label | password | | test2.cpp:73:30:73:32 | *buf | semmle.label | *buf | -| test2.cpp:76:30:76:32 | *buf | semmle.label | *buf | | test2.cpp:98:45:98:52 | password | semmle.label | password | | test2.cpp:99:27:99:32 | *buffer | semmle.label | *buffer | | test.cpp:45:9:45:19 | thePassword | semmle.label | thePassword | @@ -36,7 +34,6 @@ subpaths | test2.cpp:57:2:57:8 | call to fprintf | test2.cpp:57:39:57:49 | call to getPassword | test2.cpp:57:39:57:49 | call to getPassword | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:57:39:57:49 | call to getPassword | this source. | | test2.cpp:65:3:65:9 | call to fprintf | test2.cpp:62:18:62:25 | password | test2.cpp:65:31:65:34 | cpy1 | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:62:18:62:25 | password | this source. | | test2.cpp:73:3:73:9 | call to fprintf | test2.cpp:72:15:72:24 | password | test2.cpp:73:30:73:32 | *buf | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:72:17:72:24 | password | this source. | -| test2.cpp:76:3:76:9 | call to fprintf | test2.cpp:72:15:72:24 | password | test2.cpp:76:30:76:32 | *buf | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:72:17:72:24 | password | this source. | | test2.cpp:99:3:99:9 | call to fprintf | test2.cpp:98:45:98:52 | password | test2.cpp:99:27:99:32 | *buffer | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:98:45:98:52 | password | this source. | | test.cpp:45:3:45:7 | call to fputs | test.cpp:45:9:45:19 | thePassword | test.cpp:45:9:45:19 | thePassword | This write into file 'file' may contain unencrypted data from $@. | test.cpp:45:9:45:19 | thePassword | this source. | | test.cpp:70:35:70:35 | call to operator<< | test.cpp:70:38:70:48 | thePassword | test.cpp:70:38:70:48 | thePassword | This write into file 'mystream' may contain unencrypted data from $@. | test.cpp:70:38:70:48 | thePassword | this source. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp index 0220b8d09eb..ff10fba761b 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp @@ -73,7 +73,7 @@ void tests(FILE *log, myStruct &s) fprintf(log, "buf = %s\n", buf); // BAD strcpy(buf, s.password_hash); - fprintf(log, "buf = %s\n", buf); // GOOD [FALSE POSITIVE] + fprintf(log, "buf = %s\n", buf); // GOOD } { diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected index 70386662fe8..44a83a752d6 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected @@ -41,11 +41,14 @@ edges | tests.cpp:73:23:73:43 | call to XercesDOMParser | tests.cpp:80:2:80:2 | *p | provenance | | | tests.cpp:85:24:85:44 | call to XercesDOMParser | tests.cpp:88:3:88:3 | *q | provenance | | | tests.cpp:100:24:100:44 | call to XercesDOMParser | tests.cpp:104:3:104:3 | *q | provenance | | +| tests.cpp:112:39:112:39 | *p | tests.cpp:112:39:112:39 | *p | provenance | | | tests.cpp:112:39:112:39 | *p | tests.cpp:113:2:113:2 | *p | provenance | | | tests.cpp:116:39:116:39 | *p | tests.cpp:117:2:117:2 | *p | provenance | | | tests.cpp:122:23:122:43 | call to XercesDOMParser | tests.cpp:126:18:126:18 | *q | provenance | | | tests.cpp:122:23:122:43 | call to XercesDOMParser | tests.cpp:128:18:128:18 | *q | provenance | | | tests.cpp:126:18:126:18 | *q | tests.cpp:112:39:112:39 | *p | provenance | | +| tests.cpp:126:18:126:18 | *q | tests.cpp:126:18:126:18 | test10_doParseB output argument | provenance | | +| tests.cpp:126:18:126:18 | test10_doParseB output argument | tests.cpp:128:18:128:18 | *q | provenance | | | tests.cpp:128:18:128:18 | *q | tests.cpp:116:39:116:39 | *p | provenance | | nodes | tests2.cpp:20:17:20:31 | call to SAXParser | semmle.label | call to SAXParser | @@ -117,13 +120,16 @@ nodes | tests.cpp:100:24:100:44 | call to XercesDOMParser | semmle.label | call to XercesDOMParser | | tests.cpp:104:3:104:3 | *q | semmle.label | *q | | tests.cpp:112:39:112:39 | *p | semmle.label | *p | +| tests.cpp:112:39:112:39 | *p | semmle.label | *p | | tests.cpp:113:2:113:2 | *p | semmle.label | *p | | tests.cpp:116:39:116:39 | *p | semmle.label | *p | | tests.cpp:117:2:117:2 | *p | semmle.label | *p | | tests.cpp:122:23:122:43 | call to XercesDOMParser | semmle.label | call to XercesDOMParser | | tests.cpp:126:18:126:18 | *q | semmle.label | *q | +| tests.cpp:126:18:126:18 | test10_doParseB output argument | semmle.label | test10_doParseB output argument | | tests.cpp:128:18:128:18 | *q | semmle.label | *q | subpaths +| tests.cpp:126:18:126:18 | *q | tests.cpp:112:39:112:39 | *p | tests.cpp:112:39:112:39 | *p | tests.cpp:126:18:126:18 | test10_doParseB output argument | #select | tests2.cpp:22:2:22:2 | *p | tests2.cpp:20:17:20:31 | call to SAXParser | tests2.cpp:22:2:22:2 | *p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests2.cpp:20:17:20:31 | call to SAXParser | XML parser | | tests2.cpp:37:2:37:2 | *p | tests2.cpp:33:17:33:31 | call to SAXParser | tests2.cpp:37:2:37:2 | *p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests2.cpp:33:17:33:31 | call to SAXParser | XML parser | diff --git a/cpp/ql/test/successor-tests/staticlocals/no_dynamic_init/exprs.expected b/cpp/ql/test/successor-tests/staticlocals/no_dynamic_init/exprs.expected index 3f13846909a..3798bed6f32 100644 --- a/cpp/ql/test/successor-tests/staticlocals/no_dynamic_init/exprs.expected +++ b/cpp/ql/test/successor-tests/staticlocals/no_dynamic_init/exprs.expected @@ -2,5 +2,3 @@ | no_dynamic_init.cpp:5:12:5:35 | no_dynamic_init.cpp:5:12:5:35 | no_dynamic_init.cpp:5:12:5:35 | Goodbye cruel world.\n | | no_dynamic_init.cpp:5:12:5:35 | no_dynamic_init.cpp:5:12:5:35 | no_dynamic_init.cpp:5:12:5:35 | array to pointer conversion | | no_dynamic_init.cpp:11:10:11:10 | no_dynamic_init.cpp:11:10:11:10 | no_dynamic_init.cpp:11:10:11:10 | 0 | -| no_dynamic_init.cpp:12:1:12:1 | no_dynamic_init.cpp:12:1:12:1 | no_dynamic_init.cpp:12:1:12:1 | call to ~Magic | -| no_dynamic_init.cpp:12:1:12:1 | no_dynamic_init.cpp:12:1:12:1 | no_dynamic_init.cpp:12:1:12:1 | m | diff --git a/csharp/CSharp.sln b/csharp/CSharp.sln index 3c9f3ef4e4f..0ba39b813bb 100644 --- a/csharp/CSharp.sln +++ b/csharp/CSharp.sln @@ -34,6 +34,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.CSharp.Tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Extraction.CSharp.DependencyStubGenerator", "extractor\Semmle.Extraction.CSharp.DependencyStubGenerator\Semmle.Extraction.CSharp.DependencyStubGenerator.csproj", "{0EDA21A3-ADD8-4C10-B494-58B12B526B76}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.Cpp", "..\cpp\autobuilder\Semmle.Autobuild.Cpp\Semmle.Autobuild.Cpp.csproj", "{125C4FB7-34DA-442A-9095-3EA1514270CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.Cpp.Tests", "..\cpp\autobuilder\Semmle.Autobuild.Cpp.Tests\Semmle.Autobuild.Cpp.Tests.csproj", "{72F369B7-0707-401A-802F-D526F272F9EE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -102,6 +106,14 @@ Global {0EDA21A3-ADD8-4C10-B494-58B12B526B76}.Debug|Any CPU.Build.0 = Debug|Any CPU {0EDA21A3-ADD8-4C10-B494-58B12B526B76}.Release|Any CPU.ActiveCfg = Release|Any CPU {0EDA21A3-ADD8-4C10-B494-58B12B526B76}.Release|Any CPU.Build.0 = Release|Any CPU + {125C4FB7-34DA-442A-9095-3EA1514270CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {125C4FB7-34DA-442A-9095-3EA1514270CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {125C4FB7-34DA-442A-9095-3EA1514270CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {125C4FB7-34DA-442A-9095-3EA1514270CD}.Release|Any CPU.Build.0 = Release|Any CPU + {72F369B7-0707-401A-802F-D526F272F9EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72F369B7-0707-401A-802F-D526F272F9EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72F369B7-0707-401A-802F-D526F272F9EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72F369B7-0707-401A-802F-D526F272F9EE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index 95fcb51072e..da2e3c36c9b 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -970,12 +970,10 @@ namespace Semmle.Autobuild.CSharp.Tests actions.RunProcess["dotnet --list-sdks"] = 0; actions.RunProcessOut["dotnet --list-sdks"] = @"2.1.3 [C:\Program Files\dotnet\sdks] 2.1.4 [C:\Program Files\dotnet\sdks]"; - actions.RunProcess[@"chmod u+x scratch/.dotnet/dotnet-install.sh"] = 0; - actions.RunProcess[@"scratch/.dotnet/dotnet-install.sh --channel release --version 2.1.3 --install-dir scratch/.dotnet"] = 0; - actions.RunProcess[@"scratch/.dotnet/dotnet --info"] = 0; - actions.RunProcess[@"scratch/.dotnet/dotnet clean C:\Project/test.csproj"] = 0; - actions.RunProcess[@"scratch/.dotnet/dotnet restore C:\Project/test.csproj"] = 0; - actions.RunProcess[@"scratch/.dotnet/dotnet build --no-incremental C:\Project/test.csproj"] = 0; + actions.RunProcess[@"dotnet --info"] = 0; + actions.RunProcess[@"dotnet clean C:\Project/test.csproj"] = 0; + actions.RunProcess[@"dotnet restore C:\Project/test.csproj"] = 0; + actions.RunProcess[@"dotnet build --no-incremental C:\Project/test.csproj"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists["test.csproj"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -993,17 +991,15 @@ namespace Semmle.Autobuild.CSharp.Tests "); actions.LoadXml[@"C:\Project/test.csproj"] = xml; - actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "scratch/.dotnet/dotnet-install.sh")); - actions.CreateDirectories.Add(@"scratch/.dotnet"); var autobuilder = CreateAutoBuilder(false, dotnetVersion: "2.1.3"); - TestAutobuilderScript(autobuilder, 0, 7); + TestAutobuilderScript(autobuilder, 0, 5); } private void TestDotnetVersionWindows(Action action, int commandsRun) { actions.RunProcess["cmd.exe /C dotnet --list-sdks"] = 0; - actions.RunProcessOut["cmd.exe /C dotnet --list-sdks"] = "2.1.3 [C:\\Program Files\\dotnet\\sdks]\n2.1.4 [C:\\Program Files\\dotnet\\sdks]"; + actions.RunProcessOut["cmd.exe /C dotnet --list-sdks"] = "2.1.4 [C:\\Program Files\\dotnet\\sdks]"; action(); actions.RunProcess[@"cmd.exe /C scratch\.dotnet\dotnet --info"] = 0; actions.RunProcess[@"cmd.exe /C scratch\.dotnet\dotnet clean C:\Project\test.csproj"] = 0; diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/AutoBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/AutoBuildRule.cs index cd138d62af5..e58c8ddccd9 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/AutoBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/AutoBuildRule.cs @@ -1,5 +1,6 @@ using Semmle.Autobuild.Shared; using Semmle.Extraction.CSharp; +using Semmle.Util; namespace Semmle.Autobuild.CSharp { diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs index 3a6c1bda85c..aad91541064 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs @@ -50,11 +50,8 @@ namespace Semmle.Autobuild.CSharp attempt = new BuildCommandRule(DotNetRule.WithDotNet).Analyse(this, false) & CheckExtractorRun(true); break; case CSharpBuildStrategy.Buildless: - 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); - }); + // No need to check that the extractor has been executed in buildless mode + attempt = new StandaloneBuildRule().Analyse(this, false); break; case CSharpBuildStrategy.MSBuild: attempt = new MsBuildRule().Analyse(this, false) & CheckExtractorRun(true); @@ -84,7 +81,7 @@ namespace Semmle.Autobuild.CSharp return 0; if (warnOnFailure) - Log(Severity.Error, "No C# code detected during build."); + Logger.LogError("No C# code detected during build."); return 1; }); diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index b85e6cc7732..cd25055da1a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -5,7 +5,7 @@ using System.Linq; using Semmle.Util; using Semmle.Util.Logging; using Semmle.Autobuild.Shared; -using Newtonsoft.Json.Linq; +using Semmle.Extraction.CSharp.DependencyFetching; namespace Semmle.Autobuild.CSharp { @@ -39,14 +39,14 @@ namespace Semmle.Autobuild.CSharp if (notDotNetProject is not null) { - builder.Log(Severity.Info, "Not using .NET Core because of incompatible project {0}", notDotNetProject); + builder.Logger.Log(Severity.Info, "Not using .NET Core because of incompatible project {0}", notDotNetProject); return BuildScript.Failure; } - builder.Log(Severity.Info, "Attempting to build using .NET Core"); + builder.Logger.LogInfo("Attempting to build using .NET Core"); } - return WithDotNet(builder, (dotNetPath, environment) => + return WithDotNet(builder, ensureDotNetAvailable: false, (dotNetPath, environment) => { var ret = GetInfoCommand(builder.Actions, dotNetPath, environment); foreach (var projectOrSolution in builder.ProjectsOrSolutionsToBuild) @@ -79,31 +79,24 @@ namespace Semmle.Autobuild.CSharp /// variables needed by the installed .NET Core (null when no variables /// are needed). /// - public static BuildScript WithDotNet(IAutobuilder builder, Func?, BuildScript> f) + public static BuildScript WithDotNet(IAutobuilder builder, bool ensureDotNetAvailable, Func?, BuildScript> f) { - var installDir = builder.Actions.PathCombine(FileUtils.GetTemporaryWorkingDirectory(builder.Actions.GetEnvironmentVariable, builder.Options.Language.UpperCaseName, out var _), ".dotnet"); - var installScript = DownloadDotNet(builder, installDir); - return BuildScript.Bind(installScript, installed => + var temp = FileUtils.GetTemporaryWorkingDirectory(builder.Actions.GetEnvironmentVariable, builder.Options.Language.UpperCaseName, out var shouldCleanUp); + return DotNet.WithDotNet(builder.Actions, builder.Logger, builder.Paths.Select(x => x.Item1), temp, shouldCleanUp, ensureDotNetAvailable, builder.Options.DotNetVersion, installDir => { - Dictionary? env; - if (installed == 0) + var env = new Dictionary { - // The installation succeeded, so use the newly installed .NET Core + { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, + { "MSBUILDDISABLENODEREUSE", "1" } + }; + if (installDir is not null) + { + // The installation succeeded, so use the newly installed .NET var path = builder.Actions.GetEnvironmentVariable("PATH"); var delim = builder.Actions.IsWindows() ? ";" : ":"; - env = new Dictionary{ - { "DOTNET_MULTILEVEL_LOOKUP", "false" }, // prevent look up of other .NET Core SDKs - { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, - { "MSBUILDDISABLENODEREUSE", "1" }, - { "PATH", installDir + delim + path } - }; + env.Add("DOTNET_MULTILEVEL_LOOKUP", "false"); // prevent look up of other .NET SDKs + env.Add("PATH", installDir + delim + path); } - else - { - installDir = null; - env = null; - } - return f(installDir, env); }); } @@ -117,126 +110,7 @@ namespace Semmle.Autobuild.CSharp /// are needed). /// public static BuildScript WithDotNet(IAutobuilder builder, Func?, BuildScript> f) - => WithDotNet(builder, (_1, env) => f(env)); - - /// - /// Returns a script for downloading relevant versions of the - /// .NET Core SDK. The SDK(s) will be installed at installDir - /// (provided that the script succeeds). - /// - private static BuildScript DownloadDotNet(IAutobuilder builder, string installDir) - { - if (!string.IsNullOrEmpty(builder.Options.DotNetVersion)) - // Specific version supplied in configuration: always use that - return DownloadDotNetVersion(builder, installDir, builder.Options.DotNetVersion); - - // Download versions mentioned in `global.json` files - // See https://docs.microsoft.com/en-us/dotnet/core/tools/global-json - var installScript = BuildScript.Success; - var validGlobalJson = false; - foreach (var path in builder.Paths.Select(p => p.Item1).Where(p => p.EndsWith("global.json", StringComparison.Ordinal))) - { - string version; - try - { - var o = JObject.Parse(File.ReadAllText(path)); - version = (string)(o?["sdk"]?["version"]!); - } - catch // lgtm[cs/catch-of-all-exceptions] - { - // not a valid global.json file - continue; - } - - installScript &= DownloadDotNetVersion(builder, installDir, version); - validGlobalJson = true; - } - - return validGlobalJson ? installScript : BuildScript.Failure; - } - - /// - /// Returns a script for downloading a specific .NET Core SDK version, if the - /// version is not already installed. - /// - /// See https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script. - /// - private static BuildScript DownloadDotNetVersion(IAutobuilder builder, string path, string version) - { - return BuildScript.Bind(GetInstalledSdksScript(builder.Actions), (sdks, sdksRet) => - { - if (sdksRet == 0 && sdks.Count == 1 && sdks[0].StartsWith(version + " ", StringComparison.Ordinal)) - // The requested SDK is already installed (and no other SDKs are installed), so - // no need to reinstall - return BuildScript.Failure; - - builder.Log(Severity.Info, "Attempting to download .NET Core {0}", version); - - if (builder.Actions.IsWindows()) - { - - var psCommand = $"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -Version {version} -InstallDir {path}"; - - BuildScript GetInstall(string pwsh) => - new CommandBuilder(builder.Actions). - RunCommand(pwsh). - Argument("-NoProfile"). - Argument("-ExecutionPolicy"). - Argument("unrestricted"). - Argument("-Command"). - Argument("\"" + psCommand + "\""). - Script; - - return GetInstall("pwsh") | GetInstall("powershell"); - } - else - { - var dotnetInstallPath = builder.Actions.PathCombine(FileUtils.GetTemporaryWorkingDirectory( - builder.Actions.GetEnvironmentVariable, - builder.Options.Language.UpperCaseName, - out var shouldCleanUp), ".dotnet", "dotnet-install.sh"); - - var downloadDotNetInstallSh = BuildScript.DownloadFile( - "https://dot.net/v1/dotnet-install.sh", - dotnetInstallPath, - e => builder.Log(Severity.Warning, $"Failed to download 'dotnet-install.sh': {e.Message}")); - - var chmod = new CommandBuilder(builder.Actions). - RunCommand("chmod"). - Argument("u+x"). - Argument(dotnetInstallPath); - - var install = new CommandBuilder(builder.Actions). - RunCommand(dotnetInstallPath). - Argument("--channel"). - Argument("release"). - Argument("--version"). - Argument(version). - Argument("--install-dir"). - Argument(path); - - var buildScript = downloadDotNetInstallSh & chmod.Script & install.Script; - - if (shouldCleanUp) - { - var removeScript = new CommandBuilder(builder.Actions). - RunCommand("rm"). - Argument(dotnetInstallPath); - buildScript &= removeScript.Script; - } - - return buildScript; - } - }); - } - - private static BuildScript GetInstalledSdksScript(IBuildActions actions) - { - var listSdks = new CommandBuilder(actions, silent: true). - RunCommand("dotnet"). - Argument("--list-sdks"); - return listSdks.Script; - } + => WithDotNet(builder, ensureDotNetAvailable: false, (_, env) => f(env)); private static string DotNetCommand(IBuildActions actions, string? dotNetPath) => dotNetPath is not null ? actions.PathCombine(dotNetPath, "dotnet") : "dotnet"; diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/Program.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/Program.cs index 479625c76e3..71289148916 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/Program.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/Program.cs @@ -1,5 +1,7 @@ using System; + using Semmle.Autobuild.Shared; +using Semmle.Util; namespace Semmle.Autobuild.CSharp { diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj b/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj index dbbe8c80471..911e71bfdc9 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj @@ -20,6 +20,7 @@ + diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index c0444292020..c202a029674 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -1,5 +1,5 @@ -using System.Linq; -using Semmle.Autobuild.Shared; +using Semmle.Autobuild.Shared; +using Semmle.Util; namespace Semmle.Autobuild.CSharp { @@ -8,45 +8,19 @@ 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 standalone; - if (builder.CodeQLExtractorLangRoot is not null && builder.CodeQlPlatform is not null) - { - standalone = builder.Actions.PathCombine(builder.CodeQLExtractorLangRoot, "tools", builder.CodeQlPlatform, "Semmle.Extraction.CSharp.Standalone"); - } - else - { - return BuildScript.Failure; - } - - var cmd = new CommandBuilder(builder.Actions); - cmd.RunCommand(standalone); - - if (!string.IsNullOrEmpty(this.dotNetPath)) - { - cmd.Argument("--dotnet"); - cmd.QuoteArgument(this.dotNetPath); - } - - return cmd.Script; - } - - if (!builder.Options.Buildless) + if (builder.CodeQLExtractorLangRoot is null + || builder.CodeQlPlatform is null) { return BuildScript.Failure; } - return GetCommand(); + var standalone = builder.Actions.PathCombine(builder.CodeQLExtractorLangRoot, "tools", builder.CodeQlPlatform, "Semmle.Extraction.CSharp.Standalone"); + var cmd = new CommandBuilder(builder.Actions); + cmd.RunCommand(standalone); + + return cmd.Script; } } } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs index 8a02370bcf6..b7e3293a0f2 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs @@ -75,7 +75,7 @@ namespace Semmle.Autobuild.Shared return defaultValue; return value. - Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries). + Split(FileUtils.NewLineCharacters, StringSplitOptions.RemoveEmptyEntries). Select(s => AsStringWithExpandedEnvVars(s, actions)).ToArray(); } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs index d6757418875..a23d29d2979 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs @@ -70,11 +70,9 @@ namespace Semmle.Autobuild.Shared IBuildActions Actions { get; } /// - /// Log a given build event to the console. + /// A logger. /// - /// The format string. - /// Inserts to the format string. - void Log(Severity severity, string format, params object[] args); + ILogger Logger { get; } /// /// Value of CODEQL_EXTRACTOR__ROOT environment variable. @@ -135,21 +133,7 @@ namespace Semmle.Autobuild.Shared /// True iff the path was found. public bool HasPath(string path) => Paths.Any(p => path == p.Item1); - private void FindFiles(string dir, int depth, int maxDepth, IList<(string, int)> results) - { - foreach (var f in Actions.EnumerateFiles(dir)) - { - results.Add((f, depth)); - } - if (depth < maxDepth) - { - foreach (var d in Actions.EnumerateDirectories(dir)) - { - FindFiles(d, depth + 1, maxDepth, results); - } - } - } /// /// The root of the source directory. @@ -196,12 +180,7 @@ namespace Semmle.Autobuild.Shared Options = options; DiagnosticClassifier = diagnosticClassifier; - pathsLazy = new Lazy>(() => - { - var files = new List<(string, int)>(); - FindFiles(options.RootDirectory, 0, options.SearchDepth, files); - return files.OrderBy(f => f.Item2).ToArray(); - }); + pathsLazy = new Lazy>(() => Actions.FindFiles(options.RootDirectory, options.SearchDepth)); projectsOrSolutionsToBuildLazy = new Lazy>(() => { @@ -214,7 +193,7 @@ namespace Semmle.Autobuild.Shared if (actions.FileExists(solution)) ret.Add(new Solution(this, solution, true)); else - Log(Severity.Error, $"The specified project or solution file {solution} was not found"); + logger.LogError($"The specified project or solution file {solution} was not found"); } return ret; } @@ -273,6 +252,8 @@ namespace Semmle.Autobuild.Shared logThreadId: false) ?? Verbosity.Info, logThreadId: false); + public ILogger Logger => logger; + private readonly IDiagnosticsWriter diagnostics; /// @@ -285,16 +266,6 @@ namespace Semmle.Autobuild.Shared return Path.GetRelativePath(this.RootDirectory, path); } - /// - /// Log a given build event to the console. - /// - /// The format string. - /// Inserts to the format string. - public void Log(Severity severity, string format, params object[] args) - { - logger.Log(severity, format, args); - } - /// /// Write to the diagnostics file. /// @@ -310,7 +281,7 @@ namespace Semmle.Autobuild.Shared /// The exit code, 0 for success and non-zero for failures. public int AttemptBuild() { - Log(Severity.Info, $"Working directory: {Options.RootDirectory}"); + logger.LogInfo($"Working directory: {Options.RootDirectory}"); var script = GetBuildScript(); @@ -319,12 +290,12 @@ namespace Semmle.Autobuild.Shared void startCallback(string s, bool silent) { - Log(silent ? Severity.Debug : Severity.Info, $"\nRunning {s}"); + logger.Log(silent ? Severity.Debug : Severity.Info, $"\nRunning {s}"); } void exitCallback(int ret, string msg, bool silent) { - Log(silent ? Severity.Debug : Severity.Info, $"Exit code {ret}{(string.IsNullOrEmpty(msg) ? "" : $": {msg}")}"); + logger.Log(silent ? Severity.Debug : Severity.Info, $"Exit code {ret}{(string.IsNullOrEmpty(msg) ? "" : $": {msg}")}"); } var onOutput = BuildOutputHandler(Console.Out); @@ -374,7 +345,7 @@ namespace Semmle.Autobuild.Shared protected BuildScript AutobuildFailure() => BuildScript.Create(actions => { - Log(Severity.Error, "Could not auto-detect a suitable build method"); + logger.LogError("Could not auto-detect a suitable build method"); AutobuildFailureDiagnostic(); diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs index c0990a75ae1..d754b3c3134 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; using System.Linq; + +using Semmle.Util; using Semmle.Util.Logging; namespace Semmle.Autobuild.Shared @@ -53,7 +55,7 @@ namespace Semmle.Autobuild.Shared public BuildScript Analyse(IAutobuilder builder, bool auto) { - builder.Log(Severity.Info, "Attempting to locate build script"); + builder.Logger.LogInfo("Attempting to locate build script"); // a list of extensions for files that we consider to be scripts on the current platform var extensions = builder.Actions.IsWindows() ? winExtensions : linuxExtensions; diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs index 54d406c9dac..9aaefe1a1da 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs @@ -1,4 +1,6 @@ -namespace Semmle.Autobuild.Shared +using Semmle.Util; + +namespace Semmle.Autobuild.Shared { /// /// Execute the build_command rule. diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildTools.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildTools.cs index a0079ca8bb9..0e910b68d48 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildTools.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildTools.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Semmle.Util; namespace Semmle.Autobuild.Shared { diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs index 3099449a1fb..bff10532abf 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs @@ -40,7 +40,7 @@ namespace Semmle.Autobuild.Shared return BuildScript.Failure; if (auto) - builder.Log(Severity.Info, "Attempting to build using MSBuild"); + builder.Logger.LogInfo("Attempting to build using MSBuild"); var vsTools = GetVcVarsBatFile(builder); @@ -54,7 +54,7 @@ namespace Semmle.Autobuild.Shared if (vsTools is null && builder.Actions.IsWindows()) { - builder.Log(Severity.Warning, "Could not find a suitable version of VsDevCmd.bat/vcvarsall.bat"); + builder.Logger.LogWarning("Could not find a suitable version of VsDevCmd.bat/vcvarsall.bat"); } // Use `nuget.exe` from source code repo, if present, otherwise first attempt with global @@ -165,18 +165,18 @@ namespace Semmle.Autobuild.Shared { foreach (var b in BuildTools.VcVarsAllBatFiles(builder.Actions)) { - builder.Log(Severity.Info, "Found {0} version {1}", b.Path, b.ToolsVersion); + builder.Logger.Log(Severity.Info, "Found {0} version {1}", b.Path, b.ToolsVersion); } vsTools = BuildTools.FindCompatibleVcVars(builder.Actions, msToolsVersion); if (vsTools is null) - builder.Log(Severity.Warning, "Could not find build tools matching version {0}", msToolsVersion); + builder.Logger.LogWarning("Could not find build tools matching version {0}", msToolsVersion); else - builder.Log(Severity.Info, "Setting Visual Studio tools to {0}", vsTools.Path); + builder.Logger.Log(Severity.Info, "Setting Visual Studio tools to {0}", vsTools.Path); } else { - builder.Log(Severity.Error, "The format of vstools_version is incorrect. Please specify an integer."); + builder.Logger.LogError("The format of vstools_version is incorrect. Please specify an integer."); } } @@ -189,18 +189,18 @@ namespace Semmle.Autobuild.Shared private static BuildScript DownloadNugetExe(IAutobuilder builder, string path) where TAutobuildOptions : AutobuildOptionsShared => BuildScript.Create(_ => { - builder.Log(Severity.Info, "Attempting to download nuget.exe"); + builder.Logger.LogInfo("Attempting to download nuget.exe"); return 0; }) & BuildScript.DownloadFile( FileUtils.NugetExeUrl, path, - e => builder.Log(Severity.Warning, $"Failed to download 'nuget.exe': {e.Message}")) + e => builder.Logger.LogWarning($"Failed to download 'nuget.exe': {e.Message}")) & BuildScript.Create(_ => { - builder.Log(Severity.Info, $"Successfully downloaded {path}"); + builder.Logger.LogInfo($"Successfully downloaded {path}"); return 0; }); } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Project.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/Project.cs index 71522859871..5979b11e8fc 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Project.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Project.cs @@ -41,7 +41,7 @@ namespace Semmle.Autobuild.Shared } catch (Exception ex) when (ex is XmlException || ex is FileNotFoundException) { - builder.Log(Severity.Info, $"Unable to read project file {path}."); + builder.Logger.LogInfo($"Unable to read project file {path}."); return; } @@ -66,7 +66,7 @@ namespace Semmle.Autobuild.Shared catch // lgtm[cs/catch-of-all-exceptions] // Generic catch clause - Version constructor throws about 5 different exceptions. { - builder.Log(Severity.Warning, "Project {0} has invalid tools version {1}", path, toolsVersion); + builder.Logger.Log(Severity.Warning, "Project {0} has invalid tools version {1}", path, toolsVersion); } } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs index d48cfa15913..7a98a01de25 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs @@ -73,7 +73,7 @@ namespace Semmle.Autobuild.Shared return; } - builder.Log(Severity.Info, $"Unable to read solution file {path}."); + builder.Logger.LogInfo($"Unable to read solution file {path}."); includedProjects = Array.Empty>(); return; } diff --git a/csharp/codeql-extractor.yml b/csharp/codeql-extractor.yml index 0f65d9bc2e5..13019e7b0a3 100644 --- a/csharp/codeql-extractor.yml +++ b/csharp/codeql-extractor.yml @@ -9,6 +9,7 @@ extra_env_vars: build_modes: - autobuild - manual + - none github_api_languages: - C# scc_languages: @@ -33,8 +34,10 @@ options: type: string pattern: "^(none|gzip|brotli)$" buildless: - title: Whether to use buildless (standalone) extraction. + title: DEPRECATED - Whether to use buildless (standalone) extraction. description: > + DEPRECATED: Use `--build-mode none` instead. + A value indicating, which type of extraction the autobuilder should perform. If 'true', then the standalone extractor will be used, otherwise tracing extraction will be performed. diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/compiler_generated.ql b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/compiler_generated.ql new file mode 100644 index 00000000000..7d51351f1dd --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/compiler_generated.ql @@ -0,0 +1,7 @@ +class Modifiable extends @modifiable { + Modifiable() { compiler_generated(this) } + + string toString() { none() } +} + +select any(Modifiable m) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/expr_compiler_generated.ql b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/expr_compiler_generated.ql new file mode 100644 index 00000000000..16051ecb5f6 --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/expr_compiler_generated.ql @@ -0,0 +1,7 @@ +class Expression extends @expr { + Expression() { compiler_generated(this) } + + string toString() { none() } +} + +select any(Expression e) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme new file mode 100644 index 00000000000..21ede72308c --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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); + +/** 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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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_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); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..c9ee11bd1ee --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme @@ -0,0 +1,2100 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties new file mode 100644 index 00000000000..2cf7c647937 --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties @@ -0,0 +1,4 @@ +description: Split `compiler_generated` into `expr_compiler_generated` and `compiler_generated`. +compatibility: backwards +compiler_generated.rel: run compiler_generated.qlo +expr_compiler_generated.rel: run expr_compiler_generated.qlo diff --git a/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/old.dbscheme b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/old.dbscheme new file mode 100644 index 00000000000..fd04e45710e --- /dev/null +++ b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/old.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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); + +/** 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, params/array = 3, this = 4, in = 5, ref readonly = 6 */ + 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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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_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); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/params.ql b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/params.ql new file mode 100644 index 00000000000..a4f2c61b65f --- /dev/null +++ b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/params.ql @@ -0,0 +1,19 @@ +class Parameter extends @parameter { + string toString() { none() } +} + +class TypeOrRef extends @type_or_ref { + string toString() { none() } +} + +class Parameterizable extends @parameterizable { + string toString() { none() } +} + +from + Parameter p, string name, TypeOrRef typeId, int index, int mode, Parameterizable parentId, + Parameter unboundId, int updatedMode +where + params(p, name, typeId, index, mode, parentId, unboundId) and + if mode = 6 then updatedMode = 0 else updatedMode = mode +select p, name, typeId, index, updatedMode, parentId, unboundId diff --git a/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/semmlecode.csharp.dbscheme b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..21ede72308c --- /dev/null +++ b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/semmlecode.csharp.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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); + +/** 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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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_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); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/upgrade.properties b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/upgrade.properties new file mode 100644 index 00000000000..d17d64146a7 --- /dev/null +++ b/csharp/downgrades/fd04e45710e1988076801608abffdfa013b680fc/upgrade.properties @@ -0,0 +1,3 @@ +description: Extract `ref readonly` parameters as having `mode` 0 in the params table. +compatibility: full +params.rel: run params.qlo diff --git a/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs b/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs index 8fcc6fefcb3..2009fe1c94f 100644 --- a/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs +++ b/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs @@ -46,7 +46,7 @@ namespace Semmle.Extraction.CIL.Driver .ToArray(); foreach (var missingRef in options.MissingReferences) - logger.Log(Severity.Info, " Missing assembly " + missingRef); + logger.LogInfo(" Missing assembly " + missingRef); var sw = new Stopwatch(); sw.Start(); diff --git a/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs b/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs index 4d7fa77c548..50288aadd94 100644 --- a/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs +++ b/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs @@ -45,7 +45,7 @@ namespace Semmle.Extraction.CIL } catch (Exception ex) // lgtm[cs/catch-of-all-exceptions] { - logger.Log(Severity.Error, string.Format("Exception extracting {0}: {1}", assemblyPath, ex)); + logger.LogError(string.Format("Exception extracting {0}: {1}", assemblyPath, ex)); } } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index e93db44fd36..eb4824a0c14 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -7,6 +7,7 @@ using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; + using Semmle.Util; using Semmle.Util.Logging; @@ -27,8 +28,8 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private readonly List generatedSources; private int dotnetFrameworkVersionVariantCount = 0; private int conflictedReferences = 0; - private readonly IDependencyOptions options; private readonly DirectoryInfo sourceDir; + private string? dotnetPath; private readonly IDotNet dotnet; private readonly FileContent fileContent; private readonly TemporaryDirectory packageDirectory; @@ -39,17 +40,17 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private readonly Lazy runtimeLazy; private Runtime Runtime => runtimeLazy.Value; + private readonly int threads = EnvironmentVariables.GetDefaultNumberOfThreads(); /// /// Performs C# dependency fetching. /// /// Dependency fetching options /// Logger for dependency fetching progress. - public DependencyManager(string srcDir, IDependencyOptions options, ILogger logger) + public DependencyManager(string srcDir, ILogger logger) { var startTime = DateTime.Now; - this.options = options; this.logger = logger; this.sourceDir = new DirectoryInfo(srcDir); @@ -59,17 +60,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching tempWorkingDirectory = new TemporaryDirectory(FileUtils.GetTemporaryWorkingDirectory(out cleanupTempWorkingDirectory)); - try - { - this.dotnet = DotNet.Make(options, logger, tempWorkingDirectory); - runtimeLazy = new Lazy(() => new Runtime(dotnet)); - } - catch - { - logger.LogError("Missing dotnet CLI"); - throw; - } - logger.LogInfo($"Finding files in {srcDir}..."); var allFiles = GetAllFiles().ToList(); @@ -85,6 +75,33 @@ namespace Semmle.Extraction.CSharp.DependencyFetching logger.LogInfo($"Found {allFiles.Count} files, {nonGeneratedSources.Count} source files, {allProjects.Count} project files, {allSolutions.Count} solution files, {dllPaths.Count} DLLs."); + void startCallback(string s, bool silent) + { + logger.Log(silent ? Severity.Debug : Severity.Info, $"\nRunning {s}"); + } + + void exitCallback(int ret, string msg, bool silent) + { + logger.Log(silent ? Severity.Debug : Severity.Info, $"Exit code {ret}{(string.IsNullOrEmpty(msg) ? "" : $": {msg}")}"); + } + + DotNet.WithDotNet(SystemBuildActions.Instance, logger, smallNonBinaryFiles, tempWorkingDirectory.ToString(), shouldCleanUp: false, ensureDotNetAvailable: true, version: null, installDir => + { + this.dotnetPath = installDir; + return BuildScript.Success; + }).Run(SystemBuildActions.Instance, startCallback, exitCallback); + + try + { + this.dotnet = DotNet.Make(logger, dotnetPath, tempWorkingDirectory); + runtimeLazy = new Lazy(() => new Runtime(dotnet)); + } + catch + { + logger.LogError("Missing dotnet CLI"); + throw; + } + RestoreNugetPackages(allNonBinaryFiles, allProjects, allSolutions, dllPaths); // Find DLLs in the .Net / Asp.Net Framework // This needs to come after the nuget restore, because the nuget restore might fetch the .NET Core/Framework reference assemblies. @@ -112,7 +129,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching logger.LogInfo($"Unresolved reference {r.Key} in project {r.Value}"); } - var webViewExtractionOption = Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_STANDALONE_EXTRACT_WEB_VIEWS"); + var webViewExtractionOption = Environment.GetEnvironmentVariable(EnvironmentVariableNames.WebViewGeneration); if (webViewExtractionOption == null || bool.TryParse(webViewExtractionOption, out var shouldExtractWebViews) && shouldExtractWebViews) @@ -159,6 +176,53 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { var frameworkLocations = new HashSet(); + var frameworkReferences = Environment.GetEnvironmentVariable(EnvironmentVariableNames.DotnetFrameworkReferences); + var frameworkReferencesUseSubfolders = Environment.GetEnvironmentVariable(EnvironmentVariableNames.DotnetFrameworkReferencesUseSubfolders); + _ = bool.TryParse(frameworkReferencesUseSubfolders, out var useSubfolders); + if (!string.IsNullOrWhiteSpace(frameworkReferences)) + { + RemoveFrameworkNugetPackages(dllPaths); + RemoveNugetPackageReference(FrameworkPackageNames.AspNetCoreFramework, dllPaths); + RemoveNugetPackageReference(FrameworkPackageNames.WindowsDesktopFramework, dllPaths); + + var frameworkPaths = frameworkReferences.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries); + + foreach (var path in frameworkPaths) + { + if (!Directory.Exists(path)) + { + logger.LogError($"Specified framework reference path '{path}' does not exist."); + continue; + } + + if (useSubfolders) + { + dllPaths.Add(path); + frameworkLocations.Add(path); + continue; + } + + try + { + var dlls = Directory.GetFiles(path, "*.dll", new EnumerationOptions { RecurseSubdirectories = false, MatchCasing = MatchCasing.CaseInsensitive }); + if (dlls.Length == 0) + { + logger.LogError($"No DLLs found in specified framework reference path '{path}'."); + continue; + } + + dllPaths.UnionWith(dlls); + frameworkLocations.UnionWith(dlls); + } + catch (Exception e) + { + logger.LogError($"Error while searching for DLLs in '{path}': {e.Message}"); + } + } + + return frameworkLocations; + } + AddNetFrameworkDlls(dllPaths, frameworkLocations); AddAspNetCoreFrameworkDlls(dllPaths, frameworkLocations); AddMicrosoftWindowsDesktopDlls(dllPaths, frameworkLocations); @@ -204,9 +268,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching nugetPackageDllPaths.ExceptWith(excludedPaths); dllPaths.UnionWith(nugetPackageDllPaths); } - catch (Exception) + catch (Exception exc) { - logger.LogError("Failed to restore Nuget packages with nuget.exe"); + logger.LogError($"Failed to restore Nuget packages with nuget.exe: {exc.Message}"); } var restoredProjects = RestoreSolutions(allSolutions, out var assets1); @@ -297,6 +361,15 @@ namespace Semmle.Extraction.CSharp.DependencyFetching .ToArray(); } + private void RemoveFrameworkNugetPackages(ISet dllPaths, int fromIndex = 0) + { + var packagesInPrioOrder = FrameworkPackageNames.NetFrameworks; + for (var i = fromIndex; i < packagesInPrioOrder.Length; i++) + { + RemoveNugetPackageReference(packagesInPrioOrder[i], dllPaths); + } + } + private void AddNetFrameworkDlls(ISet dllPaths, ISet frameworkLocations) { // Multiple dotnet framework packages could be present. @@ -304,7 +377,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var packagesInPrioOrder = FrameworkPackageNames.NetFrameworks; var frameworkPaths = packagesInPrioOrder - .Select((s, index) => (Index: index, Path: GetPackageDirectory(s))) + .Select((s, index) => (Index: index, Path: GetPackageDirectory(s, packageDirectory))) .Where(pair => pair.Path is not null) .ToArray(); @@ -318,12 +391,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } SelectNewestFrameworkPath(frameworkPath.Path, ".NET Framework", dllPaths, frameworkLocations); - - for (var i = frameworkPath.Index + 1; i < packagesInPrioOrder.Length; i++) - { - RemoveNugetPackageReference(packagesInPrioOrder[i], dllPaths); - } - + RemoveFrameworkNugetPackages(dllPaths, frameworkPath.Index + 1); return; } @@ -336,6 +404,16 @@ namespace Semmle.Extraction.CSharp.DependencyFetching else if (fileContent.IsLegacyProjectStructureUsed) { runtimeLocation = Runtime.DesktopRuntime; + + if (runtimeLocation is null) + { + logger.LogInfo("No .NET Desktop Runtime location found. Attempting to restore the .NET Framework reference assemblies manually."); + + if (TryRestorePackageManually(FrameworkPackageNames.LatestNetFrameworkReferenceAssemblies, null)) + { + runtimeLocation = GetPackageDirectory(FrameworkPackageNames.LatestNetFrameworkReferenceAssemblies, missingPackageDirectory); + } + } } runtimeLocation ??= Runtime.ExecutingRuntime; @@ -375,7 +453,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } // First try to find ASP.NET Core assemblies in the NuGet packages - if (GetPackageDirectory(FrameworkPackageNames.AspNetCoreFramework) is string aspNetCorePackage) + if (GetPackageDirectory(FrameworkPackageNames.AspNetCoreFramework, packageDirectory) is string aspNetCorePackage) { SelectNewestFrameworkPath(aspNetCorePackage, "ASP.NET Core", dllPaths, frameworkLocations); return; @@ -391,15 +469,15 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private void AddMicrosoftWindowsDesktopDlls(ISet dllPaths, ISet frameworkLocations) { - if (GetPackageDirectory(FrameworkPackageNames.WindowsDesktopFramework) is string windowsDesktopApp) + if (GetPackageDirectory(FrameworkPackageNames.WindowsDesktopFramework, packageDirectory) is string windowsDesktopApp) { SelectNewestFrameworkPath(windowsDesktopApp, "Windows Desktop App", dllPaths, frameworkLocations); } } - private string? GetPackageDirectory(string packagePrefix) + private string? GetPackageDirectory(string packagePrefix, TemporaryDirectory root) { - return new DirectoryInfo(packageDirectory.DirInfo.FullName) + return new DirectoryInfo(root.DirInfo.FullName) .EnumerateDirectories(packagePrefix + "*", new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive, RecurseSubdirectories = false }) .FirstOrDefault()? .FullName; @@ -435,19 +513,19 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } // Hardcoded values from https://learn.microsoft.com/en-us/dotnet/core/project-sdk/overview#implicit-using-directives - usings.UnionWith(new[] { "System", "System.Collections.Generic", "System.IO", "System.Linq", "System.Net.Http", "System.Threading", - "System.Threading.Tasks" }); + usings.UnionWith([ "System", "System.Collections.Generic", "System.IO", "System.Linq", "System.Net.Http", "System.Threading", + "System.Threading.Tasks" ]); if (fileContent.UseAspNetCoreDlls) { - usings.UnionWith(new[] { "System.Net.Http.Json", "Microsoft.AspNetCore.Builder", "Microsoft.AspNetCore.Hosting", + usings.UnionWith([ "System.Net.Http.Json", "Microsoft.AspNetCore.Builder", "Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Http", "Microsoft.AspNetCore.Routing", "Microsoft.Extensions.Configuration", - "Microsoft.Extensions.DependencyInjection", "Microsoft.Extensions.Hosting", "Microsoft.Extensions.Logging" }); + "Microsoft.Extensions.DependencyInjection", "Microsoft.Extensions.Hosting", "Microsoft.Extensions.Logging" ]); } if (fileContent.UseWindowsForms) { - usings.UnionWith(new[] { "System.Drawing", "System.Windows.Forms" }); + usings.UnionWith(["System.Drawing", "System.Windows.Forms"]); } usings.UnionWith(fileContent.CustomImplicitUsings); @@ -509,15 +587,13 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } } - public DependencyManager(string srcDir) : this(srcDir, DependencyOptions.Default, new ConsoleLogger(Verbosity.Info, logThreadId: true)) { } - private IEnumerable GetAllFiles() { IEnumerable files = sourceDir.GetFiles("*.*", new EnumerationOptions { RecurseSubdirectories = true }); - if (options.DotNetPath != null) + if (dotnetPath != null) { - files = files.Where(f => !f.FullName.StartsWith(options.DotNetPath, StringComparison.OrdinalIgnoreCase)); + files = files.Where(f => !f.FullName.StartsWith(dotnetPath, StringComparison.OrdinalIgnoreCase)); } files = files.Where(f => @@ -529,12 +605,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return true; } - logger.Log(Severity.Warning, $"File {f.FullName} could not be processed."); + logger.LogWarning($"File {f.FullName} could not be processed."); return false; } catch (Exception ex) { - logger.Log(Severity.Warning, $"File {f.FullName} could not be processed: {ex.Message}"); + logger.LogWarning($"File {f.FullName} could not be processed: {ex.Message}"); return false; } }); @@ -590,7 +666,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } catch (AssemblyLoadException) { - logger.Log(Severity.Warning, $"Could not load assembly information from {usedReference.Key}"); + logger.LogWarning($"Could not load assembly information from {usedReference.Key}"); } } @@ -677,7 +753,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private void AnalyseSolutions(IEnumerable solutions) { - Parallel.ForEach(solutions, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, solutionFile => + Parallel.ForEach(solutions, new ParallelOptions { MaxDegreeOfParallelism = threads }, solutionFile => { try { @@ -767,7 +843,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var successCount = 0; var assetFiles = new List(); var sync = new object(); - Parallel.ForEach(projects, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, project => + Parallel.ForEach(projects, new ParallelOptions { MaxDegreeOfParallelism = threads }, project => { logger.LogInfo($"Restoring project {project}..."); var res = dotnet.Restore(new(project, packageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true)); @@ -821,14 +897,14 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var alreadyDownloadedPackages = GetRestoredPackageDirectoryNames(packageDirectory.DirInfo); var alreadyDownloadedLegacyPackages = GetRestoredLegacyPackageNames(); - var notYetDownloadedPackages = new HashSet(fileContent.AllPackages); + var notYetDownloadedPackages = new HashSet(fileContent.AllPackages); foreach (var alreadyDownloadedPackage in alreadyDownloadedPackages) { - notYetDownloadedPackages.Remove(alreadyDownloadedPackage); + notYetDownloadedPackages.Remove(new(alreadyDownloadedPackage, PackageReferenceSource.SdkCsProj)); } foreach (var alreadyDownloadedLegacyPackage in alreadyDownloadedLegacyPackages) { - notYetDownloadedPackages.Remove(alreadyDownloadedLegacyPackage); + notYetDownloadedPackages.Remove(new(alreadyDownloadedLegacyPackage, PackageReferenceSource.PackagesConfig)); } if (notYetDownloadedPackages.Count == 0) @@ -867,40 +943,14 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var successCount = 0; var sync = new object(); - Parallel.ForEach(notYetDownloadedPackages, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, package => + Parallel.ForEach(notYetDownloadedPackages, new ParallelOptions { MaxDegreeOfParallelism = threads }, package => { - logger.LogInfo($"Restoring package {package}..."); - using var tempDir = new TemporaryDirectory(ComputeTempDirectory(package, "missingpackages_workingdir")); - var success = dotnet.New(tempDir.DirInfo.FullName); + var success = TryRestorePackageManually(package.Name, nugetConfig, package.PackageReferenceSource); if (!success) { return; } - success = dotnet.AddPackage(tempDir.DirInfo.FullName, package); - if (!success) - { - return; - } - - var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, PathToNugetConfig: nugetConfig)); - if (!res.Success) - { - if (res.HasNugetPackageSourceError) - { - // Restore could not be completed because the listed source is unavailable. Try without the nuget.config: - res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, PathToNugetConfig: null, ForceReevaluation: true)); - } - - // TODO: the restore might fail, we could retry with a prerelease (*-* instead of *) version of the package. - - if (!res.Success) - { - logger.LogInfo($"Failed to restore nuget package {package}"); - return; - } - } - lock (sync) { successCount++; @@ -912,6 +962,85 @@ namespace Semmle.Extraction.CSharp.DependencyFetching dllPaths.Add(missingPackageDirectory.DirInfo.FullName); } + [GeneratedRegex(@".*", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)] + private static partial Regex TargetFramework(); + + private bool TryRestorePackageManually(string package, string? nugetConfig, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj) + { + logger.LogInfo($"Restoring package {package}..."); + using var tempDir = new TemporaryDirectory(ComputeTempDirectory(package, "missingpackages_workingdir")); + var success = dotnet.New(tempDir.DirInfo.FullName); + if (!success) + { + return false; + } + + if (packageReferenceSource == PackageReferenceSource.PackagesConfig) + { + TryChangeTargetFrameworkMoniker(tempDir.DirInfo); + } + + success = dotnet.AddPackage(tempDir.DirInfo.FullName, package); + if (!success) + { + return false; + } + + var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, PathToNugetConfig: nugetConfig)); + if (!res.Success) + { + if (res.HasNugetPackageSourceError && nugetConfig is not null) + { + // Restore could not be completed because the listed source is unavailable. Try without the nuget.config: + res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, PathToNugetConfig: null, ForceReevaluation: true)); + } + + // TODO: the restore might fail, we could retry with + // - a prerelease (*-* instead of *) version of the package, + // - a different target framework moniker. + + if (!res.Success) + { + logger.LogInfo($"Failed to restore nuget package {package}"); + return false; + } + } + + return true; + } + + private void TryChangeTargetFrameworkMoniker(DirectoryInfo tempDir) + { + try + { + logger.LogInfo($"Changing the target framework moniker in {tempDir.FullName}..."); + + var csprojs = tempDir.GetFiles("*.csproj", new EnumerationOptions { RecurseSubdirectories = false, MatchCasing = MatchCasing.CaseInsensitive }); + if (csprojs.Length != 1) + { + logger.LogError($"Could not find the .csproj file in {tempDir.FullName}, count = {csprojs.Length}"); + return; + } + + var csproj = csprojs[0]; + var content = File.ReadAllText(csproj.FullName); + var matches = TargetFramework().Matches(content); + if (matches.Count == 0) + { + logger.LogError($"Could not find target framework in {csproj.FullName}"); + } + else + { + content = TargetFramework().Replace(content, $"{FrameworkPackageNames.LatestNetFrameworkMoniker}", 1); + File.WriteAllText(csproj.FullName, content); + } + } + catch (Exception exc) + { + logger.LogError($"Failed to update target framework in {tempDir.FullName}: {exc}"); + } + } + public void Dispose(TemporaryDirectory? dir, string name) { try diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyOptions.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyOptions.cs deleted file mode 100644 index 59e5c54097c..00000000000 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyOptions.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using Semmle.Util; - -namespace Semmle.Extraction.CSharp.DependencyFetching -{ - /// - /// Dependency fetching related options. - /// - 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 - { - public static IDependencyOptions Default => new DependencyOptions(); - - 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 37c028920a8..f0220b6be74 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text.RegularExpressions; + +using Newtonsoft.Json.Linq; + using Semmle.Util; using Semmle.Util.Logging; @@ -11,29 +13,26 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// /// Utilities to run the "dotnet" command. /// - internal partial class DotNet : IDotNet + public partial class DotNet : IDotNet { private readonly IDotNetCliInvoker dotnetCliInvoker; - private readonly ILogger logger; private readonly TemporaryDirectory? tempWorkingDirectory; private DotNet(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, TemporaryDirectory? tempWorkingDirectory = null) { - this.logger = logger; this.tempWorkingDirectory = tempWorkingDirectory; this.dotnetCliInvoker = dotnetCliInvoker; Info(); } - private DotNet(IDependencyOptions options, ILogger logger, TemporaryDirectory tempWorkingDirectory) : this(new DotNetCliInvoker(logger, Path.Combine(options.DotNetPath ?? string.Empty, "dotnet")), logger, tempWorkingDirectory) { } + private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory) : this(new DotNetCliInvoker(logger, Path.Combine(dotNetPath ?? string.Empty, "dotnet")), logger, tempWorkingDirectory) { } internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ILogger logger) => new DotNet(dotnetCliInvoker, logger); - public static IDotNet Make(IDependencyOptions options, ILogger logger, TemporaryDirectory tempWorkingDirectory) => new DotNet(options, logger, tempWorkingDirectory); + public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory) => new DotNet(logger, dotNetPath, tempWorkingDirectory); private void Info() { - // TODO: make sure the below `dotnet` version is matching the one specified in global.json var res = dotnetCliInvoker.RunCommand("--info"); if (!res) { @@ -108,5 +107,191 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var args = $"exec {execArgs}"; return dotnetCliInvoker.RunCommand(args); } + + // The version number should be kept in sync with the version .NET version used for building the application. + public const string LatestDotNetSdkVersion = "8.0.101"; + + /// + /// Returns a script for downloading relevant versions of the + /// .NET SDK. The SDK(s) will be installed at installDir + /// (provided that the script succeeds). + /// + private static BuildScript DownloadDotNet(IBuildActions actions, ILogger logger, IEnumerable files, string tempWorkingDirectory, bool shouldCleanUp, string installDir, string? version, bool ensureDotNetAvailable) + { + if (!string.IsNullOrEmpty(version)) + // Specific version requested + return DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, [version]); + + // Download versions mentioned in `global.json` files + // See https://docs.microsoft.com/en-us/dotnet/core/tools/global-json + var versions = new List(); + + foreach (var path in files.Where(p => p.EndsWith("global.json", StringComparison.Ordinal))) + { + try + { + var o = JObject.Parse(File.ReadAllText(path)); + versions.Add((string)o?["sdk"]?["version"]!); + } + catch + { + // not a valid `global.json` file + continue; + } + } + + if (versions.Count > 0) + { + return DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, versions); + } + + if (ensureDotNetAvailable) + { + return DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, [LatestDotNetSdkVersion], needExactVersion: false); + } + + return BuildScript.Failure; + } + + /// + /// Returns a script for downloading specific .NET SDK versions, if the + /// versions are not already installed. + /// + /// See https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script. + /// + private static BuildScript DownloadDotNetVersion(IBuildActions actions, ILogger logger, string tempWorkingDirectory, bool shouldCleanUp, string path, IEnumerable versions, bool needExactVersion = true) + { + if (!versions.Any()) + { + logger.LogInfo("No .NET SDK versions requested."); + return BuildScript.Failure; + } + + return BuildScript.Bind(GetInstalledSdksScript(actions), (sdks, sdksRet) => + { + if ( + needExactVersion && + sdksRet == 0 && + // quadratic; should be OK, given that both `version` and `sdks` are expected to be small + versions.All(version => sdks.Any(sdk => sdk.StartsWith(version + " ", StringComparison.Ordinal)))) + { + // The requested SDKs are already installed, so no need to reinstall + return BuildScript.Failure; + } + else if (!needExactVersion && sdksRet == 0 && sdks.Count > 0) + { + // there's at least one SDK installed, so no need to reinstall + return BuildScript.Failure; + } + else if (!needExactVersion && sdksRet != 0) + { + logger.LogInfo("No .NET SDK found."); + } + + BuildScript prelude; + BuildScript postlude; + Func getInstall; + + if (actions.IsWindows()) + { + prelude = BuildScript.Success; + postlude = BuildScript.Success; + + getInstall = version => + { + var psCommand = $"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -Version {version} -InstallDir {path}"; + + BuildScript GetInstall(string pwsh) => + new CommandBuilder(actions). + RunCommand(pwsh). + Argument("-NoProfile"). + Argument("-ExecutionPolicy"). + Argument("unrestricted"). + Argument("-Command"). + Argument("\"" + psCommand + "\""). + Script; + + return GetInstall("pwsh") | GetInstall("powershell"); + }; + } + else + { + var dotnetInstallPath = actions.PathCombine(tempWorkingDirectory, ".dotnet", "dotnet-install.sh"); + + var downloadDotNetInstallSh = BuildScript.DownloadFile( + "https://dot.net/v1/dotnet-install.sh", + dotnetInstallPath, + e => logger.LogWarning($"Failed to download 'dotnet-install.sh': {e.Message}")); + + var chmod = new CommandBuilder(actions). + RunCommand("chmod"). + Argument("u+x"). + Argument(dotnetInstallPath); + + prelude = downloadDotNetInstallSh & chmod.Script; + postlude = shouldCleanUp ? BuildScript.DeleteFile(dotnetInstallPath) : BuildScript.Success; + + getInstall = version => new CommandBuilder(actions). + RunCommand(dotnetInstallPath). + Argument("--channel"). + Argument("release"). + Argument("--version"). + Argument(version). + Argument("--install-dir"). + Argument(path).Script; + } + + var installScript = prelude & BuildScript.Failure; + + var attempted = new HashSet(); + foreach (var version in versions) + { + if (!attempted.Add(version)) + continue; + + installScript = BuildScript.Bind(installScript, combinedExit => + { + logger.LogInfo($"Attempting to download .NET {version}"); + + // When there are multiple versions requested, we want to try to fetch them all, reporting + // a successful exit code when at least one of them succeeds + return combinedExit != 0 ? getInstall(version) : BuildScript.Bind(getInstall(version), _ => BuildScript.Success); + }); + } + + return installScript & postlude; + }); + } + + private static BuildScript GetInstalledSdksScript(IBuildActions actions) + { + var listSdks = new CommandBuilder(actions, silent: true). + RunCommand("dotnet"). + Argument("--list-sdks"); + return listSdks.Script; + } + + /// + /// Returns a script that attempts to download relevant version(s) of the + /// .NET SDK, followed by running the script generated by . + /// + /// The argument to is the path to the directory in which the + /// .NET SDK(s) were installed. + /// + public static BuildScript WithDotNet(IBuildActions actions, ILogger logger, IEnumerable files, string tempWorkingDirectory, bool shouldCleanUp, bool ensureDotNetAvailable, string? version, Func f) + { + var installDir = actions.PathCombine(tempWorkingDirectory, ".dotnet"); + var installScript = DownloadDotNet(actions, logger, files, tempWorkingDirectory, shouldCleanUp, installDir, version, ensureDotNetAvailable); + return BuildScript.Bind(installScript, installed => + { + if (installed != 0) + { + // The .NET SDK was not installed, either because the installation failed or because it was already installed. + installDir = null; + } + + return f(installDir); + }); + } } -} +} \ No newline at end of file diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs new file mode 100644 index 00000000000..65a4664e83e --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs @@ -0,0 +1,20 @@ +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + internal class EnvironmentVariableNames + { + /// + /// Controls whether to generate source files from Asp.Net Core views (`.cshtml`, `.razor`). + /// + public const string WebViewGeneration = "CODEQL_EXTRACTOR_CSHARP_BUILDLESS_EXTRACT_WEB_VIEWS"; + + /// + /// Specifies the location of .Net framework references added to the compilation. + /// + public const string DotnetFrameworkReferences = "CODEQL_EXTRACTOR_CSHARP_BUILDLESS_DOTNET_FRAMEWORK_REFERENCES"; + + /// + /// Controls whether to use framework dependencies from subfolders. + /// + public const string DotnetFrameworkReferencesUseSubfolders = "CODEQL_EXTRACTOR_CSHARP_BUILDLESS_DOTNET_FRAMEWORK_REFERENCES_USE_SUBFOLDERS"; + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileContent.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileContent.cs index d4925ecbe47..44df0bd6e04 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileContent.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileContent.cs @@ -19,11 +19,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private readonly ILogger logger; private readonly IUnsafeFileReader unsafeFileReader; private readonly IEnumerable files; - private readonly HashSet allPackages = new HashSet(); + private readonly HashSet allPackages = new HashSet(); private readonly HashSet implicitUsingNamespaces = new HashSet(); private readonly Initializer initialize; - public HashSet AllPackages + public HashSet AllPackages { get { @@ -157,7 +157,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return false; } - private void AddPackageReference(ReadOnlySpan line, string groupName, Func regex) + private void AddPackageReference(ReadOnlySpan line, string groupName, Func regex, PackageReferenceSource source) { foreach (var valueMatch in regex().EnumerateMatches(line)) { @@ -165,7 +165,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var packageName = GetGroup(line, valueMatch, groupName).ToLowerInvariant(); if (!string.IsNullOrEmpty(packageName)) { - allPackages.Add(packageName); + allPackages.Add(new PackageReference(packageName, source)); } } } @@ -181,11 +181,13 @@ namespace Semmle.Extraction.CSharp.DependencyFetching foreach (ReadOnlySpan line in unsafeFileReader.ReadLines(file)) { // Find all the packages. - AddPackageReference(line, "Include", PackageReference); - if (isPackagesConfig) { - AddPackageReference(line, "id", LegacyPackageReference); + AddPackageReference(line, "id", LegacyPackageReference, PackageReferenceSource.PackagesConfig); + } + else + { + AddPackageReference(line, "Include", PackageReference, PackageReferenceSource.SdkCsProj); } // Determine if ASP.NET is used. @@ -268,4 +270,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } } } + + public enum PackageReferenceSource + { + SdkCsProj, + PackagesConfig + } + + public record PackageReference(string Name, PackageReferenceSource PackageReferenceSource); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs index 24d92e0f068..1a1e9934e8c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs @@ -31,7 +31,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching public IEnumerable Filter(IEnumerable files) { - var filters = (Environment.GetEnvironmentVariable("LGTM_INDEX_FILTERS") ?? string.Empty).Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + var filters = (Environment.GetEnvironmentVariable("LGTM_INDEX_FILTERS") ?? string.Empty).Split(FileUtils.NewLineCharacters, StringSplitOptions.RemoveEmptyEntries); if (filters.Length == 0) { return files; @@ -55,12 +55,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } else { - logger.Log(Severity.Info, $"Invalid filter: {filter}"); + logger.LogInfo($"Invalid filter: {filter}"); continue; } var regex = new FilePattern(filterText).RegexPattern; - logger.Log(Severity.Info, $"Filtering {(include ? "in" : "out")} files matching '{regex}'. Original glob filter: '{filter}'"); + logger.LogInfo($"Filtering {(include ? "in" : "out")} files matching '{regex}'. Original glob filter: '{filter}'"); pathFilters.Add(new PathFilter(new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline), include)); } @@ -91,7 +91,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching if (!include) { - logger.Log(Severity.Info, $"Excluding '{f.FileInfo.FullName}'"); + logger.LogInfo($"Excluding '{f.FileInfo.FullName}'"); } return include; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs index 7b4a076f99f..327ff6f0792 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs @@ -1,25 +1,27 @@ using System.Collections.Generic; -using System.Linq; namespace Semmle.Extraction.CSharp.DependencyFetching { internal static class FrameworkPackageNames { + public const string LatestNetFrameworkMoniker = "net481"; + + public static string LatestNetFrameworkReferenceAssemblies { get; } = $"microsoft.netframework.referenceassemblies.{LatestNetFrameworkMoniker}"; + public static string AspNetCoreFramework { get; } = "microsoft.aspnetcore.app.ref"; public static string WindowsDesktopFramework { get; } = "microsoft.windowsdesktop.app.ref"; // The order of the packages is important. - public static string[] NetFrameworks { get; } = new string[] - { + public static string[] NetFrameworks { get; } = + [ "microsoft.netcore.app.ref", // net7.0, ... net5.0, netcoreapp3.1, netcoreapp3.0 "microsoft.netframework.referenceassemblies.", // net48, ..., net20 "netstandard.library.ref", // netstandard2.1 "netstandard.library" // netstandard2.0 - }; + ]; public static IEnumerable AllFrameworks { get; } = - NetFrameworks - .Union(new string[] { AspNetCoreFramework, WindowsDesktopFramework }); + [.. NetFrameworks, AspNetCoreFramework, WindowsDesktopFramework]; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs index 5904248b34f..d66135c1644 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs @@ -5,7 +5,7 @@ using System.Text.RegularExpressions; namespace Semmle.Extraction.CSharp.DependencyFetching { - internal interface IDotNet + public interface IDotNet { RestoreResult Restore(RestoreSettings restoreSettings); bool New(string folder); @@ -15,9 +15,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching bool Exec(string execArgs); } - internal record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? PathToNugetConfig = null, bool ForceReevaluation = false); + public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? PathToNugetConfig = null, bool ForceReevaluation = false); - internal partial record class RestoreResult(bool Success, IList Output) + public partial record class RestoreResult(bool Success, IList Output) { private readonly Lazy> assetsFilePaths = new(() => GetFirstGroupOnMatch(AssetsFileRegex(), Output)); public IEnumerable AssetsFilePaths => Success ? assetsFilePaths.Value : Array.Empty(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Razor.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Razor.cs index 598e3e7e1f7..e46d67685db 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Razor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Razor.cs @@ -71,7 +71,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var args = new StringBuilder(); args.Append($"/target:exe /generatedfilesout:\"{outputFolder}\" /out:\"{dllPath}\" /analyzerconfig:\"{analyzerConfig}\" "); - foreach (var f in Directory.GetFiles(sourceGeneratorFolder, "*.dll")) + foreach (var f in Directory.GetFiles(sourceGeneratorFolder, "*.dll", new EnumerationOptions { RecurseSubdirectories = false, MatchCasing = MatchCasing.CaseInsensitive })) { args.Append($"/analyzer:\"{f}\" "); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs index 5b6f47d22f3..a489ec504c4 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using Semmle.Util; +using Semmle.Util.Logging; namespace Semmle.Extraction.CSharp.DependencyFetching { @@ -65,7 +66,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// Locates .NET Desktop Runtimes. /// This includes Mono and Microsoft.NET. /// - private static IEnumerable DesktopRuntimes + private IEnumerable DesktopRuntimes { get { @@ -76,20 +77,19 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } var monoPath = FileUtils.FindProgramOnPath(Win32.IsWindows() ? "mono.exe" : "mono"); - var monoDirs = monoPath is not null - ? new[] { Path.GetFullPath(Path.Combine(monoPath, "..", "lib", "mono")), monoPath } - : new[] { "/usr/lib/mono", "/usr/local/mono", "/usr/local/bin/mono", @"C:\Program Files\Mono\lib\mono" }; + string[] monoDirs = monoPath is not null + ? [Path.GetFullPath(Path.Combine(monoPath, "..", "lib", "mono")), monoPath] + : ["/usr/lib/mono", "/usr/local/mono", "/usr/local/bin/mono", @"C:\Program Files\Mono\lib\mono"]; - var dir = monoDirs.FirstOrDefault(Directory.Exists); - - if (dir is not null) + var monoDir = monoDirs.FirstOrDefault(Directory.Exists); + if (monoDir is not null) { - return Directory.EnumerateDirectories(dir) - .Where(d => Char.IsDigit(Path.GetFileName(d)[0])) + return Directory.EnumerateDirectories(monoDir) + .Where(d => char.IsDigit(Path.GetFileName(d)[0])) .OrderByDescending(Path.GetFileName); } - return Enumerable.Empty(); + return []; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Program.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Program.cs index 8160bfdd3ae..12f06a58fd4 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Program.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Program.cs @@ -3,7 +3,7 @@ using Semmle.Extraction.CSharp.StubGenerator; using Semmle.Util.Logging; var logger = new ConsoleLogger(Verbosity.Info, logThreadId: false); -using var dependencyManager = new DependencyManager(".", DependencyOptions.Default, logger); +using var dependencyManager = new DependencyManager(".", logger); StubGenerator.GenerateStubs(logger, dependencyManager.ReferenceFiles, "codeql_csharp_stubs"); return 0; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs index 115a8d418b6..fb314e525c1 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs @@ -138,7 +138,7 @@ namespace Semmle.Extraction.CSharp.Standalone using var logger = new ConsoleLogger(options.Verbosity, logThreadId: true); logger.Log(Severity.Info, "Extracting C# in buildless mode"); - using var dependencyManager = new DependencyManager(options.SrcDir, options.Dependencies, logger); + using var dependencyManager = new DependencyManager(options.SrcDir, logger); if (!dependencyManager.AllSourceFiles.Any()) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs index f6e21b32bbd..2efe7704775 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs @@ -23,18 +23,6 @@ namespace Semmle.Extraction.CSharp.Standalone } } - public override bool HandleOption(string key, string value) - { - switch (key) - { - case "dotnet": - dependencies.DotNetPath = value; - return true; - default: - return base.HandleOption(key, value); - } - } - public override bool HandleArgument(string arg) { return true; @@ -51,12 +39,6 @@ namespace Semmle.Extraction.CSharp.Standalone /// public string SrcDir { get; } = Directory.GetCurrentDirectory(); - private readonly DependencyOptions dependencies = new DependencyOptions(); - /// - /// Dependency fetching related options. - /// - public IDependencyOptions Dependencies => dependencies; - /// /// Whether errors were encountered parsing the arguments. /// diff --git a/csharp/extractor/Semmle.Extraction.CSharp.StubGenerator/StubGenerator.cs b/csharp/extractor/Semmle.Extraction.CSharp.StubGenerator/StubGenerator.cs index 32ae6d25161..0f8347eb0bc 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.StubGenerator/StubGenerator.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.StubGenerator/StubGenerator.cs @@ -36,7 +36,7 @@ public static class StubGenerator references.Add((reference, path)); }); - logger.Log(Severity.Info, $"Generating stubs for {references.Count} assemblies."); + logger.LogInfo($"Generating stubs for {references.Count} assemblies."); var compilation = CSharpCompilation.Create( "stubgenerator.dll", @@ -50,7 +50,7 @@ public static class StubGenerator }); stopWatch.Stop(); - logger.Log(Severity.Info, $"Stub generation took {stopWatch.Elapsed}."); + logger.LogInfo($"Stub generation took {stopWatch.Elapsed}."); return stubPaths.ToArray(); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/CachedSymbol.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/CachedSymbol.cs index cc8357ee4ca..5c72aa4d90e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/CachedSymbol.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/CachedSymbol.cs @@ -53,6 +53,7 @@ namespace Semmle.Extraction.CSharp.Entities trapFile.type_annotation(this, Kinds.TypeAnnotation.Ref); break; case RefKind.RefReadOnly: + case RefKind.RefReadOnlyParameter: trapFile.type_annotation(this, Kinds.TypeAnnotation.ReadonlyRef); break; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs index b9682e7a183..74c4c09c0f9 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs @@ -32,9 +32,9 @@ namespace Semmle.Extraction.CSharp.Entities trapFile.constructors(this, Symbol.ContainingType.Name, ContainingType, (Constructor)OriginalDefinition); trapFile.constructor_location(this, Location); - if (IsPrimary) + if (MakeSynthetic) { - // Create a synthetic empty body for primary constructors. + // Create a synthetic empty body for primary and default constructors. Statements.SyntheticEmptyBlock.Create(Context, this, 0, Location); } @@ -49,9 +49,9 @@ namespace Semmle.Extraction.CSharp.Entities protected override void ExtractInitializers(TextWriter trapFile) { // Do not extract initializers for constructed types. - // Only extract initializers for constructors with a body and primary constructors. - if (Block is null && ExpressionBody is null && !IsPrimary || - !IsSourceDeclaration) + // Extract initializers for constructors with a body, primary constructors + // and default constructors for classes and structs declared in source code. + if (Block is null && ExpressionBody is null && !MakeSynthetic) { return; } @@ -161,6 +161,16 @@ namespace Semmle.Extraction.CSharp.Entities private bool IsPrimary => PrimaryConstructorSyntax is not null; + // This is a default constructor in a class or struct declared in source. + private bool IsDefault => + Symbol.IsImplicitlyDeclared && + Symbol.ContainingType.FromSource() && + Symbol.ContainingType.TypeKind is TypeKind.Class or TypeKind.Struct && + Symbol.ContainingType.IsSourceDeclaration() && + !Symbol.ContainingType.IsAnonymousType; + + private bool MakeSynthetic => IsPrimary || IsDefault; + [return: NotNullIfNotNull(nameof(constructor))] public static new Constructor? Create(Context cx, IMethodSymbol? constructor) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs index 04cce8a5c79..58b01891add 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs @@ -54,7 +54,7 @@ namespace Semmle.Extraction.CSharp.Entities } if (info.IsCompilerGenerated) - trapFile.expr_compiler_generated(this); + trapFile.compiler_generated(this); if (info.ExprValue is string value) trapFile.expr_value(this, value); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs index b0ef221e5e3..5843418255c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs @@ -24,7 +24,13 @@ namespace Semmle.Extraction.CSharp.Entities public enum Kind { - None, Ref, Out, Params, This, In + None = 0, + Ref = 1, + Out = 2, + Params = 3, + This = 4, + In = 5, + RefReadOnly = 6 } protected virtual int Ordinal => Symbol.Ordinal; @@ -41,6 +47,8 @@ namespace Semmle.Extraction.CSharp.Entities return Kind.Ref; case RefKind.In: return Kind.In; + case RefKind.RefReadOnlyParameter: + return Kind.RefReadOnly; default: if (Symbol.IsParams) return Kind.Params; diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs index d9b285a2410..0d7bdd31354 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs @@ -9,13 +9,18 @@ namespace Semmle.Extraction.CSharp.Entities { protected readonly TSyntax Stmt; private readonly Location location; + private readonly bool isCompilerGenerated; - protected Statement(Context cx, TSyntax stmt, Kinds.StmtKind kind, IStatementParentEntity parent, int child, Location location) + protected Statement(Context cx, TSyntax stmt, Kinds.StmtKind kind, IStatementParentEntity parent, int child, Location location, bool isCompilerGenerated = false) : base(cx, kind, parent, child) { Stmt = stmt; this.location = location; - cx.BindComments(this, location.Symbol); + this.isCompilerGenerated = isCompilerGenerated; + if (!isCompilerGenerated) + { + cx.BindComments(this, location.Symbol); + } } protected Statement(Context cx, TSyntax stmt, Kinds.StmtKind kind, IStatementParentEntity parent, int child) @@ -26,6 +31,11 @@ namespace Semmle.Extraction.CSharp.Entities base.Populate(trapFile); trapFile.stmt_location(this, location); + + if (isCompilerGenerated) + { + trapFile.compiler_generated(this); + } } public override Microsoft.CodeAnalysis.Location ReportingLocation => Stmt.GetLocation(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs index 0b292d208ff..670d338d2b3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs @@ -9,7 +9,7 @@ namespace Semmle.Extraction.CSharp.Entities.Statements internal class SyntheticEmptyBlock : Statement { private SyntheticEmptyBlock(Context cx, BlockSyntax block, IStatementParentEntity parent, int child, Location location) - : base(cx, block, StmtKind.BLOCK, parent, child, location) { } + : base(cx, block, StmtKind.BLOCK, parent, child, location, isCompilerGenerated: true) { } public static SyntheticEmptyBlock Create(Context cx, IStatementParentEntity parent, int child, Location location) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs index 5d5bc5860f4..86677f68620 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs @@ -386,7 +386,7 @@ namespace Semmle.Extraction.CSharp if (compilerArguments.GeneratedFilesOutputDirectory is not null) { - paths.AddRange(Directory.GetFiles(compilerArguments.GeneratedFilesOutputDirectory, "*.cs", SearchOption.AllDirectories)); + paths.AddRange(Directory.GetFiles(compilerArguments.GeneratedFilesOutputDirectory, "*.cs", new EnumerationOptions { RecurseSubdirectories = true, MatchCasing = MatchCasing.CaseInsensitive })); } return ReadSyntaxTrees( diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs b/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs index 6f61119eb77..71ed85cb201 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs @@ -164,9 +164,6 @@ namespace Semmle.Extraction.CSharp internal static void expr_call(this TextWriter trapFile, Expression expr, Method target) => trapFile.WriteTuple("expr_call", expr, target); - internal static void expr_compiler_generated(this TextWriter trapFile, Expression expr) => - trapFile.WriteTuple("expr_compiler_generated", expr); - internal static void expr_flowstate(this TextWriter trapFile, Expression expr, int flowState) => trapFile.WriteTuple("expr_flowstate", expr, flowState); diff --git a/csharp/extractor/Semmle.Extraction.Tests/FileContent.cs b/csharp/extractor/Semmle.Extraction.Tests/FileContent.cs index 6dcee31024a..cbbf6ed4d24 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FileContent.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FileContent.cs @@ -55,9 +55,9 @@ namespace Semmle.Extraction.Tests // Verify Assert.False(useAspNetDlls); Assert.Equal(3, allPackages.Count); - Assert.Contains("DotNetAnalyzers.DocumentationAnalyzers".ToLowerInvariant(), allPackages); - Assert.Contains("Microsoft.CodeAnalysis.NetAnalyzers".ToLowerInvariant(), allPackages); - Assert.Contains("StyleCop.Analyzers".ToLowerInvariant(), allPackages); + Assert.Contains(new PackageReference("DotNetAnalyzers.DocumentationAnalyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); + Assert.Contains(new PackageReference("Microsoft.CodeAnalysis.NetAnalyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); + Assert.Contains(new PackageReference("StyleCop.Analyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); } [Fact] @@ -80,8 +80,8 @@ namespace Semmle.Extraction.Tests // Verify Assert.True(useAspNetDlls); Assert.Equal(2, allPackages.Count); - Assert.Contains("Microsoft.CodeAnalysis.NetAnalyzers".ToLowerInvariant(), allPackages); - Assert.Contains("StyleCop.Analyzers".ToLowerInvariant(), allPackages); + Assert.Contains(new PackageReference("Microsoft.CodeAnalysis.NetAnalyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); + Assert.Contains(new PackageReference("StyleCop.Analyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); } private static void CsProjSettingsTest(string line, bool expected, Func func) diff --git a/csharp/extractor/Semmle.Extraction/CsProjFile.cs b/csharp/extractor/Semmle.Extraction/CsProjFile.cs index 10deb2883a3..bed9d746996 100644 --- a/csharp/extractor/Semmle.Extraction/CsProjFile.cs +++ b/csharp/extractor/Semmle.Extraction/CsProjFile.cs @@ -112,7 +112,7 @@ namespace Semmle.Extraction .Where(s => s is not null) ?? Enumerable.Empty(); - var additionalCsFiles = System.IO.Directory.GetFiles(directoryName, "*.cs", SearchOption.AllDirectories); + var additionalCsFiles = System.IO.Directory.GetFiles(directoryName, "*.cs", new EnumerationOptions { RecurseSubdirectories = true, MatchCasing = MatchCasing.CaseInsensitive }); var projectReferences = root .SelectNodes("/Project/ItemGroup/ProjectReference/@Include", mgr) diff --git a/csharp/extractor/Semmle.Extraction/Extractor/Extractor.cs b/csharp/extractor/Semmle.Extraction/Extractor/Extractor.cs index 362b7910c56..db0b30fb2b8 100644 --- a/csharp/extractor/Semmle.Extraction/Extractor/Extractor.cs +++ b/csharp/extractor/Semmle.Extraction/Extractor/Extractor.cs @@ -43,7 +43,7 @@ namespace Semmle.Extraction ++Errors; if (Errors == maxErrors) { - Logger.Log(Severity.Info, " Stopping logging after {0} errors", Errors); + Logger.LogInfo(" Stopping logging after {0} errors", Errors); } } diff --git a/csharp/extractor/Semmle.Extraction/TrapWriter.cs b/csharp/extractor/Semmle.Extraction/TrapWriter.cs index 7f2c38466c0..aff9983dd7c 100644 --- a/csharp/extractor/Semmle.Extraction/TrapWriter.cs +++ b/csharp/extractor/Semmle.Extraction/TrapWriter.cs @@ -227,7 +227,7 @@ namespace Semmle.Extraction { // If this happened, it was probably because the same file was compiled multiple times. // In any case, this is not a fatal error. - logger.Log(Severity.Warning, "Problem archiving " + dest + ": " + ex); + logger.LogWarning("Problem archiving " + dest + ": " + ex); } } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildActions.cs b/csharp/extractor/Semmle.Util/BuildActions.cs similarity index 92% rename from csharp/autobuilder/Semmle.Autobuild.Shared/BuildActions.cs rename to csharp/extractor/Semmle.Util/BuildActions.cs index 1788f525367..e3a4e7ecafe 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildActions.cs +++ b/csharp/extractor/Semmle.Util/BuildActions.cs @@ -8,7 +8,7 @@ using System.Runtime.InteropServices; using System.Xml; using Semmle.Util; -namespace Semmle.Autobuild.Shared +namespace Semmle.Util { public delegate void BuildOutputHandler(string? data); @@ -287,4 +287,30 @@ namespace Semmle.Autobuild.Shared public static IBuildActions Instance { get; } = new SystemBuildActions(); } + + public static class BuildActionExtensions + { + private static void FindFiles(this IBuildActions actions, string dir, int depth, int? maxDepth, IList<(string, int)> results) + { + foreach (var f in actions.EnumerateFiles(dir)) + { + results.Add((f, depth)); + } + + if (depth < maxDepth) + { + foreach (var d in actions.EnumerateDirectories(dir)) + { + actions.FindFiles(d, depth + 1, maxDepth, results); + } + } + } + + public static (string path, int depth)[] FindFiles(this IBuildActions actions, string dir, int? maxDepth) + { + var results = new List<(string, int)>(); + actions.FindFiles(dir, 0, maxDepth, results); + return results.OrderBy(f => f.Item2).ToArray(); + } + } } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs b/csharp/extractor/Semmle.Util/BuildScript.cs similarity index 99% rename from csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs rename to csharp/extractor/Semmle.Util/BuildScript.cs index 573c6f3043b..9092463afda 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs +++ b/csharp/extractor/Semmle.Util/BuildScript.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.IO; -namespace Semmle.Autobuild.Shared +namespace Semmle.Util { /// /// A build script. diff --git a/csharp/extractor/Semmle.Util/CanonicalPathCache.cs b/csharp/extractor/Semmle.Util/CanonicalPathCache.cs index 87fcb3717bd..e7e4c07c36e 100644 --- a/csharp/extractor/Semmle.Util/CanonicalPathCache.cs +++ b/csharp/extractor/Semmle.Util/CanonicalPathCache.cs @@ -268,7 +268,7 @@ namespace Semmle.Util catch // lgtm[cs/catch-of-all-exceptions] { // Failed to late-bind a suitable library. - logger.Log(Severity.Warning, "Preserving symlinks in canonical paths"); + logger.LogWarning("Preserving symlinks in canonical paths"); pathStrategy = new QueryDirectoryStrategy(); } break; diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/CommandBuilder.cs b/csharp/extractor/Semmle.Util/CommandBuilder.cs similarity index 99% rename from csharp/autobuilder/Semmle.Autobuild.Shared/CommandBuilder.cs rename to csharp/extractor/Semmle.Util/CommandBuilder.cs index 263f35f2fff..3d8f907f866 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/CommandBuilder.cs +++ b/csharp/extractor/Semmle.Util/CommandBuilder.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -namespace Semmle.Autobuild.Shared +namespace Semmle.Util { /// /// Utility to construct a build command. diff --git a/csharp/extractor/Semmle.Util/FileUtils.cs b/csharp/extractor/Semmle.Util/FileUtils.cs index 3315c3e705e..094c4da3338 100644 --- a/csharp/extractor/Semmle.Util/FileUtils.cs +++ b/csharp/extractor/Semmle.Util/FileUtils.cs @@ -13,6 +13,8 @@ namespace Semmle.Util { public const string NugetExeUrl = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"; + public static readonly char[] NewLineCharacters = ['\r', '\n']; + public static string ConvertToWindows(string path) { return path.Replace('/', '\\'); @@ -131,14 +133,14 @@ namespace Semmle.Util var directoryName = Path.GetDirectoryName(nested); if (directoryName is null) { - logger.Log(Severity.Warning, "Failed to get directory name from path '" + nested + "'."); + logger.LogWarning("Failed to get directory name from path '" + nested + "'."); throw new InvalidOperationException(); } Directory.CreateDirectory(directoryName); } catch (PathTooLongException) { - logger.Log(Severity.Warning, "Failed to create parent directory of '" + nested + "': Path too long."); + logger.LogWarning("Failed to create parent directory of '" + nested + "': Path too long."); throw; } return nested; diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 190b83b0f25..82eacfc84f7 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.10 + +No user-facing changes. + ## 1.7.9 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.10.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.10.md new file mode 100644 index 00000000000..8e8007d8475 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.10.md @@ -0,0 +1,3 @@ +## 1.7.10 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 678da6bc37e..31c7fe07020 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.9 +lastReleaseVersion: 1.7.10 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 1c28b3a7baf..ee993bed0c9 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.9 +version: 1.7.10 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 190b83b0f25..82eacfc84f7 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.10 + +No user-facing changes. + ## 1.7.9 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.10.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.10.md new file mode 100644 index 00000000000..8e8007d8475 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.10.md @@ -0,0 +1,3 @@ +## 1.7.10 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 678da6bc37e..31c7fe07020 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.9 +lastReleaseVersion: 1.7.10 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index fb4aa233e9b..1f421754fc8 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.9 +version: 1.7.10 groups: - csharp - solorigate diff --git a/csharp/ql/consistency-queries/DataFlowConsistency.ql b/csharp/ql/consistency-queries/DataFlowConsistency.ql index 0f9dead6b77..59e5953f31f 100644 --- a/csharp/ql/consistency-queries/DataFlowConsistency.ql +++ b/csharp/ql/consistency-queries/DataFlowConsistency.ql @@ -1,5 +1,6 @@ import csharp import cil +private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import semmle.code.csharp.dataflow.internal.DataFlowImplSpecific private import semmle.code.csharp.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.internal.DataFlowImplConsistency @@ -7,13 +8,18 @@ private import codeql.dataflow.internal.DataFlowImplConsistency private module Input implements InputSig { private import CsharpDataFlow + private predicate isStaticAssignable(Assignable a) { a.(Modifiable).isStatic() } + + predicate uniqueEnclosingCallableExclude(Node node) { + // TODO: Remove once static initializers are folded into the + // static constructors + isStaticAssignable(ControlFlowGraphImpl::getNodeCfgScope(node.getControlFlowNode())) + } + predicate uniqueCallEnclosingCallableExclude(DataFlowCall call) { // TODO: Remove once static initializers are folded into the // static constructors - exists(ControlFlow::Node cfn | - cfn.getAstNode() = any(FieldOrProperty f | f.isStatic()).getAChild+() and - cfn = call.getControlFlowNode() - ) + isStaticAssignable(ControlFlowGraphImpl::getNodeCfgScope(call.getControlFlowNode())) } predicate uniqueNodeLocationExclude(Node n) { @@ -41,8 +47,6 @@ private module Input implements InputSig { or not exists(LocalFlow::getAPostUpdateNodeForArg(n.getControlFlowNode())) or - n instanceof ImplicitCapturedArgumentNode - or n instanceof ParamsArgumentNode or n.asExpr() instanceof CIL::Expr @@ -98,8 +102,6 @@ private module Input implements InputSig { not split = cfn.getASplit() ) or - call instanceof TransitiveCapturedDataFlowCall - or call.(NonDelegateDataFlowCall).getDispatchCall().isReflection() ) } diff --git a/csharp/ql/consistency-queries/VariableCaptureConsistency.ql b/csharp/ql/consistency-queries/VariableCaptureConsistency.ql new file mode 100644 index 00000000000..927741f07bf --- /dev/null +++ b/csharp/ql/consistency-queries/VariableCaptureConsistency.ql @@ -0,0 +1,17 @@ +import csharp +import semmle.code.csharp.dataflow.internal.DataFlowPrivate::VariableCapture::Flow::ConsistencyChecks +private import semmle.code.csharp.dataflow.internal.DataFlowPrivate::VariableCapture::Flow::ConsistencyChecks as ConsistencyChecks +private import semmle.code.csharp.controlflow.BasicBlocks +private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl + +query predicate uniqueEnclosingCallable(BasicBlock bb, string msg) { + ConsistencyChecks::uniqueEnclosingCallable(bb, msg) and + getNodeCfgScope(bb.getFirstNode()) instanceof Callable +} + +query predicate consistencyOverview(string msg, int n) { none() } + +query predicate uniqueCallableLocation(Callable c, string msg) { + ConsistencyChecks::uniqueCallableLocation(c, msg) and + count(c.getBody()) = 1 +} diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/test.py b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/test.py index b1f535c1727..64b9f13b36b 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/test.py +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/test.py @@ -1,4 +1,4 @@ import os from create_database_utils import * -run_codeql_database_create(lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create(lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/test.py b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/test.py index c00c6f6e2e8..3e00c972b00 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/test.py +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/test.py @@ -1,5 +1,5 @@ import os from create_database_utils import * -os.environ['CODEQL_EXTRACTOR_CSHARP_STANDALONE_EXTRACT_WEB_VIEWS'] = 'false' -run_codeql_database_create(lang="csharp", extra_args=["--extractor-option=buildless=true"]) +os.environ['CODEQL_EXTRACTOR_CSHARP_BUILDLESS_EXTRACT_WEB_VIEWS'] = 'false' +run_codeql_database_create(lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/test.py b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/test.py index b1f535c1727..64b9f13b36b 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/test.py +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/test.py @@ -1,4 +1,4 @@ import os from create_database_utils import * -run_codeql_database_create(lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create(lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/test.py b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/test.py index b1f535c1727..64b9f13b36b 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/test.py +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/test.py @@ -1,4 +1,4 @@ import os from create_database_utils import * -run_codeql_database_create(lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create(lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_build/Program.cs b/csharp/ql/integration-tests/all-platforms/dotnet_build/Program.cs index e9708d0b5d2..bd44629f7e2 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_build/Program.cs +++ b/csharp/ql/integration-tests/all-platforms/dotnet_build/Program.cs @@ -1 +1 @@ -Console.WriteLine(args[0]); +Console.WriteLine($"{string.Join(",", args)}"); diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_build/test.py b/csharp/ql/integration-tests/all-platforms/dotnet_build/test.py index 8bc8d33ba1d..6680a708e70 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_build/test.py +++ b/csharp/ql/integration-tests/all-platforms/dotnet_build/test.py @@ -1,5 +1,16 @@ from create_database_utils import * from diagnostics_test_utils import * -run_codeql_database_create(['dotnet build'], db=None, lang="csharp") -check_diagnostics() +def check_build_out(msg, s): + if "[build-stdout] " + msg not in s: + raise Exception("The C# tracer did not interpret the dotnet path-to-application command correctly.") + +run_codeql_database_create(['dotnet build'], test_db="test1-db", lang="csharp") +check_diagnostics(test_db="test1-db") + +# This test checks that we don't inject any flags when running the application using `dotnet` +my_dir = "my_program" +my_abs_path = os.path.abspath(f"{my_dir}/dotnet_build.dll") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test1-db', 'dotnet build -o my_program', f'dotnet {my_abs_path} build is not a subcommand'], "test2-db", "csharp") +check_build_out("build,is,not,a,subcommand", s) +check_diagnostics(test_db="test2-db") 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 ef306b1842b..d1a44bdb1fe 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py +++ b/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py @@ -1,65 +1,57 @@ from create_database_utils import * from diagnostics_test_utils import * -def run_codeql_database_create_stdout(args, dbname): - stdout = open(dbname + "file.txt", 'w+') - run_codeql_database_create(args, test_db=dbname, db=None, stdout=stdout, lang="csharp") - stdout.seek(0) - s = stdout.read() - stdout.close() - return s - def check_build_out(msg, s): if "[build-stdout] " + msg not in s: - raise Exception("The C# extractor did not interpret the 'dotnet run' command correctly") + raise Exception("The C# tracer did not interpret the 'dotnet run' command correctly") # no arguments -s = run_codeql_database_create_stdout(['dotnet run'], "test-db") +s = run_codeql_database_create_stdout(['dotnet run'], "test-db", "csharp") check_build_out("Default reply", s) check_diagnostics() # no arguments, but `--` -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test-db', 'dotnet run --'], "test2-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test-db', 'dotnet run --'], "test2-db", "csharp") check_build_out("Default reply", s) check_diagnostics(test_db="test2-db") # one argument, no `--` -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test2-db', 'dotnet run hello'], "test3-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test2-db', 'dotnet run hello'], "test3-db", "csharp") check_build_out("Default reply", s) check_diagnostics(test_db="test3-db") # one argument, but `--` -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test3-db', 'dotnet run -- hello'], "test4-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test3-db', 'dotnet run -- hello'], "test4-db", "csharp") check_build_out("Default reply", s) check_diagnostics(test_db="test4-db") # two arguments, no `--` -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test4-db', 'dotnet run hello world'], "test5-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test4-db', 'dotnet run hello world'], "test5-db", "csharp") check_build_out("hello, world", s) check_diagnostics(test_db="test5-db") # two arguments, and `--` -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test5-db', 'dotnet run -- hello world'], "test6-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test5-db', 'dotnet run -- hello world'], "test6-db", "csharp") check_build_out("hello, world", s) check_diagnostics(test_db="test6-db") # shared compilation enabled; tracer should override by changing the command # to `dotnet run -p:UseSharedCompilation=true -p:UseSharedCompilation=false -- hello world` -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test6-db', 'dotnet run -p:UseSharedCompilation=true -- hello world'], "test7-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test6-db', 'dotnet run -p:UseSharedCompilation=true -- hello world'], "test7-db", "csharp") check_build_out("hello, world", s) check_diagnostics(test_db="test7-db") # option passed into `dotnet run` -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test7-db', 'dotnet build', 'dotnet run --no-build hello world'], "test8-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test7-db', 'dotnet build', 'dotnet run --no-build hello world'], "test8-db", "csharp") 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") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test8-db', 'dotnet run "hello world part1" part2'], "test9-db", "csharp") check_build_out("hello world part1, part2", s) check_diagnostics(test_db="test9-db") # two arguments, no '--' (second argument quoted) and using dotnet to execute dotnet -s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test9-db', 'dotnet dotnet run part1 "hello world part2"'], "test10-db") +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test9-db', 'dotnet dotnet run part1 "hello world part2"'], "test10-db", "csharp") check_build_out("part1, hello world part2", s) check_diagnostics(test_db="test10-db") diff --git a/csharp/ql/integration-tests/all-platforms/standalone/test.py b/csharp/ql/integration-tests/all-platforms/standalone/test.py index 72f47e38d22..a17966e148a 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone/test.py +++ b/csharp/ql/integration-tests/all-platforms/standalone/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.expected b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.expected index fe35f504546..e845d165068 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.expected @@ -1,235 +1,235 @@ -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Accessibility.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/CustomMarshalers.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/Microsoft.Win32.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.AppContext.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.Concurrent.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.NonGeneric.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.Specialized.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.Annotations.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.EventBasedAsync.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.TypeConverter.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Console.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Data.Common.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Contracts.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Debug.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.FileVersionInfo.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Process.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.StackTrace.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.TextWriterTraceListener.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Tools.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.TraceSource.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Drawing.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Dynamic.Runtime.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Globalization.Calendars.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Globalization.Extensions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Globalization.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.Compression.ZipFile.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.DriveInfo.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Watcher.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.IsolatedStorage.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.MemoryMappedFiles.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.Pipes.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.UnmanagedMemoryStream.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.Expressions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.Parallel.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.Queryable.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Http.Rtc.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.NameResolution.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.NetworkInformation.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Ping.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Requests.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Security.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Sockets.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.WebHeaderCollection.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.WebSockets.Client.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.WebSockets.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ObjectModel.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Emit.ILGeneration.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Emit.Lightweight.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Emit.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Extensions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Resources.Reader.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Resources.ResourceManager.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Resources.Writer.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.CompilerServices.VisualC.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Extensions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Handles.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.RuntimeInformation.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.WindowsRuntime.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Numerics.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Formatters.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Json.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Xml.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Claims.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Algorithms.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Csp.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Encoding.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.X509Certificates.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Principal.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.SecureString.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Duplex.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Http.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.NetTcp.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Primitives.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Security.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Text.Encoding.Extensions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Text.Encoding.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Text.RegularExpressions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Overlapped.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Tasks.Parallel.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Tasks.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Thread.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.ThreadPool.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Timer.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ValueTuple.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.ReaderWriter.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XDocument.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XPath.XDocument.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XPath.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XmlDocument.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XmlSerializer.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/netstandard.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/ISymWrapper.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Activities.Build.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Conversion.v4.0.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Engine.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Framework.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Tasks.v4.0.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Utilities.v4.0.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.CSharp.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.JScript.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.Data.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualBasic.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualC.STLCLR.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualC.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationBuildTasks.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationCore.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Aero2.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Aero.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.AeroLite.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Classic.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Luna.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Royale.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/ReachFramework.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.Core.Presentation.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.DurableInstancing.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.Presentation.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.AddIn.Contract.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.AddIn.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ComponentModel.Composition.Registration.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ComponentModel.Composition.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ComponentModel.DataAnnotations.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Configuration.Install.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Configuration.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Core.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.DataSetExtensions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Entity.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Entity.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Linq.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.OracleClient.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Services.Client.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Services.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Services.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.SqlXml.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Deployment.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Device.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Diagnostics.Tracing.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.DirectoryServices.AccountManagement.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.DirectoryServices.Protocols.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.DirectoryServices.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Drawing.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Drawing.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Dynamic.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.EnterpriseServices.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IO.Compression.FileSystem.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IO.Compression.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IO.Log.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IdentityModel.Selectors.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IdentityModel.Services.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IdentityModel.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Management.Instrumentation.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Management.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Messaging.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Net.Http.WebRequest.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Net.Http.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Net.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Numerics.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Printing.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Reflection.Context.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Caching.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.DurableInstancing.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Remoting.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Serialization.Formatters.Soap.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Serialization.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Security.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Activation.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Activities.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Channels.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Discovery.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Routing.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Web.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceProcess.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Speech.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Transactions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Abstractions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.ApplicationServices.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DataVisualization.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DataVisualization.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DynamicData.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DynamicData.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Entity.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Entity.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Extensions.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Extensions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Mobile.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.RegularExpressions.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Routing.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Services.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Controls.Ribbon.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.Design.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Forms.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Input.Manipulations.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Presentation.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Workflow.Activities.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Workflow.ComponentModel.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Workflow.Runtime.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.WorkflowServices.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xaml.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xml.Linq.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xml.Serialization.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xml.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationClient.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationClientsideProviders.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationProvider.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationTypes.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/WindowsBase.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/WindowsFormsIntegration.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/XamlBuildTask.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/mscorlib.dll | -| /microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/sysglobl.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Accessibility.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/CustomMarshalers.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/Microsoft.Win32.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.AppContext.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.Concurrent.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.NonGeneric.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.Specialized.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Collections.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.Annotations.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.EventBasedAsync.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.TypeConverter.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ComponentModel.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Console.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Data.Common.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Contracts.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Debug.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.FileVersionInfo.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Process.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.StackTrace.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.TextWriterTraceListener.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.Tools.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Diagnostics.TraceSource.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Drawing.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Dynamic.Runtime.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Globalization.Calendars.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Globalization.Extensions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Globalization.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.Compression.ZipFile.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.DriveInfo.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Watcher.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.FileSystem.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.IsolatedStorage.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.MemoryMappedFiles.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.Pipes.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.UnmanagedMemoryStream.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.IO.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.Expressions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.Parallel.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.Queryable.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Linq.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Http.Rtc.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.NameResolution.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.NetworkInformation.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Ping.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Requests.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Security.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.Sockets.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.WebHeaderCollection.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.WebSockets.Client.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Net.WebSockets.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ObjectModel.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Emit.ILGeneration.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Emit.Lightweight.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Emit.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Extensions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Reflection.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Resources.Reader.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Resources.ResourceManager.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Resources.Writer.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.CompilerServices.VisualC.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Extensions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Handles.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.RuntimeInformation.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.WindowsRuntime.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Numerics.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Formatters.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Json.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Xml.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Runtime.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Claims.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Algorithms.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Csp.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Encoding.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Cryptography.X509Certificates.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.Principal.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Security.SecureString.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Duplex.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Http.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.NetTcp.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Primitives.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ServiceModel.Security.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Text.Encoding.Extensions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Text.Encoding.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Text.RegularExpressions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Overlapped.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Tasks.Parallel.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Tasks.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Thread.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.ThreadPool.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.Timer.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Threading.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.ValueTuple.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.ReaderWriter.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XDocument.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XPath.XDocument.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XPath.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XmlDocument.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/System.Xml.XmlSerializer.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Facades/netstandard.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/ISymWrapper.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Activities.Build.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Conversion.v4.0.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Engine.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Framework.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Tasks.v4.0.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.Utilities.v4.0.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.Build.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.CSharp.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.JScript.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.Data.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualBasic.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualC.STLCLR.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/Microsoft.VisualC.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationBuildTasks.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationCore.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Aero2.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Aero.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.AeroLite.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Classic.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Luna.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.Royale.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/PresentationFramework.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/ReachFramework.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.Core.Presentation.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.DurableInstancing.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.Presentation.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Activities.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.AddIn.Contract.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.AddIn.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ComponentModel.Composition.Registration.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ComponentModel.Composition.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ComponentModel.DataAnnotations.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Configuration.Install.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Configuration.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Core.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.DataSetExtensions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Entity.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Entity.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Linq.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.OracleClient.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Services.Client.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Services.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.Services.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.SqlXml.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Data.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Deployment.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Device.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Diagnostics.Tracing.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.DirectoryServices.AccountManagement.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.DirectoryServices.Protocols.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.DirectoryServices.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Drawing.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Drawing.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Dynamic.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.EnterpriseServices.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IO.Compression.FileSystem.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IO.Compression.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IO.Log.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IdentityModel.Selectors.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IdentityModel.Services.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.IdentityModel.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Management.Instrumentation.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Management.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Messaging.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Net.Http.WebRequest.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Net.Http.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Net.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Numerics.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Printing.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Reflection.Context.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Caching.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.DurableInstancing.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Remoting.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Serialization.Formatters.Soap.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Runtime.Serialization.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Security.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Activation.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Activities.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Channels.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Discovery.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Routing.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.Web.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceModel.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.ServiceProcess.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Speech.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Transactions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Abstractions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.ApplicationServices.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DataVisualization.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DataVisualization.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DynamicData.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.DynamicData.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Entity.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Entity.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Extensions.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Extensions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Mobile.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.RegularExpressions.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Routing.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.Services.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Web.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Controls.Ribbon.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.Design.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Forms.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Input.Manipulations.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.Presentation.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Windows.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Workflow.Activities.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Workflow.ComponentModel.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Workflow.Runtime.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.WorkflowServices.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xaml.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xml.Linq.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xml.Serialization.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.Xml.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/System.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationClient.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationClientsideProviders.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationProvider.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/UIAutomationTypes.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/WindowsBase.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/WindowsFormsIntegration.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/XamlBuildTask.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/mscorlib.dll | +| [...]/microsoft.netframework.referenceassemblies.net48/1.0.3/build/.NETFramework/v4.8/sysglobl.dll | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.ql b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.ql index 82cea3528a6..b78ceee2d8f 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.ql +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/Assemblies.ql @@ -4,8 +4,9 @@ private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | result = - s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + - "/packages".length(), s.length()) + "[...]" + + s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + + "/packages".length(), s.length()) or result = s and not exists(s.indexOf("test-db/working/")) diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/test.py b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/test.py index 72f47e38d22..a17966e148a 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/test.py +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/linux-only/standalone_dependencies_non_utf8_filename/test.py b/csharp/ql/integration-tests/linux-only/standalone_dependencies_non_utf8_filename/test.py index 7173ed4c6c2..c372671b20b 100644 --- a/csharp/ql/integration-tests/linux-only/standalone_dependencies_non_utf8_filename/test.py +++ b/csharp/ql/integration-tests/linux-only/standalone_dependencies_non_utf8_filename/test.py @@ -5,4 +5,4 @@ path = b'\xd2abcd.cs' with open(path, 'w') as file: file.write('class X { }\n') -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.expected index 743b88b51cc..2d54c0155a4 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.expected @@ -1,166 +1,166 @@ -| /avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll | -| /microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.CSharp.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Core.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.AppContext.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Buffers.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Concurrent.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Immutable.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.NonGeneric.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Specialized.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Annotations.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.DataAnnotations.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.EventBasedAsync.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.TypeConverter.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Configuration.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Console.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Core.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.Common.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.DataSetExtensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Contracts.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Debug.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.DiagnosticSource.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.FileVersionInfo.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Process.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.StackTrace.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TextWriterTraceListener.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tools.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TraceSource.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tracing.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Dynamic.Runtime.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Asn1.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Tar.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Calendars.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.Brotli.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.FileSystem.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.ZipFile.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.DriveInfo.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Watcher.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.IsolatedStorage.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.MemoryMappedFiles.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.UnmanagedMemoryStream.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Expressions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Parallel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Queryable.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Memory.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.HttpListener.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Mail.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NameResolution.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NetworkInformation.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Ping.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Quic.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Requests.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Security.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.ServicePoint.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Sockets.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebClient.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebHeaderCollection.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebProxy.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.Client.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.Vectors.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ObjectModel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.DispatchProxy.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.ILGeneration.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.Lightweight.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Metadata.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.TypeExtensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Reader.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.ResourceManager.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Writer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.Unsafe.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.VisualC.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Handles.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.JavaScript.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.RuntimeInformation.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Intrinsics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Loader.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Numerics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Formatters.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Xml.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Claims.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Algorithms.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Cng.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Csp.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Encoding.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.OpenSsl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.X509Certificates.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.Windows.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.SecureString.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceModel.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceProcess.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.CodePages.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encodings.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.RegularExpressions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Channels.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Overlapped.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Dataflow.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Parallel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Thread.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.ThreadPool.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Timer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.Local.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ValueTuple.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.HttpUtility.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Windows.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Linq.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.ReaderWriter.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Serialization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.XDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlSerializer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/WindowsBase.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/mscorlib.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/netstandard.dll | -| /newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll | +| [...]/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll | +| [...]/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.CSharp.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Core.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.AppContext.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Buffers.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Concurrent.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Immutable.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.NonGeneric.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Specialized.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Annotations.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.DataAnnotations.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.EventBasedAsync.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.TypeConverter.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Configuration.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Console.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Core.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.Common.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.DataSetExtensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Contracts.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Debug.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.DiagnosticSource.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.FileVersionInfo.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Process.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.StackTrace.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TextWriterTraceListener.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tools.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TraceSource.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tracing.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Dynamic.Runtime.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Asn1.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Tar.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Calendars.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.Brotli.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.FileSystem.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.ZipFile.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.DriveInfo.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Watcher.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.IsolatedStorage.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.MemoryMappedFiles.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.UnmanagedMemoryStream.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Expressions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Parallel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Queryable.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Memory.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.HttpListener.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Mail.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NameResolution.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NetworkInformation.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Ping.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Quic.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Requests.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Security.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.ServicePoint.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Sockets.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebClient.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebHeaderCollection.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebProxy.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.Client.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.Vectors.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ObjectModel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.DispatchProxy.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.ILGeneration.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.Lightweight.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Metadata.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.TypeExtensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Reader.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.ResourceManager.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Writer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.Unsafe.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.VisualC.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Handles.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.JavaScript.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.RuntimeInformation.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Intrinsics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Loader.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Numerics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Formatters.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Xml.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Claims.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Algorithms.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Cng.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Csp.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Encoding.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.OpenSsl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.X509Certificates.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.Windows.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.SecureString.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceModel.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceProcess.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.CodePages.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encodings.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.RegularExpressions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Channels.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Overlapped.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Dataflow.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Parallel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Thread.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.ThreadPool.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Timer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.Local.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ValueTuple.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.HttpUtility.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Windows.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Linq.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.ReaderWriter.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Serialization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.XDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlSerializer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/WindowsBase.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/mscorlib.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/netstandard.dll | +| [...]/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll | diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.ql b/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.ql index 82cea3528a6..b78ceee2d8f 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.ql +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies/Assemblies.ql @@ -4,8 +4,9 @@ private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | result = - s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + - "/packages".length(), s.length()) + "[...]" + + s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + + "/packages".length(), s.length()) or result = s and not exists(s.indexOf("test-db/working/")) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies/test.py b/csharp/ql/integration-tests/posix-only/standalone_dependencies/test.py index 72f47e38d22..a17966e148a 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies/test.py +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.expected b/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.expected index 7dca814564d..c48fe98ac96 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.expected +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.expected @@ -1,163 +1,163 @@ -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.CSharp.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Core.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.AppContext.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Buffers.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Concurrent.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Immutable.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.NonGeneric.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Specialized.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Annotations.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.DataAnnotations.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.EventBasedAsync.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.TypeConverter.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Configuration.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Console.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Core.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.Common.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.DataSetExtensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Contracts.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Debug.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.DiagnosticSource.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.FileVersionInfo.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Process.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.StackTrace.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TextWriterTraceListener.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tools.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TraceSource.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tracing.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Dynamic.Runtime.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Asn1.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Tar.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Calendars.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.Brotli.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.FileSystem.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.ZipFile.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.DriveInfo.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Watcher.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.IsolatedStorage.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.MemoryMappedFiles.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.UnmanagedMemoryStream.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Expressions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Parallel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Queryable.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Memory.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.HttpListener.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Mail.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NameResolution.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NetworkInformation.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Ping.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Quic.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Requests.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Security.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.ServicePoint.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Sockets.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebClient.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebHeaderCollection.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebProxy.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.Client.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.Vectors.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ObjectModel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.DispatchProxy.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.ILGeneration.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.Lightweight.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Metadata.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.TypeExtensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Reader.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.ResourceManager.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Writer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.Unsafe.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.VisualC.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Handles.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.JavaScript.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.RuntimeInformation.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Intrinsics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Loader.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Numerics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Formatters.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Xml.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Claims.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Algorithms.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Cng.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Csp.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Encoding.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.OpenSsl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.X509Certificates.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.Windows.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.SecureString.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceModel.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceProcess.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.CodePages.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encodings.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.RegularExpressions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Channels.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Overlapped.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Dataflow.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Parallel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Thread.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.ThreadPool.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Timer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.Local.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ValueTuple.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.HttpUtility.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Windows.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Linq.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.ReaderWriter.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Serialization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.XDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlSerializer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/WindowsBase.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/mscorlib.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/netstandard.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.CSharp.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Core.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.AppContext.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Buffers.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Concurrent.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Immutable.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.NonGeneric.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Specialized.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Annotations.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.DataAnnotations.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.EventBasedAsync.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.TypeConverter.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Configuration.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Console.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Core.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.Common.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.DataSetExtensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Contracts.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Debug.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.DiagnosticSource.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.FileVersionInfo.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Process.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.StackTrace.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TextWriterTraceListener.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tools.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TraceSource.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tracing.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Dynamic.Runtime.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Asn1.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Tar.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Calendars.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.Brotli.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.FileSystem.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.ZipFile.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.DriveInfo.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Watcher.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.IsolatedStorage.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.MemoryMappedFiles.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.UnmanagedMemoryStream.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Expressions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Parallel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Queryable.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Memory.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.HttpListener.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Mail.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NameResolution.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NetworkInformation.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Ping.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Quic.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Requests.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Security.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.ServicePoint.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Sockets.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebClient.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebHeaderCollection.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebProxy.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.Client.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.Vectors.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ObjectModel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.DispatchProxy.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.ILGeneration.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.Lightweight.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Metadata.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.TypeExtensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Reader.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.ResourceManager.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Writer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.Unsafe.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.VisualC.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Handles.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.JavaScript.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.RuntimeInformation.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Intrinsics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Loader.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Numerics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Formatters.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Xml.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Claims.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Algorithms.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Cng.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Csp.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Encoding.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.OpenSsl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.X509Certificates.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.Windows.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.SecureString.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceModel.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceProcess.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.CodePages.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encodings.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.RegularExpressions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Channels.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Overlapped.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Dataflow.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Parallel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Thread.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.ThreadPool.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Timer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.Local.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ValueTuple.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.HttpUtility.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Windows.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Linq.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.ReaderWriter.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Serialization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.XDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlSerializer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/WindowsBase.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/mscorlib.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/netstandard.dll | diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.ql b/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.ql index 82cea3528a6..b78ceee2d8f 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.ql +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/Assemblies.ql @@ -4,8 +4,9 @@ private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | result = - s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + - "/packages".length(), s.length()) + "[...]" + + s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + + "/packages".length(), s.length()) or result = s and not exists(s.indexOf("test-db/working/")) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/test.py b/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/test.py index 72f47e38d22..a17966e148a 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/test.py +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_multi_target/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Assemblies.expected b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Assemblies.expected new file mode 100644 index 00000000000..ec1192ed029 --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Assemblies.expected @@ -0,0 +1 @@ +| [...]/packages/newtonsoft.json/6.0.4/lib/net45/Newtonsoft.Json.dll | diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Assemblies.ql b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Assemblies.ql new file mode 100644 index 00000000000..e542b688455 --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Assemblies.ql @@ -0,0 +1,16 @@ +import csharp + +private string getPath(Assembly a) { + not a.getCompilation().getOutputAssembly() = a and + exists(string s | s = a.getFile().getAbsolutePath() | + result = + "[...]" + + s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16, s.length()) + or + result = s and + not exists(s.indexOf("test-db/working/")) + ) +} + +from Assembly a +select getPath(a) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Program.cs b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Program.cs new file mode 100644 index 00000000000..39a9e95bb6e --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/Program.cs @@ -0,0 +1,6 @@ +class Program +{ + static void Main(string[] args) + { + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/global.json b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/global.json new file mode 100644 index 00000000000..5c3fd64fbd1 --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "8.0.101" + } +} diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/packages.config b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/packages.config new file mode 100644 index 00000000000..0f63b3daf6c --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/skip-on-platform-osx-arm b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/skip-on-platform-osx-arm new file mode 100644 index 00000000000..6ebb8d63fcc --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/skip-on-platform-osx-arm @@ -0,0 +1 @@ +Skipping the test on the ARM runners, as we're running into trouble with Mono and nuget. diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test.py b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test.py new file mode 100644 index 00000000000..277f7d92160 --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test.py @@ -0,0 +1,5 @@ +from create_database_utils import * +import os + +os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_DOTNET_FRAMEWORK_REFERENCES"] = "/non-existent-path" +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test_old.csproj b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test_old.csproj new file mode 100644 index 00000000000..f7600103d99 --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test_old.csproj @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test_sdk.csproj b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test_sdk.csproj new file mode 100644 index 00000000000..4425f1c1431 --- /dev/null +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_no_framework/test_sdk.csproj @@ -0,0 +1,16 @@ + + + + Exe + net8.0 + + + + + + + + + + + diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.expected b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.expected index 720c83eff16..bf3b256b71f 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.expected +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.expected @@ -1 +1 @@ -| /Newtonsoft.Json.6.0.4/lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll | +| [...]/Newtonsoft.Json.6.0.4/lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll | diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.ql b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.ql index e07e7c55e7d..24308907aa3 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.ql +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/Assemblies.ql @@ -4,8 +4,9 @@ private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | result = - s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + - "/legacypackages".length(), s.length()) + "[...]" + + s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + + "/legacypackages".length(), s.length()) // TODO: include all other assemblies from the test results. Initially disable because mono installations were problematic on ARM runners. ) } diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/test.py b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/test.py index 72f47e38d22..a17966e148a 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/test.py +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.expected b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.expected index 4d37379dd7b..2a530060edb 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.expected +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.expected @@ -1 +1 @@ -| newtonsoft.json/13.0.3/lib/net6.0/Newtonsoft.Json.dll | +| [...]/newtonsoft.json/13.0.3/lib/net6.0/Newtonsoft.Json.dll | diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.ql b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.ql index 96992c24b50..79cf92de791 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.ql +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/Assemblies.ql @@ -3,7 +3,7 @@ import csharp private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | - result = s.substring(s.indexOf("newtonsoft.json"), s.length()) + result = "[...]/" + s.substring(s.indexOf("newtonsoft.json"), s.length()) ) } diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/test.py b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/test.py index 72f47e38d22..a17966e148a 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/test.py +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_config_error/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.expected b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.expected index 720c83eff16..bf3b256b71f 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.expected +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.expected @@ -1 +1 @@ -| /Newtonsoft.Json.6.0.4/lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll | +| [...]/Newtonsoft.Json.6.0.4/lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll | diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.ql b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.ql index e07e7c55e7d..24308907aa3 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.ql +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/Assemblies.ql @@ -4,8 +4,9 @@ private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | result = - s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + - "/legacypackages".length(), s.length()) + "[...]" + + s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + + "/legacypackages".length(), s.length()) // TODO: include all other assemblies from the test results. Initially disable because mono installations were problematic on ARM runners. ) } diff --git a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/test.py b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/test.py index 9142835c65f..ff2e3ba7d3b 100644 --- a/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/test.py +++ b/csharp/ql/integration-tests/posix-only/standalone_dependencies_nuget_no_sources/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], source="proj", lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], source="proj", lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.expected index 01f844ae0df..bddfcec4690 100644 --- a/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.expected @@ -1,210 +1,210 @@ -| /avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll | -| /microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.CSharp.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Core.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.AppContext.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Buffers.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Concurrent.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Immutable.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.NonGeneric.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Specialized.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Annotations.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.DataAnnotations.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.EventBasedAsync.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.TypeConverter.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Configuration.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Console.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Core.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.Common.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.DataSetExtensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Contracts.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Debug.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.DiagnosticSource.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.FileVersionInfo.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Process.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.StackTrace.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TextWriterTraceListener.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tools.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TraceSource.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tracing.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Dynamic.Runtime.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Asn1.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Tar.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Calendars.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.Brotli.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.FileSystem.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.ZipFile.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.DriveInfo.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Watcher.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.IsolatedStorage.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.MemoryMappedFiles.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.UnmanagedMemoryStream.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Expressions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Parallel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Queryable.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Memory.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.HttpListener.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Mail.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NameResolution.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NetworkInformation.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Ping.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Quic.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Requests.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Security.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.ServicePoint.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Sockets.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebClient.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebHeaderCollection.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebProxy.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.Client.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.Vectors.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ObjectModel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.DispatchProxy.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.ILGeneration.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.Lightweight.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Metadata.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.TypeExtensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Reader.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.ResourceManager.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Writer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.Unsafe.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.VisualC.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Handles.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.JavaScript.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.RuntimeInformation.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Intrinsics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Loader.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Numerics.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Formatters.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Xml.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.AccessControl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Claims.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Algorithms.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Cng.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Csp.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Encoding.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.OpenSsl.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Primitives.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.X509Certificates.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.Windows.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.SecureString.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceModel.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceProcess.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.CodePages.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encodings.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Json.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.RegularExpressions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Channels.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Overlapped.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Dataflow.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Extensions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Parallel.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Thread.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.ThreadPool.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Timer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.Local.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ValueTuple.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.HttpUtility.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Windows.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Linq.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.ReaderWriter.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Serialization.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.XDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlDocument.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlSerializer.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/mscorlib.dll | -| /microsoft.netcore.app.ref/8.0.1/ref/net8.0/netstandard.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Accessibility.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Forms.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.AccessControl.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.SystemEvents.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationCore.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Aero2.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Aero.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.AeroLite.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Classic.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Luna.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Royale.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationUI.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/ReachFramework.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.CodeDom.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Configuration.ConfigurationManager.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Design.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Diagnostics.EventLog.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Diagnostics.PerformanceCounter.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.DirectoryServices.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.Common.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.Design.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.IO.Packaging.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Printing.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Resources.Extensions.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Pkcs.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.ProtectedData.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Xml.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Permissions.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Threading.AccessControl.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Controls.Ribbon.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Extensions.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Design.Editors.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Design.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Primitives.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Input.Manipulations.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Presentation.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Xaml.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationClient.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationClientSideProviders.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationProvider.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationTypes.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/WindowsBase.dll | -| /microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/WindowsFormsIntegration.dll | -| /newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll | +| [...]/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll | +| [...]/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.CSharp.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Core.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.AppContext.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Buffers.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Concurrent.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Immutable.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.NonGeneric.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.Specialized.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Collections.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Annotations.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.DataAnnotations.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.EventBasedAsync.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.TypeConverter.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ComponentModel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Configuration.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Console.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Core.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.Common.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.DataSetExtensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Data.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Contracts.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Debug.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.DiagnosticSource.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.FileVersionInfo.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Process.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.StackTrace.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TextWriterTraceListener.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tools.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.TraceSource.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Diagnostics.Tracing.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Drawing.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Dynamic.Runtime.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Asn1.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Formats.Tar.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Calendars.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Globalization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.Brotli.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.FileSystem.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.ZipFile.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Compression.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.DriveInfo.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.Watcher.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.FileSystem.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.IsolatedStorage.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.MemoryMappedFiles.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.Pipes.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.UnmanagedMemoryStream.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.IO.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Expressions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Parallel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.Queryable.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Linq.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Memory.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Http.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.HttpListener.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Mail.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NameResolution.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.NetworkInformation.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Ping.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Quic.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Requests.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Security.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.ServicePoint.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.Sockets.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebClient.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebHeaderCollection.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebProxy.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.Client.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.WebSockets.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Net.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.Vectors.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Numerics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ObjectModel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.DispatchProxy.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.ILGeneration.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.Lightweight.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Emit.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Metadata.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.TypeExtensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Reflection.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Reader.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.ResourceManager.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Resources.Writer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.Unsafe.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.CompilerServices.VisualC.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Handles.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.JavaScript.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.RuntimeInformation.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.InteropServices.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Intrinsics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Loader.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Numerics.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Formatters.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.Xml.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.Serialization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Runtime.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.AccessControl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Claims.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Algorithms.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Cng.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Csp.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Encoding.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.OpenSsl.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Primitives.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.X509Certificates.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.Windows.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.Principal.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.SecureString.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Security.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceModel.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ServiceProcess.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.CodePages.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encoding.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Encodings.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.Json.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Text.RegularExpressions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Channels.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Overlapped.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Dataflow.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Extensions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.Parallel.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Tasks.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Thread.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.ThreadPool.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.Timer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Threading.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.Local.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Transactions.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.ValueTuple.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.HttpUtility.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Web.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Windows.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Linq.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.ReaderWriter.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.Serialization.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.XDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XPath.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlDocument.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.XmlSerializer.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.Xml.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/System.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/mscorlib.dll | +| [...]/microsoft.netcore.app.ref/8.0.1/ref/net8.0/netstandard.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Accessibility.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Forms.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.AccessControl.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.SystemEvents.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationCore.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Aero2.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Aero.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.AeroLite.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Classic.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Luna.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Royale.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationUI.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/ReachFramework.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.CodeDom.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Configuration.ConfigurationManager.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Design.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Diagnostics.EventLog.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Diagnostics.PerformanceCounter.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.DirectoryServices.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.Common.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.Design.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.IO.Packaging.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Printing.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Resources.Extensions.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Pkcs.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.ProtectedData.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Xml.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Permissions.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Threading.AccessControl.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Controls.Ribbon.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Extensions.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Design.Editors.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Design.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Primitives.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Input.Manipulations.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Presentation.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Xaml.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationClient.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationClientSideProviders.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationProvider.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationTypes.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/WindowsBase.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/WindowsFormsIntegration.dll | +| [...]/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll | diff --git a/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.ql b/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.ql index 82cea3528a6..b78ceee2d8f 100644 --- a/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.ql +++ b/csharp/ql/integration-tests/windows-only/standalone_dependencies/Assemblies.ql @@ -4,8 +4,9 @@ private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | result = - s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + - "/packages".length(), s.length()) + "[...]" + + s.substring(s.indexOf("test-db/working/") + "test-db/working/".length() + 16 + + "/packages".length(), s.length()) or result = s and not exists(s.indexOf("test-db/working/")) diff --git a/csharp/ql/integration-tests/windows-only/standalone_dependencies/test.py b/csharp/ql/integration-tests/windows-only/standalone_dependencies/test.py index 72f47e38d22..a17966e148a 100644 --- a/csharp/ql/integration-tests/windows-only/standalone_dependencies/test.py +++ b/csharp/ql/integration-tests/windows-only/standalone_dependencies/test.py @@ -1,3 +1,3 @@ from create_database_utils import * -run_codeql_database_create([], lang="csharp", extra_args=["--extractor-option=buildless=true"]) +run_codeql_database_create([], lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 95fd64c5270..16cc14259e1 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,17 @@ +## 0.8.10 + +### Major Analysis Improvements + +* Improved support for flow through captured variables that properly adheres to inter-procedural control flow. +* We no longer make use of CodeQL database stats, which may affect join-orders in custom queries. It is therefore recommended to test performance of custom queries after upgrading to this version. + +### Minor Analysis Improvements + +* C# 12: Add QL library support (`ExperimentalAttribute`) for the experimental attribute. +* C# 12: Add extractor and QL library support for `ref readonly` parameters. +* C#: The table `expr_compiler_generated` has been deleted and its content has been added to `compiler_generated`. +* Data flow via get only properties like `public object Obj { get; }` is now captured by the data flow library. + ## 0.8.9 ### Minor Analysis Improvements diff --git a/csharp/ql/lib/IDEContextual.qll b/csharp/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/csharp/ql/lib/IDEContextual.qll +++ b/csharp/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/csharp/ql/lib/change-notes/released/0.8.10.md b/csharp/ql/lib/change-notes/released/0.8.10.md new file mode 100644 index 00000000000..f591ddc5b21 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.8.10.md @@ -0,0 +1,13 @@ +## 0.8.10 + +### Major Analysis Improvements + +* Improved support for flow through captured variables that properly adheres to inter-procedural control flow. +* We no longer make use of CodeQL database stats, which may affect join-orders in custom queries. It is therefore recommended to test performance of custom queries after upgrading to this version. + +### Minor Analysis Improvements + +* C# 12: Add QL library support (`ExperimentalAttribute`) for the experimental attribute. +* C# 12: Add extractor and QL library support for `ref readonly` parameters. +* C#: The table `expr_compiler_generated` has been deleted and its content has been added to `compiler_generated`. +* Data flow via get only properties like `public object Obj { get; }` is now captured by the data flow library. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 5290c29b7fe..0521f0f75fa 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.9 +lastReleaseVersion: 0.8.10 diff --git a/csharp/ql/lib/printCfg.ql b/csharp/ql/lib/printCfg.ql new file mode 100644 index 00000000000..aa92b119204 --- /dev/null +++ b/csharp/ql/lib/printCfg.ql @@ -0,0 +1,50 @@ +/** + * @name Print CFG + * @description Produces a representation of a file's Control Flow Graph. + * This query is used by the VS Code extension. + * @id cs/print-cfg + * @kind graph + * @tags ide-contextual-queries/print-cfg + */ + +private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl + +external string selectedSourceFile(); + +private predicate selectedSourceFileAlias = selectedSourceFile/0; + +external int selectedSourceLine(); + +private predicate selectedSourceLineAlias = selectedSourceLine/0; + +external int selectedSourceColumn(); + +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; + +module ViewCfgQueryInput implements ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().getStartLine() = startLine and + scope.getLocation().getStartColumn() = startColumn and + exists(Location loc | + loc.getEndLine() = endLine and + loc.getEndColumn() = endColumn + | + loc = scope.(Callable).getBody().getLocation() + or + loc = scope.(Field).getInitializer().getLocation() + or + loc = scope.(Property).getInitializer().getLocation() + ) + } +} + +import ViewCfgQuery diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 2021ec96f30..4dd1e16a564 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.8.9 +version: 0.8.10 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll index b45b743c40c..98447be7e4e 100644 --- a/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll +++ b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll @@ -159,6 +159,11 @@ private module Annotations { getNoFlagsNullability(result) = getChildNullability(annotations.getNullability(), i) } + pragma[nomagic] + private Nullability getChildNullability0(Nullability n, int i) { + nullability_parent(getNullability(result), i, getNullability(n)) + } + /** * Gets the `i`th child of nullability `n`. * Returns `n` if the nullability is not explicitly @@ -167,9 +172,10 @@ private module Annotations { */ bindingset[i] Nullability getChildNullability(Nullability n, int i) { - if nullability_parent(_, i, getNullability(n)) - then nullability_parent(getNullability(result), i, getNullability(n)) - else result = n + result = getChildNullability0(n, i) + or + not exists(getChildNullability0(n, i)) and + result = n } /** @@ -276,6 +282,11 @@ private Annotations::Nullability getElementNullability(@has_type_annotation elem else result instanceof Annotations::NoNullability } +pragma[nomagic] +private predicate isNoFlagsNoNullability(Annotations::TypeAnnotations annotations) { + Annotations::getNoFlagsNullability(annotations) instanceof Annotations::NoNullability +} + private newtype TAnnotatedType = TAnnotatedTypeNullability(Type type, Annotations::TypeAnnotations annotations) { Annotations::elementTypeAnnotations(_, type, annotations) @@ -288,7 +299,7 @@ private newtype TAnnotatedType = Annotations::getNoFlagsNullability(annotations) = getTypeParameterNullability(_, type) or // All types have at least one annotated type - Annotations::getNoFlagsNullability(annotations) instanceof Annotations::NoNullability + isNoFlagsNoNullability(annotations) and exists(type) or exists(AnnotatedArrayType at | type = at.getType().(ArrayType).getElementType() and diff --git a/csharp/ql/lib/semmle/code/csharp/Generics.qll b/csharp/ql/lib/semmle/code/csharp/Generics.qll index 858f37eab3c..c4c2363f1d1 100644 --- a/csharp/ql/lib/semmle/code/csharp/Generics.qll +++ b/csharp/ql/lib/semmle/code/csharp/Generics.qll @@ -95,10 +95,16 @@ private string getTypeArgumentsToString(ConstructedGeneric cg) { strictconcat(Type t, int i | t = cg.getTypeArgument(i) | t.toStringWithTypes(), ", " order by i) } +pragma[nomagic] +private string getTypeArgumentName(ConstructedGeneric cg, int i) { + result = cg.getTypeArgument(i).getName() +} + /** Gets the concatenation of the `getName()` of type arguments. */ language[monotonicAggregates] private string getTypeArgumentsNames(ConstructedGeneric cg) { - result = strictconcat(Type t, int i | t = cg.getTypeArgument(i) | t.getName(), "," order by i) + result = + strictconcat(int i | exists(cg.getTypeArgument(i)) | getTypeArgumentName(cg, i), "," order by i) } /** @@ -197,9 +203,9 @@ class TypeParameter extends DotNet::TypeParameter, Type, @type_parameter { // A.B is a partially constructed UnboundGenericClass and // A.B is a ConstructedGenericClass. exists(ConstructedGeneric c, UnboundGeneric u, int tpi | - this = u.getTypeParameter(tpi) and + this = u.getTypeParameter(pragma[only_bind_into](tpi)) and (u = c.getUnboundGeneric() or u = c.getUnboundDeclaration()) and - result = c.getTypeArgument(tpi) + result = c.getTypeArgument(pragma[only_bind_into](tpi)) ) } diff --git a/csharp/ql/lib/semmle/code/csharp/Implements.qll b/csharp/ql/lib/semmle/code/csharp/Implements.qll index 96556293a9d..36cc06c4546 100644 --- a/csharp/ql/lib/semmle/code/csharp/Implements.qll +++ b/csharp/ql/lib/semmle/code/csharp/Implements.qll @@ -108,28 +108,29 @@ private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Virtu */ pragma[nomagic] private Virtualizable getACompatibleInterfaceMember(Virtualizable m) { - result = getACompatibleInterfaceMemberAux(m) and - ( + exists(ValueOrRefType declType | result = getACompatibleInterfaceMemberAux(m, declType) | // If there is both an implicit and an explicit compatible member // in the same type, then the explicit implementation must be used - not result = getACompatibleExplicitInterfaceMember(_, m.getDeclaringType()) + not result = getACompatibleExplicitInterfaceMember(_, declType) or - result = getACompatibleExplicitInterfaceMember(m, m.getDeclaringType()) + result = getACompatibleExplicitInterfaceMember(m, declType) ) } pragma[nomagic] private Virtualizable getACompatibleExplicitInterfaceMember(Virtualizable m, ValueOrRefType declType) { - result = getACompatibleInterfaceMemberAux(m) and - declType = m.getDeclaringType() and + result = getACompatibleInterfaceMemberAux(m, declType) and m.implementsExplicitInterface() } pragma[nomagic] -private Virtualizable getACompatibleInterfaceMemberAux(Virtualizable m) { - result = getACompatibleInterfaceAccessor(m) or - result = getACompatibleInterfaceIndexer(m) or - result = getACompatibleRelevantInterfaceMember(m) +private Virtualizable getACompatibleInterfaceMemberAux(Virtualizable m, ValueOrRefType declType) { + ( + result = getACompatibleInterfaceAccessor(m) or + result = getACompatibleInterfaceIndexer(m) or + result = getACompatibleRelevantInterfaceMember(m) + ) and + declType = m.getDeclaringType() } /** @@ -182,13 +183,16 @@ ValueOrRefType getAPossibleImplementor(Interface i) { not result instanceof Interface } +pragma[nomagic] +private Type getParameterType(Parameterizable p, int i) { result = p.getParameter(i).getType() } + private Indexer getACompatibleInterfaceIndexer0(Indexer i, int j) { result = getACompatibleInterfaceIndexerCandidate(i) and convIdentity(i.getType(), result.getType()) and j = -1 or result = getACompatibleInterfaceIndexer0(i, j - 1) and - convIdentity(i.getParameter(j).getType(), result.getParameter(j).getType()) + convIdentity(getParameterType(i, j), getParameterType(result, j)) } /** diff --git a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll index ca4b37eb51b..eb5ca6b4727 100644 --- a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll +++ b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll @@ -27,7 +27,8 @@ class PrintAstConfiguration extends TPrintAstConfiguration { } private predicate shouldPrint(Element e, Location l) { - exists(PrintAstConfiguration config | config.shouldPrint(e, l)) + exists(PrintAstConfiguration config | config.shouldPrint(e, l)) and + not e.(Stmt).isCompilerGenerated() } private predicate isImplicitExpression(ControlFlowElement element) { diff --git a/csharp/ql/lib/semmle/code/csharp/Property.qll b/csharp/ql/lib/semmle/code/csharp/Property.qll index bb127b48f2a..bdeb9832d3f 100644 --- a/csharp/ql/lib/semmle/code/csharp/Property.qll +++ b/csharp/ql/lib/semmle/code/csharp/Property.qll @@ -127,6 +127,13 @@ class Property extends DotNet::Property, DeclarationWithGetSetAccessors, @proper properties(this, _, _, getTypeRef(result), _) } + private predicate isAutoPartial() { + this.fromSource() and + not this.isExtern() and + not this.isAbstract() and + not this.getAnAccessor().hasBody() + } + /** * Holds if this property is automatically implemented. For example, `P1` * on line 2 is automatically implemented, while `P2` on line 5 is not in @@ -147,11 +154,22 @@ class Property extends DotNet::Property, DeclarationWithGetSetAccessors, @proper * code. */ predicate isAutoImplemented() { - this.fromSource() and - this.isReadWrite() and - not this.isExtern() and - not this.isAbstract() and - not this.getAnAccessor().hasBody() + this.isAutoPartial() and + this.isReadWrite() + } + + /** + * Holds if this property is automatically implemented and read-only. For + * example, `P1` on line 2 is automatically implemented and read-only + * ```csharp + * class C { + * public int P1 { get; } + * } + * ``` + */ + predicate isAutoImplementedReadOnly() { + this.isAutoPartial() and + this.isReadOnly() } override Property getUnboundDeclaration() { properties(this, _, _, _, result) } diff --git a/csharp/ql/lib/semmle/code/csharp/Stmt.qll b/csharp/ql/lib/semmle/code/csharp/Stmt.qll index a37255ab7eb..a7bbfb93861 100644 --- a/csharp/ql/lib/semmle/code/csharp/Stmt.qll +++ b/csharp/ql/lib/semmle/code/csharp/Stmt.qll @@ -43,6 +43,9 @@ class Stmt extends ControlFlowElement, @stmt { * For example converts `{ { return x; } }` to `return x;`. */ Stmt stripSingletonBlocks() { result = this } + + /** Holds if this statement is compiler generated. */ + predicate isCompilerGenerated() { compiler_generated(this) } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/Variable.qll b/csharp/ql/lib/semmle/code/csharp/Variable.qll index be52bcbadaf..366aad81b78 100644 --- a/csharp/ql/lib/semmle/code/csharp/Variable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Variable.qll @@ -167,6 +167,18 @@ class Parameter extends DotNet::Parameter, LocalScopeVariable, Attributable, Top */ predicate isParams() { params(this, _, _, _, 3, _, _) } + /** + * Holds if this parameter if a ref readonly parameter. + * For example, `p` is a ref readonly parameter in + * + * ```csharp + * void M(ref readonly int p) { + * ... + * } + * ``` + */ + predicate isReadonlyRef() { params(this, _, _, _, 6, _, _) } + /** * Holds this parameter is the first parameter of an extension method. * For example, `list` is the first parameter of the extension method diff --git a/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll b/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll index 5e05a865640..e67c46f5de8 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll @@ -49,11 +49,20 @@ module QualifiedName { ) } + pragma[nomagic] + private string getTypeArgumentsQualifiedName(ConstructedGeneric cg, int i) { + result = getFullName(cg.getTypeArgument(i)) + } + /** Gets the concatenation of the `getFullName` of type arguments. */ language[monotonicAggregates] private string getTypeArgumentsQualifiedNames(ConstructedGeneric cg) { result = - strictconcat(Type t, int i | t = cg.getTypeArgument(i) | getFullName(t), "," order by i) + strictconcat(int i | + exists(cg.getTypeArgument(i)) + | + getTypeArgumentsQualifiedName(cg, i), "," order by i + ) } /** Holds if declaration `d` has the qualified name `qualifier`.`name`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll b/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll index ca009448c10..63e37d56295 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll @@ -195,8 +195,6 @@ predicate toGvn = toGvnCached/1; /** * Holds if the control flow elements `x` and `y` are structurally equal. */ -pragma[inline] -predicate sameGvn(ControlFlowElement x, ControlFlowElement y) { - pragma[only_bind_into](toGvn(pragma[only_bind_out](x))) = - pragma[only_bind_into](toGvn(pragma[only_bind_out](y))) -} +bindingset[x, y] +pragma[inline_late] +predicate sameGvn(ControlFlowElement x, ControlFlowElement y) { toGvn(x) = toGvn(y) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 7accdb1fe64..1e6a06f1fe3 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -1013,12 +1013,18 @@ module Internal { * Holds if pre-basic-block `bb` only is reached when guard `g` has abstract value `v`, * not taking implications into account. */ + pragma[nomagic] private predicate preControlsDirect(Guard g, PreBasicBlocks::PreBasicBlock bb, AbstractValue v) { exists(PreBasicBlocks::ConditionBlock cb, ConditionalSuccessor s | cb.controls(bb, s) | v.branch(cb.getLastElement(), s, g) ) } + pragma[nomagic] + private predicate preControlsDefDirect(Guard g, PreSsa::Definition def, AbstractValue v) { + preControlsDirect(g, def.getBasicBlock(), v) + } + /** Holds if pre-basic-block `bb` only is reached when guard `g` has abstract value `v`. */ predicate preControls(Guard g, PreBasicBlocks::PreBasicBlock bb, AbstractValue v) { preControlsDirect(g, bb, v) @@ -1111,36 +1117,47 @@ module Internal { ) } - pragma[noinline] + pragma[nomagic] private predicate conditionalAssign0( Guard guard, AbstractValue vGuard, PreSsa::PhiNode phi, Expr e, PreSsa::Definition upd, - PreBasicBlocks::PreBasicBlock bbGuard + PreBasicBlocks::PreBasicBlock bbGuard, PreBasicBlocks::PreBasicBlock bbPhi ) { e = upd.getDefinition().getSource() and upd = phi.getAnInput() and - preControlsDirect(guard, upd.getBasicBlock(), vGuard) and + preControlsDefDirect(guard, upd, vGuard) and bbGuard.getAnElement() = guard and - bbGuard.strictlyDominates(phi.getBasicBlock()) and - not preControlsDirect(guard, phi.getBasicBlock(), vGuard) + bbPhi = phi.getBasicBlock() } pragma[noinline] private predicate conditionalAssign1( + Guard guard, AbstractValue vGuard, PreSsa::PhiNode phi, Expr e, PreSsa::Definition upd, + PreBasicBlocks::PreBasicBlock bbGuard + ) { + exists(PreBasicBlocks::PreBasicBlock bbPhi | + conditionalAssign0(guard, vGuard, phi, e, upd, bbGuard, bbPhi) and + bbGuard.strictlyDominates(bbPhi) and + not preControlsDefDirect(guard, phi, vGuard) + ) + } + + pragma[noinline] + private predicate conditionalAssign2( Guard guard, AbstractValue vGuard, PreSsa::PhiNode phi, Expr e, PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard, PreSsa::Definition other ) { - conditionalAssign0(guard, vGuard, phi, e, upd, bbGuard) and + conditionalAssign1(guard, vGuard, phi, e, upd, bbGuard) and other != upd and other = phi.getAnInput() } pragma[noinline] - private predicate conditionalAssign2( + private predicate conditionalAssign3( Guard guard, AbstractValue vGuard, PreSsa::Definition def, Expr e, PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard, PreSsa::Definition other ) { - conditionalAssign1(guard, vGuard, def, e, upd, bbGuard, other) and - preControlsDirect(guard, other.getBasicBlock(), vGuard.getDualValue()) + conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) and + preControlsDefDirect(guard, other, vGuard.getDualValue()) } /** Gets the successor block that is reached when guard `g` has abstract value `v`. */ @@ -1153,11 +1170,11 @@ module Internal { } pragma[noinline] - private predicate conditionalAssign3( + private predicate conditionalAssign4( Guard guard, AbstractValue vGuard, PreSsa::Definition def, Expr e, PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard, PreSsa::Definition other ) { - conditionalAssign1(guard, vGuard, def, e, upd, bbGuard, other) and + conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) and other.getBasicBlock().dominates(bbGuard) and not other.isLiveAtEndOfBlock(getConditionalSuccessor(guard, vGuard)) } @@ -1184,10 +1201,10 @@ module Internal { ) or exists(PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard | - conditionalAssign0(guard, vGuard, def, e, upd, bbGuard) + conditionalAssign1(guard, vGuard, def, e, upd, bbGuard) | forall(PreSsa::Definition other | - conditionalAssign1(guard, vGuard, def, e, upd, bbGuard, other) + conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) | // For example: // if (guard) @@ -1195,14 +1212,14 @@ module Internal { // else // other = b; // def = phi(upd, other) - conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) + conditionalAssign3(guard, vGuard, def, e, upd, bbGuard, other) or // For example: // other = a; // if (guard) // upd = b; // def = phi(other, upd) - conditionalAssign3(guard, vGuard, def, e, upd, bbGuard, other) + conditionalAssign4(guard, vGuard, def, e, upd, bbGuard, other) ) ) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll index cf72b9a6991..a470d0c4b8a 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll @@ -49,7 +49,10 @@ private newtype TCompletion = nestedFinallyCompletion(outer, nestLevel) } -pragma[noinline] +pragma[nomagic] +private int getAFinallyNestLevel() { result = any(Statements::TryStmtTree t).nestLevel() } + +pragma[nomagic] private predicate nestedFinallyCompletion(Completion outer, int nestLevel) { ( outer = TReturnCompletion() @@ -64,7 +67,7 @@ private predicate nestedFinallyCompletion(Completion outer, int nestLevel) { or outer = TExitCompletion() ) and - nestLevel = any(Statements::TryStmtTree t).nestLevel() + nestLevel = getAFinallyNestLevel() } pragma[noinline] diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll index 6a507fb8014..08debc21c0d 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll @@ -75,8 +75,10 @@ class PreBasicBlock extends ControlFlowElement { predicate immediatelyDominates(PreBasicBlock bb) { bbIDominates(this, bb) } + pragma[inline] predicate strictlyDominates(PreBasicBlock bb) { this.immediatelyDominates+(bb) } + pragma[inline] predicate dominates(PreBasicBlock bb) { bb = this or @@ -97,6 +99,7 @@ class ConditionBlock extends PreBasicBlock { ) } + pragma[nomagic] private predicate immediatelyControls(PreBasicBlock succ, ConditionalCompletion cc) { exists(ControlFlowElement last, Completion c | last = this.getLastElement() and diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll index 42d9c21102a..c7c1de2308b 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll @@ -31,9 +31,52 @@ module PreSsa { } predicate implicitEntryDef(Callable c, SsaInput::BasicBlock bb, SsaInput::SourceVariable v) { - not v instanceof LocalScopeVariable and c = v.getACallable() and - scopeFirst(c, bb) + scopeFirst(c, bb) and + ( + not v instanceof LocalScopeVariable + or + v.(SimpleLocalScopeVariable).isReadonlyCapturedBy(c) + ) + } + + /** Holds if `a` is assigned in callable `c`. */ + pragma[nomagic] + private predicate assignableDefinition(Assignable a, Callable c) { + exists(AssignableDefinition def | + def.getTarget() = a and + c = def.getEnclosingCallable() + | + not c instanceof Constructor or + a instanceof LocalScopeVariable + ) + } + + pragma[nomagic] + private predicate assignableUniqueWriter(Assignable a, Callable c) { + c = unique(Callable c0 | assignableDefinition(a, c0) | c0) + } + + /** Holds if `a` is accessed in callable `c`. */ + pragma[nomagic] + private predicate assignableAccess(Assignable a, Callable c) { + exists(AssignableAccess aa | aa.getTarget() = a | c = aa.getEnclosingCallable()) + } + + /** + * A local scope variable that is amenable to SSA analysis. + * + * This is either a local variable that is not captured, or one + * where all writes happen in the defining callable. + */ + class SimpleLocalScopeVariable extends LocalScopeVariable { + SimpleLocalScopeVariable() { assignableUniqueWriter(this, this.getCallable()) } + + /** Holds if this local scope variable is read-only captured by `c`. */ + predicate isReadonlyCapturedBy(Callable c) { + assignableAccess(this, c) and + c != this.getCallable() + } } module SsaInput implements SsaImplCommon::InputSig { @@ -47,40 +90,6 @@ module PreSsa { ExitBasicBlock() { scopeLast(_, this.getLastElement(), _) } } - /** Holds if `a` is assigned in non-constructor callable `c`. */ - pragma[nomagic] - private predicate assignableDefinition(Assignable a, Callable c) { - exists(AssignableDefinition def | def.getTarget() = a | - c = def.getEnclosingCallable() and - not c instanceof Constructor - ) - } - - /** Holds if `a` is accessed in callable `c`. */ - pragma[nomagic] - private predicate assignableAccess(Assignable a, Callable c) { - exists(AssignableAccess aa | aa.getTarget() = a | c = aa.getEnclosingCallable()) - } - - pragma[nomagic] - private predicate assignableNoCapturing(Assignable a, Callable c) { - assignableAccess(a, c) and - /* - * The code below is equivalent to - * ```ql - * not exists(Callable other | assignableDefinition(a, other) | other != c) - * ``` - * but it avoids a Cartesian product in the compiler generated antijoin - * predicate. - */ - - ( - not assignableDefinition(a, _) - or - c = unique(Callable c0 | assignableDefinition(a, c0) | c0) - ) - } - pragma[noinline] private predicate assignableNoComplexQualifiers(Assignable a) { forall(QualifiableExpr qe | qe.(AssignableAccess).getTarget() = a | qe.targetIsThisInstance()) @@ -94,15 +103,22 @@ module PreSsa { private Callable c; SourceVariable() { + assignableAccess(this, c) and ( - this instanceof LocalScopeVariable + this instanceof SimpleLocalScopeVariable or - this = any(Field f | not f.isVolatile()) - or - this = any(TrivialProperty tp | not tp.isOverridableOrImplementable()) - ) and - assignableNoCapturing(this, c) and - assignableNoComplexQualifiers(this) + ( + this = any(Field f | not f.isVolatile()) + or + this = any(TrivialProperty tp | not tp.isOverridableOrImplementable()) + ) and + ( + not assignableDefinition(this, _) + or + assignableUniqueWriter(this, c) + ) and + assignableNoComplexQualifiers(this) + ) } /** Gets a callable in which this simple assignable can be analyzed. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index a281c21b657..53ee9181ec5 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -218,19 +218,6 @@ private predicate isNullDefaultArgument(Ssa::ExplicitDefinition def, AlwaysNullE ) } -/** - * Holds if `edef` is an implicit entry definition for a captured variable that - * may be guarded, because a call to the capturing callable is guarded. - */ -private predicate isMaybeGuardedCapturedDef(Ssa::ImplicitEntryDefinition edef) { - exists(Ssa::ExplicitDefinition def, ControlFlow::Nodes::ElementNode c, G::Guard g, NullValue nv | - def.isCapturedVariableDefinitionFlowIn(edef, c, _) and - g = def.getARead() and - g.controlsNode(c, nv) and - nv.isNonNull() - ) -} - /** Holds if `def` is an SSA definition that may be `null`. */ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) { not nonNullDef(def) and @@ -268,7 +255,6 @@ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) exists(Dereference d | dereferenceAt(_, _, def, d) | d.hasNullableType() and not def instanceof Ssa::PhiNode and - not isMaybeGuardedCapturedDef(def) and reason = def.getSourceVariable().getAssignable() and msg = "because it has a nullable type" ) @@ -583,14 +569,8 @@ class Dereference extends G::DereferenceableExpr { */ predicate isAlwaysNull(Ssa::SourceVariable v) { this = v.getAnAccess() and - // Exclude fields, properties, and captured variables, as they may not have an - // accurate SSA representation - v.getAssignable() = - any(LocalScopeVariable lsv | - strictcount(Callable c | - c = any(AssignableDefinition ad | ad.getTarget() = lsv).getEnclosingCallable() - ) = 1 - ) and + // Exclude fields and properties, as they may not have an accurate SSA representation + v.getAssignable() instanceof LocalScopeVariable and ( forex(Ssa::Definition def0 | this = def0.getARead() | this.isAlwaysNull0(def0)) or diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll index f77e5f7fd98..673bd1a5638 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll @@ -447,6 +447,8 @@ module Ssa { final AssignableDefinition getADefinition() { result = SsaImpl::getADefinition(this) } /** + * DEPRECATED. + * * Holds if this definition updates a captured local scope variable, and the updated * value may be read from the implicit entry definition `def` using one or more calls * (as indicated by `additionalCalls`), starting from call `c`. @@ -467,13 +469,15 @@ module Ssa { * If this definition is the update of `i` on line 5, then the value may be read inside * `M2` via the call on line 6. */ - final predicate isCapturedVariableDefinitionFlowIn( + deprecated final predicate isCapturedVariableDefinitionFlowIn( ImplicitEntryDefinition def, ControlFlow::Nodes::ElementNode c, boolean additionalCalls ) { - SsaImpl::isCapturedVariableDefinitionFlowIn(this, def, c, additionalCalls) + none() } /** + * DEPRECATED. + * * Holds if this definition updates a captured local scope variable, and the updated * value may be read from the implicit call definition `cdef` using one or more calls * (as indicated by `additionalCalls`). @@ -494,10 +498,10 @@ module Ssa { * If this definition is the update of `i` on line 4, then the value may be read outside * of `M2` via the call on line 5. */ - final predicate isCapturedVariableDefinitionFlowOut( + deprecated final predicate isCapturedVariableDefinitionFlowOut( ImplicitCallDefinition cdef, boolean additionalCalls ) { - SsaImpl::isCapturedVariableDefinitionFlowOut(this, cdef, additionalCalls) + none() } override Element getElement() { result = ad.getElement() } @@ -526,8 +530,6 @@ module Ssa { or SsaImpl::updatesNamedFieldOrProp(bb, i, _, v, _) or - SsaImpl::updatesCapturedVariable(bb, i, _, v, _, _) - or SsaImpl::variableWriteQualifier(bb, i, v, _) ) } @@ -572,10 +574,9 @@ module Ssa { private Call c; ImplicitCallDefinition() { - exists(ControlFlow::BasicBlock bb, SourceVariable v, int i | this.definesAt(v, bb, i) | + exists(ControlFlow::BasicBlock bb, SourceVariable v, int i | + this.definesAt(v, bb, i) and SsaImpl::updatesNamedFieldOrProp(bb, i, c, v, _) - or - SsaImpl::updatesCapturedVariable(bb, i, c, v, _, _) ) } @@ -593,9 +594,6 @@ module Ssa { result.getEnclosingCallable() = setter and result.getTarget() = this.getSourceVariable().getAssignable() ) - or - SsaImpl::updatesCapturedVariable(_, _, this.getCall(), _, result, _) and - result.getTarget() = this.getSourceVariable().getAssignable() } override string toString() { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll index 0933559347e..f30b1769107 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll @@ -24,7 +24,16 @@ module BaseSsa { ) } + private predicate implicitEntryDef( + Callable c, ControlFlow::BasicBlocks::EntryBlock bb, SsaInput::SourceVariable v + ) { + v.isReadonlyCapturedBy(c) and + c = bb.getCallable() + } + private module SsaInput implements SsaImplCommon::InputSig { + private import semmle.code.csharp.controlflow.internal.PreSsa + class BasicBlock = ControlFlow::BasicBlock; BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { @@ -35,20 +44,17 @@ module BaseSsa { class ExitBasicBlock = ControlFlow::BasicBlocks::ExitBlock; - pragma[noinline] - private Callable getAnAssigningCallable(LocalScopeVariable v) { - result = any(AssignableDefinition def | def.getTarget() = v).getEnclosingCallable() - } - - class SourceVariable extends LocalScopeVariable { - SourceVariable() { not getAnAssigningCallable(this) != getAnAssigningCallable(this) } - } + class SourceVariable = PreSsa::SimpleLocalScopeVariable; predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { exists(AssignableDefinition def | definitionAt(def, bb, i, v) and if def.isCertain() then certain = true else certain = false ) + or + implicitEntryDef(_, bb, v) and + i = -1 and + certain = true } predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) { @@ -87,7 +93,15 @@ module BaseSsa { not result instanceof PhiNode } - Location getLocation() { result = this.getDefinition().getLocation() } + Location getLocation() { + result = this.getDefinition().getLocation() + or + exists(Callable c, SsaInput::BasicBlock bb, SsaInput::SourceVariable v | + this.definesAt(v, bb, -1) and + implicitEntryDef(c, bb, v) and + result = c.getLocation() + ) + } } class PhiNode extends SsaImpl::PhiNode, Definition { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll index 871344878f7..80986fb5e26 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll @@ -20,13 +20,7 @@ private import semmle.code.csharp.frameworks.system.collections.Generic */ DotNet::Callable getCallableForDataFlow(DotNet::Callable c) { exists(DotNet::Callable unboundDecl | unboundDecl = c.getUnboundDeclaration() | - ( - result.hasBody() - or - // take synthesized bodies into account, e.g. implicit constructors - // with field initializer assignments - result = any(ControlFlow::Nodes::ElementNode n).getEnclosingCallable() - ) and + result.hasBody() and if unboundDecl.getFile().fromSource() then // C# callable with C# implementation in the database @@ -46,35 +40,10 @@ DotNet::Callable getCallableForDataFlow(DotNet::Callable c) { ) } -/** - * Holds if `cfn` corresponds to a call that can reach callable `c` using - * additional calls, and `c` is a callable that either reads or writes to - * a captured variable. - */ -private predicate transitiveCapturedCallTarget(ControlFlow::Nodes::ElementNode cfn, Callable c) { - exists(Ssa::ExplicitDefinition def | - exists(Ssa::ImplicitEntryDefinition edef | - def.isCapturedVariableDefinitionFlowIn(edef, cfn, true) - | - c = edef.getCallable() - ) - or - exists(Ssa::ImplicitCallDefinition cdef | def.isCapturedVariableDefinitionFlowOut(cdef, true) | - cfn = cdef.getControlFlowNode() and - c = def.getEnclosingCallable() - ) - ) -} - newtype TReturnKind = TNormalReturnKind() or TOutReturnKind(int i) { i = any(Parameter p | p.isOut()).getPosition() } or - TRefReturnKind(int i) { i = any(Parameter p | p.isRef()).getPosition() } or - TImplicitCapturedReturnKind(LocalScopeVariable v) { - exists(Ssa::ExplicitDefinition def | def.isCapturedVariableDefinitionFlowOut(_, _) | - v = def.getSourceVariable().getAssignable() - ) - } + TRefReturnKind(int i) { i = any(Parameter p | p.isRef()).getPosition() } /** * A summarized callable where the summary should be used for dataflow analysis. @@ -100,7 +69,8 @@ private module Cached { newtype TDataFlowCallable = TDotNetCallable(DotNet::Callable c) { c.isUnboundDeclaration() } or TSummarizedCallable(DataFlowSummarizedCallable sc) or - TFieldOrProperty(FieldOrProperty f) + TFieldOrPropertyCallable(FieldOrProperty f) or + TCapturedVariableCallable(LocalScopeVariable v) { v.isCaptured() } cached newtype TDataFlowCall = @@ -111,9 +81,6 @@ private module Cached { TExplicitDelegateLikeCall(ControlFlow::Nodes::ElementNode cfn, DelegateLikeCall dc) { cfn.getAstNode() = dc } or - TTransitiveCapturedCall(ControlFlow::Nodes::ElementNode cfn) { - transitiveCapturedCallTarget(cfn, _) - } or TCilCall(CIL::Call call) { // No need to include calls that are compiled from source not call.getImplementation().getMethod().compiledFromSource() @@ -126,24 +93,16 @@ private module Cached { cached DataFlowCallable viableCallable(DataFlowCall call) { result = call.getARuntimeTarget() } - private predicate capturedWithFlowIn(LocalScopeVariable v) { - exists(Ssa::ExplicitDefinition def | def.isCapturedVariableDefinitionFlowIn(_, _, _) | - v = def.getSourceVariable().getAssignable() - ) - } - cached newtype TParameterPosition = TPositionalParameterPosition(int i) { i = any(Parameter p).getPosition() } or TThisParameterPosition() or - TImplicitCapturedParameterPosition(LocalScopeVariable v) { capturedWithFlowIn(v) } or TDelegateSelfParameterPosition() cached newtype TArgumentPosition = TPositionalArgumentPosition(int i) { i = any(Parameter p).getPosition() } or TQualifierArgumentPosition() or - TImplicitCapturedArgumentPosition(LocalScopeVariable v) { capturedWithFlowIn(v) } or TDelegateSelfArgumentPosition() } @@ -235,18 +194,6 @@ class RefReturnKind extends OutRefReturnKind, TRefReturnKind { override string toString() { result = "ref parameter " + pos } } -/** A value implicitly returned from a callable using a captured variable. */ -class ImplicitCapturedReturnKind extends ReturnKind, TImplicitCapturedReturnKind { - private LocalScopeVariable v; - - ImplicitCapturedReturnKind() { this = TImplicitCapturedReturnKind(v) } - - /** Gets the captured variable. */ - LocalScopeVariable getVariable() { result = v } - - override string toString() { result = "captured " + v } -} - /** A callable used for data flow. */ class DataFlowCallable extends TDataFlowCallable { /** Gets the underlying source code callable, if any. */ @@ -256,7 +203,9 @@ class DataFlowCallable extends TDataFlowCallable { FlowSummary::SummarizedCallable asSummarizedCallable() { this = TSummarizedCallable(result) } /** Gets the underlying field or property, if any. */ - FieldOrProperty asFieldOrProperty() { this = TFieldOrProperty(result) } + FieldOrProperty asFieldOrProperty() { this = TFieldOrPropertyCallable(result) } + + LocalScopeVariable asCapturedVariable() { this = TCapturedVariableCallable(result) } /** Gets the underlying callable. */ DotNet::Callable getUnderlyingCallable() { @@ -268,6 +217,8 @@ class DataFlowCallable extends TDataFlowCallable { result = this.getUnderlyingCallable().toString() or result = this.asFieldOrProperty().toString() + or + result = this.asCapturedVariable().toString() } /** Get the location of this dataflow callable. */ @@ -275,6 +226,8 @@ class DataFlowCallable extends TDataFlowCallable { result = this.getUnderlyingCallable().getLocation() or result = this.asFieldOrProperty().getLocation() + or + result = this.asCapturedVariable().getLocation() } } @@ -398,33 +351,6 @@ class ExplicitDelegateLikeDataFlowCall extends DelegateDataFlowCall, TExplicitDe override Location getLocation() { result = cfn.getLocation() } } -/** - * A call that can reach a callable, using one or more additional calls, which - * reads or updates a captured variable. We model such a chain of calls as just - * a single call for performance reasons. - */ -class TransitiveCapturedDataFlowCall extends DataFlowCall, TTransitiveCapturedCall { - private ControlFlow::Nodes::ElementNode cfn; - - TransitiveCapturedDataFlowCall() { this = TTransitiveCapturedCall(cfn) } - - override DataFlowCallable getARuntimeTarget() { - transitiveCapturedCallTarget(cfn, result.asCallable()) - } - - override ControlFlow::Nodes::ElementNode getControlFlowNode() { result = cfn } - - override DataFlow::ExprNode getNode() { none() } - - override DataFlowCallable getEnclosingCallable() { - result.asCallable() = cfn.getEnclosingCallable() - } - - override string toString() { result = "[transitive] " + cfn.toString() } - - override Location getLocation() { result = cfn.getLocation() } -} - /** A CIL call relevant for data flow. */ class CilDataFlowCall extends DataFlowCall, TCilCall { private CIL::Call call; @@ -491,11 +417,6 @@ class ParameterPosition extends TParameterPosition { /** Holds if this position represents a `this` parameter. */ predicate isThisParameter() { this = TThisParameterPosition() } - /** Holds if this position is used to model flow through captured variables. */ - predicate isImplicitCapturedParameterPosition(LocalScopeVariable v) { - this = TImplicitCapturedParameterPosition(v) - } - /** * Holds if this position represents a reference to a delegate itself. * @@ -510,10 +431,6 @@ class ParameterPosition extends TParameterPosition { or this.isThisParameter() and result = "this" or - exists(LocalScopeVariable v | - this.isImplicitCapturedParameterPosition(v) and result = "captured " + v - ) - or this.isDelegateSelf() and result = "delegate self" } @@ -527,11 +444,6 @@ class ArgumentPosition extends TArgumentPosition { /** Holds if this position represents a qualifier. */ predicate isQualifier() { this = TQualifierArgumentPosition() } - /** Holds if this position is used to model flow through captured variables. */ - predicate isImplicitCapturedArgumentPosition(LocalScopeVariable v) { - this = TImplicitCapturedArgumentPosition(v) - } - /** * Holds if this position represents a reference to a delegate itself. * @@ -546,10 +458,6 @@ class ArgumentPosition extends TArgumentPosition { or this.isQualifier() and result = "qualifier" or - exists(LocalScopeVariable v | - this.isImplicitCapturedArgumentPosition(v) and result = "captured " + v - ) - or this.isDelegateSelf() and result = "delegate self" } @@ -561,10 +469,5 @@ predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { or ppos.isThisParameter() and apos.isQualifier() or - exists(LocalScopeVariable v | - ppos.isImplicitCapturedParameterPosition(v) and - apos.isImplicitCapturedArgumentPosition(v) - ) - or ppos.isDelegateSelf() and apos.isDelegateSelf() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll index b35042e51da..774dc6bd86a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll @@ -24,4 +24,8 @@ module CsharpDataFlow implements InputSig { predicate mayBenefitFromCallContext = Private::mayBenefitFromCallContext/1; predicate viableImplInCallContext = Private::viableImplInCallContext/2; + + predicate neverSkipInPathGraph(Node n) { + exists(n.(AssignableDefinitionNode).getDefinition().getTargetAccess()) + } } 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 af2c6354080..64274defca3 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -129,29 +129,74 @@ private class ExprNodeImpl extends ExprNode, NodeImpl { } } +/** + * A node that represents the creation of a local function. + * + * Needed for flow through captured variables, where we treat local functions + * as if they were lambdas. + */ +abstract private class LocalFunctionCreationNode extends NodeImpl, TLocalFunctionCreationNode { + ControlFlow::Nodes::ElementNode cfn; + LocalFunction function; + boolean isPostUpdate; + + LocalFunctionCreationNode() { + this = TLocalFunctionCreationNode(cfn, isPostUpdate) and + function = cfn.getAstNode().(LocalFunctionStmt).getLocalFunction() + } + + LocalFunction getFunction() { result = function } + + ExprNode getAnAccess(boolean inSameCallable) { + result.getExpr().(LocalFunctionAccess).getTarget() = this.getFunction() and + if result.getEnclosingCallable() = this.getEnclosingCallable() + then inSameCallable = true + else inSameCallable = false + } + + override DataFlowCallable getEnclosingCallableImpl() { + result.asCallable() = cfn.getEnclosingCallable() + } + + override Type getTypeImpl() { none() } + + override DataFlowType getDataFlowType() { result.asDelegate() = function } + + override ControlFlow::Nodes::ElementNode getControlFlowNodeImpl() { none() } + + ControlFlow::Nodes::ElementNode getUnderlyingControlFlowNode() { result = cfn } + + override Location getLocationImpl() { result = cfn.getLocation() } +} + +private class LocalFunctionCreationPreNode extends LocalFunctionCreationNode { + LocalFunctionCreationPreNode() { isPostUpdate = false } + + override string toStringImpl() { result = cfn.toString() } +} + /** Calculation of the relative order in which `this` references are read. */ private module ThisFlow { private class BasicBlock = ControlFlow::BasicBlock; + /** Holds if `e` is a `this` access. */ + predicate thisAccessExpr(Expr e) { e instanceof ThisAccess or e instanceof BaseAccess } + /** Holds if `n` is a `this` access at control flow node `cfn`. */ private predicate thisAccess(Node n, ControlFlow::Node cfn) { n.(InstanceParameterNode).getCallable() = cfn.(ControlFlow::Nodes::EntryNode).getCallable() or - n.asExprAtNode(cfn) = any(Expr e | e instanceof ThisAccess or e instanceof BaseAccess) + thisAccessExpr(n.asExprAtNode(cfn)) or - n = - any(InstanceParameterAccessNode pan | - pan.getUnderlyingControlFlowNode() = cfn and pan.isPreUpdate() - ) + cfn = n.(InstanceParameterAccessPreNode).getUnderlyingControlFlowNode() } private predicate thisAccess(Node n, BasicBlock bb, int i) { thisAccess(n, bb.getNode(i)) or - exists(Parameter p | n.(PrimaryConstructorThisAccessNode).getParameter() = p | + exists(Parameter p | n.(PrimaryConstructorThisAccessPreNode).getParameter() = p | bb.getCallable() = p.getCallable() and - i = p.getPosition() + 1 and - not n instanceof PostUpdateNode + i = p.getPosition() + 1 ) } @@ -208,16 +253,10 @@ predicate hasNodePath(ControlFlowReachabilityConfiguration conf, ExprNode n1, No cfn2 = n2.(ExprNode).getControlFlowNode() ) or - exists( - ControlFlow::Node cfn, AssignableDefinition def, ControlFlow::Node cfnDef, - Ssa::ExplicitDefinition ssaDef - | - conf.hasDefPath(_, cfn, def, cfnDef) - | + exists(ControlFlow::Node cfn, AssignableDefinition def, ControlFlow::Node cfnDef | + conf.hasDefPath(_, cfn, def, cfnDef) and cfn = n1.getControlFlowNode() and - ssaDef.getADefinition() = def and - ssaDef.getControlFlowNode() = cfnDef and - n2.(SsaDefinitionExtNode).getDefinitionExt() = ssaDef + n2 = TAssignableDefinitionNode(def, cfnDef) ) } @@ -227,6 +266,234 @@ CIL::DataFlowNode asCilDataFlowNode(Node node) { result = node.asExpr() } +/** Provides logic related to captured variables. */ +module VariableCapture { + private import codeql.dataflow.VariableCapture as Shared + + private predicate closureFlowStep(ControlFlow::Nodes::ExprNode e1, ControlFlow::Nodes::ExprNode e2) { + e1 = LocalFlow::getALastEvalNode(e2) + or + exists(Ssa::Definition def | + LocalFlow::ssaDefAssigns(def.getAnUltimateDefinition(), e1) and + exists(def.getAReadAtNode(e2)) + ) + } + + private module CaptureInput implements Shared::InputSig { + private import csharp as Cs + private import semmle.code.csharp.controlflow.ControlFlowGraph + private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks + private import TaintTrackingPrivate as TaintTrackingPrivate + + class BasicBlock extends BasicBlocks::BasicBlock { + Callable getEnclosingCallable() { result = super.getCallable() } + } + + BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { + result = bb.getImmediateDominator() + } + + BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } + + private predicate thisAccess(ControlFlow::Node cfn, InstanceCallable c) { + ThisFlow::thisAccessExpr(cfn.getAstNode()) and + cfn.getEnclosingCallable().getEnclosingCallable*() = c + } + + private predicate capturedThisAccess(ControlFlow::Node cfn, InstanceCallable c) { + thisAccess(cfn, c) and + cfn.getEnclosingCallable() != c + } + + private newtype TCapturedVariable = + TCapturedLocalScopeVariable(LocalScopeVariable v) { + v.isCaptured() and not v.(Parameter).getCallable() instanceof PrimaryConstructor + } or + TCapturedThis(Callable c) { capturedThisAccess(_, c) } + + /** A captured local scope variable. Includes captured `this` variables. */ + class CapturedVariable extends TCapturedVariable { + LocalScopeVariable asLocalScopeVariable() { this = TCapturedLocalScopeVariable(result) } + + Callable asThis() { this = TCapturedThis(result) } + + Callable getCallable() { + result = this.asLocalScopeVariable().getCallable() + or + result = this.asThis() + } + + Type getType() { + result = this.asLocalScopeVariable().getType() + or + result = this.asThis().getDeclaringType() + } + + string toString() { + result = this.asLocalScopeVariable().toString() + or + result = "this in " + this.asThis() + } + + Location getLocation() { + result = this.asLocalScopeVariable().getLocation() + or + result = this.asThis().getLocation() + } + } + + abstract class CapturedParameter extends CapturedVariable { + abstract ParameterNodeImpl getParameterNode(); + } + + private class CapturedExplicitParameter extends CapturedParameter, TCapturedLocalScopeVariable { + private Parameter p; + + CapturedExplicitParameter() { p = this.asLocalScopeVariable() } + + override ExplicitParameterNode getParameterNode() { result.asParameter() = p } + } + + private class CapturedThisParameter extends CapturedParameter, TCapturedThis { + override InstanceParameterNode getParameterNode() { + result = TInstanceParameterNode(this.asThis()) + } + } + + class Expr extends ControlFlow::Node { + predicate hasCfgNode(BasicBlock bb, int i) { this = bb.getNode(i) } + } + + class VariableWrite extends Expr { + CapturedVariable v; + AssignableDefinition def; + + VariableWrite() { + def.getTarget() = v.asLocalScopeVariable() and + this = def.getAControlFlowNode() and + // the shared variable capture library inserts implicit parameter definitions + not def instanceof AssignableDefinitions::ImplicitParameterDefinition + } + + ControlFlow::Node getRhs() { LocalFlow::defAssigns(def, this, result) } + + CapturedVariable getVariable() { result = v } + } + + class VariableRead extends Expr { + CapturedVariable v; + + VariableRead() { + this.getAstNode().(AssignableRead).getTarget() = v.asLocalScopeVariable() + or + thisAccess(this, v.asThis()) + } + + CapturedVariable getVariable() { result = v } + } + + class ClosureExpr extends Expr { + Callable c; + + ClosureExpr() { lambdaCreationExpr(this.getAstNode(), c) } + + predicate hasBody(Callable body) { body = c } + + predicate hasAliasedAccess(Expr f) { closureFlowStep+(this, f) and not closureFlowStep(f, _) } + } + + class Callable extends Cs::Callable { + predicate isConstructor() { this instanceof Constructor } + } + } + + class CapturedVariable = CaptureInput::CapturedVariable; + + class ClosureExpr = CaptureInput::ClosureExpr; + + module Flow = Shared::Flow; + + private Flow::ClosureNode asClosureNode(Node n) { + result = n.(CaptureNode).getSynthesizedCaptureNode() + or + result.(Flow::ExprNode).getExpr() = + [ + n.(ExprNode).getControlFlowNode(), + n.(LocalFunctionCreationPreNode).getUnderlyingControlFlowNode() + ] + or + result.(Flow::VariableWriteSourceNode).getVariableWrite().getRhs() = + n.(ExprNode).getControlFlowNode() + or + result.(Flow::ExprPostUpdateNode).getExpr() = + [ + n.(PostUpdateNode).getPreUpdateNode().(ExprNode).getControlFlowNode(), + n.(LocalFunctionCreationPostUpdateNode).getUnderlyingControlFlowNode() + ] + or + result.(Flow::ParameterNode).getParameter().getParameterNode() = n + or + result.(Flow::ThisParameterNode).getCallable() = n.(DelegateSelfReferenceNode).getCallable() + } + + CapturedVariable getCapturedVariableContent(CapturedVariableContent c) { + c = TCapturedVariableContent(result) + } + + predicate storeStep(Node node1, CapturedVariableContent c, Node node2) { + Flow::storeStep(asClosureNode(node1), getCapturedVariableContent(c), asClosureNode(node2)) + } + + predicate readStep(Node node1, CapturedVariableContent c, Node node2) { + Flow::readStep(asClosureNode(node1), getCapturedVariableContent(c), asClosureNode(node2)) + } + + predicate valueStep(Node node1, Node node2) { + Flow::localFlowStep(asClosureNode(node1), asClosureNode(node2)) + } + + predicate clearsContent(Node node, CapturedVariableContent c) { + Flow::clearsContent(asClosureNode(node), getCapturedVariableContent(c)) + } + + class CapturedSsaDefinitionExt extends SsaImpl::DefinitionExt { + CapturedSsaDefinitionExt() { + this.getSourceVariable().getAssignable() = any(CapturedVariable v).asLocalScopeVariable() + } + } + + private predicate flowInsensitiveWriteStep( + ExprNode node1, FlowInsensitiveCapturedVariableNode node2, LocalScopeVariable v + ) { + exists(AssignableDefinition def | + def.getSource() = node1.getExpr() and + def.getTarget() = v and + node2.getVariable() = v + ) + } + + private predicate flowInsensitiveReadStep( + FlowInsensitiveCapturedVariableNode node1, ExprNode node2, LocalScopeVariable v + ) { + node1.getVariable() = v and + node2.getExpr().(VariableRead).getTarget() = v + } + + /** + * Holds if there is control-flow insensitive data-flow from `node1` to `node2` + * involving a captured variable. Only used in lambda flow. + */ + predicate flowInsensitiveStep(Node node1, Node node2) { + exists(LocalScopeVariable v | + flowInsensitiveWriteStep(node1, node2, v) and + flowInsensitiveReadStep(_, _, v) + or + flowInsensitiveReadStep(node1, node2, v) and + flowInsensitiveWriteStep(_, _, v) + ) + } +} + /** Provides predicates related to local data flow. */ module LocalFlow { class LocalExprStepConfiguration extends ControlFlowReachabilityConfiguration { @@ -348,6 +615,18 @@ module LocalFlow { } } + predicate defAssigns(AssignableDefinition def, ControlFlow::Node cfnDef, ControlFlow::Node value) { + any(LocalExprStepConfiguration x).hasDefPath(_, value, def, cfnDef) + } + + predicate ssaDefAssigns(Ssa::ExplicitDefinition ssaDef, ControlFlow::Nodes::ExprNode value) { + exists(AssignableDefinition def, ControlFlow::Node cfnDef | + any(LocalExprStepConfiguration conf).hasDefPath(_, value, def, cfnDef) and + ssaDef.getADefinition() = def and + ssaDef.getControlFlowNode() = cfnDef + ) + } + /** * An uncertain SSA definition. Either an uncertain explicit definition or an * uncertain qualifier definition. @@ -448,15 +727,6 @@ module LocalFlow { ) } - predicate localFlowCapturedVarStep(Node nodeFrom, ImplicitCapturedArgumentNode nodeTo) { - // Flow from SSA definition to implicit captured variable argument - exists(Ssa::ExplicitDefinition def, ControlFlow::Nodes::ElementNode call | - def = getSsaDefinitionExt(nodeFrom) and - def.isCapturedVariableDefinitionFlowIn(_, call, _) and - nodeTo = TImplicitCapturedArgumentNode(call, def.getSourceVariable().getAssignable()) - ) - } - private module CilFlow { /** * Holds if `nodeFrom` is a last node referencing SSA definition `def`, which @@ -531,11 +801,6 @@ module LocalFlow { } predicate localFlowStepCommon(Node nodeFrom, Node nodeTo) { - exists(SsaImpl::DefinitionExt def | - localSsaFlowStep(def, nodeFrom, nodeTo) and - not usesInstanceField(def) - ) - or hasNodePath(any(LocalExprStepConfiguration x), nodeFrom, nodeTo) or ThisFlow::adjacentThisRefs(nodeFrom, nodeTo) and @@ -544,6 +809,13 @@ module LocalFlow { ThisFlow::adjacentThisRefs(nodeFrom.(PostUpdateNode).getPreUpdateNode(), nodeTo) or CilFlow::localFlowStepCil(nodeFrom, nodeTo) + or + exists(AssignableDefinition def, ControlFlow::Node cfn, Ssa::ExplicitDefinition ssaDef | + ssaDef.getADefinition() = def and + ssaDef.getControlFlowNode() = cfn and + nodeFrom = TAssignableDefinitionNode(def, cfn) and + nodeTo.(SsaDefinitionExtNode).getDefinitionExt() = ssaDef + ) } /** @@ -553,14 +825,14 @@ module LocalFlow { */ predicate excludeFromExposedRelations(Node n) { n instanceof FlowSummaryNode or - n instanceof ImplicitCapturedArgumentNode + n instanceof CaptureNode } /** * Gets a node that may execute last in `n`, and which, when it executes last, * will be the value of `n`. */ - private ControlFlow::Nodes::ExprNode getALastEvalNode(ControlFlow::Nodes::ExprNode cfn) { + ControlFlow::Nodes::ExprNode getALastEvalNode(ControlFlow::Nodes::ExprNode cfn) { exists(Expr e | any(LocalExprStepConfiguration x).hasExprPath(_, result, e, cfn) | e instanceof ConditionalExpr or e instanceof Cast or @@ -599,7 +871,7 @@ module LocalFlow { or hasNodePath(any(LocalExprStepConfiguration x), node1, node2) and ( - node2 instanceof SsaDefinitionExtNode or + node2 instanceof AssignableDefinitionNode or node2.asExpr() instanceof Cast or node2.asExpr() instanceof AssignExpr ) @@ -631,26 +903,32 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo) { LocalFlow::localFlowStepCommon(nodeFrom, nodeTo) or exists(SsaImpl::DefinitionExt def | + not LocalFlow::usesInstanceField(def) and + not def instanceof VariableCapture::CapturedSsaDefinitionExt + | + LocalFlow::localSsaFlowStep(def, nodeFrom, nodeTo) + or LocalFlow::localSsaFlowStepUseUse(def, nodeFrom, nodeTo) and not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _) and - not LocalFlow::usesInstanceField(def) and nodeFrom != nodeTo - ) - or - // Flow into phi (read)/uncertain SSA definition node from read - exists(Node read | LocalFlow::localFlowSsaInputFromRead(read, _, nodeTo) | - nodeFrom = read and - not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _) or - nodeFrom.(PostUpdateNode).getPreUpdateNode() = read + // Flow into phi (read)/uncertain SSA definition node from read + exists(Node read | LocalFlow::localFlowSsaInputFromRead(read, def, nodeTo) | + nodeFrom = read and + not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _) + or + nodeFrom.(PostUpdateNode).getPreUpdateNode() = read + ) ) or - LocalFlow::localFlowCapturedVarStep(nodeFrom, nodeTo) - or FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), nodeTo.(FlowSummaryNode).getSummaryNode(), true) or nodeTo.(ObjectCreationNode).getPreUpdateNode() = nodeFrom.(ObjectInitializerNode) + or + VariableCapture::valueStep(nodeFrom, nodeTo) + or + nodeTo = nodeFrom.(LocalFunctionCreationNode).getAnAccess(true) } /** @@ -880,6 +1158,18 @@ private Gvn::GvnType getANonTypeParameterSubTypeRestricted(RelevantGvnType t) { result = getANonTypeParameterSubType(t) } +/** A callable with an implicit `this` parameter. */ +private class InstanceCallable extends Callable { + InstanceCallable() { + this = any(DataFlowCallable dfc).asCallable() and + not this.(Modifiable).isStatic() and + // local functions and delegate capture `this` and should therefore + // not have a `this` parameter + not this instanceof LocalFunction and + not this instanceof AnonymousFunctionExpr + } +} + /** A collection of cached types and predicates to be evaluated in the same stage. */ cached private module Cached { @@ -906,25 +1196,25 @@ private module Cached { not def.(Ssa::ExplicitDefinition).getADefinition() instanceof AssignableDefinitions::ImplicitParameterDefinition } or + TAssignableDefinitionNode(AssignableDefinition def, ControlFlow::Node cfn) { + cfn = def.getAControlFlowNode() and + // Handled by `TExplicitParameterNode` below + not def instanceof AssignableDefinitions::ImplicitParameterDefinition + } or TExplicitParameterNode(DotNet::Parameter p) { p = any(DataFlowCallable dfc).asCallable().getAParameter() } or - TInstanceParameterNode(Callable c) { - c = any(DataFlowCallable dfc).asCallable() and - not c.(Modifiable).isStatic() - } or + TInstanceParameterNode(InstanceCallable c) or TDelegateSelfReferenceNode(Callable c) { lambdaCreationExpr(_, c) } or + TLocalFunctionCreationNode(ControlFlow::Nodes::ElementNode cfn, Boolean isPostUpdate) { + cfn.getAstNode() instanceof LocalFunctionStmt + } or TYieldReturnNode(ControlFlow::Nodes::ElementNode cfn) { any(Callable c).canYieldReturn(cfn.getAstNode()) } or TAsyncReturnNode(ControlFlow::Nodes::ElementNode cfn) { any(Callable c | c.(Modifiable).isAsync()).canReturn(cfn.getAstNode()) } or - TImplicitCapturedArgumentNode(ControlFlow::Nodes::ElementNode cfn, LocalScopeVariable v) { - exists(Ssa::ExplicitDefinition def | def.isCapturedVariableDefinitionFlowIn(_, cfn, _) | - v = def.getSourceVariable().getAssignable() - ) - } or TMallocNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getAstNode() instanceof ObjectCreation } or TObjectInitializerNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getAstNode().(ObjectCreation).hasInitializer() @@ -947,18 +1237,22 @@ private module Cached { arrayRead(e, read) ) ) + or + lambdaCallExpr(_, cfn) } or TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) or TParamsArgumentNode(ControlFlow::Node callCfn) { callCfn = any(Call c | isParamsArg(c, _, _)).getAControlFlowNode() } or TFlowInsensitiveFieldNode(FieldOrProperty f) { f.isFieldLike() } or + TFlowInsensitiveCapturedVariableNode(LocalScopeVariable v) { v.isCaptured() } or TInstanceParameterAccessNode(ControlFlow::Node cfn, Boolean isPostUpdate) { cfn = getAPrimaryConstructorParameterCfn(_) } or TPrimaryConstructorThisAccessNode(Parameter p, Boolean isPostUpdate) { p.getCallable() instanceof PrimaryConstructor - } + } or + TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn) /** * Holds if data flows from `nodeFrom` to `nodeTo` in exactly one local @@ -971,10 +1265,7 @@ private module Cached { LocalFlow::localSsaFlowStepUseUse(_, nodeFrom, nodeTo) and nodeFrom != nodeTo or - exists(SsaImpl::DefinitionExt def | - LocalFlow::localSsaFlowStep(def, nodeFrom, nodeTo) and - LocalFlow::usesInstanceField(def) - ) + LocalFlow::localSsaFlowStep(_, nodeFrom, nodeTo) or // Flow into phi (read)/uncertain SSA definition node from read exists(Node read | LocalFlow::localFlowSsaInputFromRead(read, _, nodeTo) | @@ -997,7 +1288,8 @@ private module Cached { TSyntheticFieldContent(SyntheticField f) or TPrimaryConstructorParameterContent(Parameter p) { p.getCallable() instanceof PrimaryConstructor - } + } or + TCapturedVariableContent(VariableCapture::CapturedVariable v) cached newtype TContentApprox = @@ -1007,7 +1299,8 @@ private module Cached { TSyntheticFieldApproxContent() or TPrimaryConstructorParameterApproxContent(string firstChar) { firstChar = approximatePrimaryConstructorParameterContent(_) - } + } or + TCapturedVariableContentApprox(VariableCapture::CapturedVariable v) pragma[nomagic] private predicate commonSubTypeGeneral(DataFlowTypeOrUnifiable t1, RelevantGvnType t2) { @@ -1044,15 +1337,7 @@ import Cached /** Holds if `n` should be hidden from path explanations. */ predicate nodeIsHidden(Node n) { - exists(SsaImpl::DefinitionExt def | def = n.(SsaDefinitionExtNode).getDefinitionExt() | - def instanceof Ssa::PhiNode - or - def instanceof SsaImpl::PhiReadNode - or - def instanceof Ssa::ImplicitEntryDefinition - or - def instanceof Ssa::ImplicitCallDefinition - ) + n instanceof SsaDefinitionExtNode or exists(Parameter p | p = n.(ParameterNode).getParameter() | not p.fromSource()) or @@ -1065,8 +1350,6 @@ predicate nodeIsHidden(Node n) { or n instanceof AsyncReturnNode or - n instanceof ImplicitCapturedArgumentNode - or n instanceof MallocNode or n instanceof FlowSummaryNode @@ -1080,6 +1363,12 @@ predicate nodeIsHidden(Node n) { n instanceof InstanceParameterAccessNode or n instanceof PrimaryConstructorThisAccessNode + or + n = any(AssignableDefinitionNode def | not exists(def.getDefinition().getTargetAccess())) + or + n instanceof DelegateSelfReferenceNode + or + n instanceof CaptureNode } /** A CIL SSA definition, viewed as a node in a data flow graph. */ @@ -1128,6 +1417,43 @@ class SsaDefinitionExtNode extends NodeImpl, TSsaDefinitionExtNode { override string toStringImpl() { result = def.toString() } } +/** A definition, viewed as a node in a data flow graph. */ +class AssignableDefinitionNodeImpl extends NodeImpl, TAssignableDefinitionNode { + private AssignableDefinition def; + private ControlFlow::Node cfn_; + + AssignableDefinitionNodeImpl() { this = TAssignableDefinitionNode(def, cfn_) } + + /** Gets the underlying definition. */ + AssignableDefinition getDefinition() { result = def } + + /** Gets the underlying definition, at control flow node `cfn`, if any. */ + AssignableDefinition getDefinitionAtNode(ControlFlow::Node cfn) { + result = def and + cfn = cfn_ + } + + override DataFlowCallable getEnclosingCallableImpl() { + result.asCallable() = cfn_.getEnclosingCallable() + } + + override Type getTypeImpl() { result = def.getTarget().getType() } + + override ControlFlow::Node getControlFlowNodeImpl() { result = cfn_ } + + override Location getLocationImpl() { + result = def.getTargetAccess().getLocation() + or + not exists(def.getTargetAccess()) and result = def.getLocation() + } + + override string toStringImpl() { + result = def.getTargetAccess().toString() + or + not exists(def.getTargetAccess()) and result = def.toString() + } +} + abstract class ParameterNodeImpl extends NodeImpl { abstract predicate isParameterOf(DataFlowCallable c, ParameterPosition pos); } @@ -1196,7 +1522,7 @@ private module ParameterNodes { * This is used for improving lambda dispatch, and will eventually also be * used for tracking flow through captured variables. */ - private class DelegateSelfReferenceNode extends ParameterNodeImpl, TDelegateSelfReferenceNode { + class DelegateSelfReferenceNode extends ParameterNodeImpl, TDelegateSelfReferenceNode { private Callable callable; DelegateSelfReferenceNode() { this = TDelegateSelfReferenceNode(callable) } @@ -1229,35 +1555,6 @@ private module ParameterNodes { LocalScopeVariable getVariable() { result = v } } - /** - * The value of an implicit captured variable parameter at function entry, - * viewed as a node in a data flow graph. - * - * An implicit parameter is added in order to be able to track flow into - * capturing callables, as if an explicit `ref` parameter had been used: - * - * ```csharp - * void M() { void M() { - * int i = 0; int i = 0; - * void In() { => void In(ref int i0) { // implicit i0 parameter - * Use(i); Use(i0); - * } } - * In(); In(ref i); - * } } - * ``` - */ - class ImplicitCapturedParameterNode extends ParameterNodeImpl, SsaDefinitionExtNode { - ImplicitCapturedParameterNode() { def instanceof SsaCapturedEntryDefinition } - - /** Gets the captured variable that this implicit parameter models. */ - LocalScopeVariable getVariable() { result = def.(SsaCapturedEntryDefinition).getVariable() } - - override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { - pos.isImplicitCapturedParameterPosition(def.getSourceVariable().getAssignable()) and - c.asCallable() = this.getEnclosingCallable() - } - } - /** A parameter for a library callable with a flow summary. */ class SummaryParameterNode extends ParameterNodeImpl, FlowSummaryNode { private ParameterPosition pos_; @@ -1334,10 +1631,10 @@ private module ArgumentNodes { } /** A data-flow node that represents a delegate passed into itself. */ - class DelegateSelfArgumentNode extends ArgumentNodeImpl { + class DelegateSelfArgumentNode extends ArgumentNodeImpl, ExprNode { private DataFlowCall call_; - DelegateSelfArgumentNode() { lambdaCallExpr(call_, this) } + DelegateSelfArgumentNode() { lambdaCallExpr(call_, this.getControlFlowNode()) } override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { call = call_ and @@ -1345,48 +1642,6 @@ private module ArgumentNodes { } } - /** - * The value of a captured variable as an implicit argument of a call, viewed - * as a node in a data flow graph. - * - * An implicit node is added in order to be able to track flow into capturing - * callables, as if an explicit parameter had been used: - * - * ```csharp - * void M() { void M() { - * int i = 0; int i = 0; - * void Out() { i = 1; } => void Out(ref int i0) { i0 = 1; } - * Out(); Out(ref i); // implicit argument - * Use(i); Use(i) - * } } - * ``` - */ - class ImplicitCapturedArgumentNode extends ArgumentNodeImpl, NodeImpl, - TImplicitCapturedArgumentNode - { - private LocalScopeVariable v; - private ControlFlow::Nodes::ElementNode cfn; - - ImplicitCapturedArgumentNode() { this = TImplicitCapturedArgumentNode(cfn, v) } - - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { - pos.isImplicitCapturedArgumentPosition(v) and - call.getControlFlowNode() = cfn - } - - override DataFlowCallable getEnclosingCallableImpl() { - result.asCallable() = cfn.getEnclosingCallable() - } - - override Type getTypeImpl() { result = v.getType() } - - override ControlFlow::Node getControlFlowNodeImpl() { none() } - - override Location getLocationImpl() { result = cfn.getLocation() } - - override string toStringImpl() { result = "[implicit argument] " + v } - } - /** * A node that corresponds to the value of an object creation (`new C()`) before * the constructor has run. @@ -1571,45 +1826,6 @@ private module ReturnNodes { override string toStringImpl() { result = expr.toString() } } - /** - * The value of a captured variable as an implicit return from a call, viewed - * as a node in a data flow graph. - * - * An implicit node is added in order to be able to track flow out of capturing - * callables, as if an explicit `ref` parameter had been used: - * - * ```csharp - * void M() { void M() { - * int i = 0; int i = 0; - * void Out() { void Out(ref int i0) { - * i = 1; => i0 = 1; // implicit return - * } } - * Out(); Out(ref i); - * Use(i); Use(i) - * } } - * ``` - */ - class ImplicitCapturedReturnNode extends ReturnNode, SsaDefinitionExtNode { - private Ssa::ExplicitDefinition edef; - - ImplicitCapturedReturnNode() { - edef = this.getDefinitionExt() and - edef.isCapturedVariableDefinitionFlowOut(_, _) - } - - /** - * Holds if the value at this node may flow out to the implicit call definition - * at `node`, using one or more calls. - */ - predicate flowsOutTo(SsaDefinitionExtNode node, boolean additionalCalls) { - edef.isCapturedVariableDefinitionFlowOut(node.getDefinitionExt(), additionalCalls) - } - - override ImplicitCapturedReturnKind getKind() { - result.getVariable() = edef.getSourceVariable().getAssignable() - } - } - private class SummaryReturnNode extends FlowSummaryNode, ReturnNode { private ReturnKind rk; @@ -1704,32 +1920,6 @@ private module OutNodes { } } - /** - * A data-flow node that reads a value returned implicitly by a callable - * using a captured variable. - */ - class CapturedOutNode extends OutNode, SsaDefinitionExtNode { - private DataFlowCall call; - - CapturedOutNode() { - exists(ImplicitCapturedReturnNode n, boolean additionalCalls, ControlFlow::Node cfn | - n.flowsOutTo(this, additionalCalls) and - cfn = this.getDefinitionExt().(Ssa::Definition).getControlFlowNode() - | - additionalCalls = false and call = csharpCall(_, cfn) - or - additionalCalls = true and - call = TTransitiveCapturedCall(cfn) - ) - } - - override DataFlowCall getCall(ReturnKind kind) { - result = call and - kind.(ImplicitCapturedReturnKind).getVariable() = - this.getDefinitionExt().getSourceVariable().getAssignable() - } - } - /** * A data-flow node that reads a value returned by a callable using an * `out` or `ref` parameter. @@ -1804,10 +1994,10 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { * Both models need a pre-update this node, and the latter need an additional post-update this access, * all of which are represented by an `InstanceParameterAccessNode` node. */ -class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode { - private ControlFlow::Node cfn; - private boolean isPostUpdate; - private Parameter p; +abstract private class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode { + ControlFlow::Node cfn; + boolean isPostUpdate; + Parameter p; InstanceParameterAccessNode() { this = TInstanceParameterAccessNode(cfn, isPostUpdate) and @@ -1824,8 +2014,6 @@ class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode override Location getLocationImpl() { result = cfn.getLocation() } - override string toStringImpl() { result = "this" } - /** * Gets the underlying control flow node. */ @@ -1835,11 +2023,12 @@ class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode * Gets the primary constructor parameter that this is a this access to. */ Parameter getParameter() { result = p } +} - /** - * Holds if the this parameter access node corresponds to a pre-update node. - */ - predicate isPreUpdate() { isPostUpdate = false } +private class InstanceParameterAccessPreNode extends InstanceParameterAccessNode { + InstanceParameterAccessPreNode() { isPostUpdate = false } + + override string toStringImpl() { result = "this" } } /** @@ -1855,9 +2044,11 @@ class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode * ``` * The synthesized (pre/post-update) this access is represented an `PrimaryConstructorThisAccessNode` node. */ -class PrimaryConstructorThisAccessNode extends NodeImpl, TPrimaryConstructorThisAccessNode { - private Parameter p; - private boolean isPostUpdate; +abstract private class PrimaryConstructorThisAccessNode extends NodeImpl, + TPrimaryConstructorThisAccessNode +{ + Parameter p; + boolean isPostUpdate; PrimaryConstructorThisAccessNode() { this = TPrimaryConstructorThisAccessNode(p, isPostUpdate) } @@ -1882,6 +2073,44 @@ class PrimaryConstructorThisAccessNode extends NodeImpl, TPrimaryConstructorThis predicate isPostUpdate() { isPostUpdate = true } } +private class PrimaryConstructorThisAccessPreNode extends PrimaryConstructorThisAccessNode { + PrimaryConstructorThisAccessPreNode() { isPostUpdate = false } + + override string toStringImpl() { result = "this" } +} + +/** + * A synthesized data flow node representing a closure object that tracks + * captured variables. + */ +class CaptureNode extends NodeImpl, TCaptureNode { + VariableCapture::Flow::SynthesizedCaptureNode cn; + + CaptureNode() { this = TCaptureNode(cn) } + + VariableCapture::Flow::SynthesizedCaptureNode getSynthesizedCaptureNode() { result = cn } + + override DataFlowCallable getEnclosingCallableImpl() { + result.asCallable() = cn.getEnclosingCallable() + } + + override Type getTypeImpl() { + exists(VariableCapture::CapturedVariable v | cn.isVariableAccess(v) and result = v.getType()) + } + + override DataFlowType getDataFlowType() { + if cn.isInstanceAccess() + then result.asDelegate() = cn.getEnclosingCallable() + else result = super.getDataFlowType() + } + + override ControlFlow::Node getControlFlowNodeImpl() { none() } + + override Location getLocationImpl() { result = cn.getLocation() } + + override string toStringImpl() { result = cn.toString() } +} + /** A field or a property. */ class FieldOrProperty extends Assignable, Modifiable { FieldOrProperty() { @@ -1899,6 +2128,8 @@ class FieldOrProperty extends Assignable, Modifiable { ( p.isAutoImplemented() or + p.isAutoImplementedReadOnly() + or p.matchesHandle(any(CIL::TrivialProperty tp)) or p.getDeclaringType() instanceof AnonymousClass @@ -1965,6 +2196,30 @@ class FlowInsensitiveFieldNode extends NodeImpl, TFlowInsensitiveFieldNode { override string toStringImpl() { result = "[flow-insensitive] " + f } } +/** + * A data flow node used for control-flow insensitive flow through captured + * variables. + * + * Only used in lambda flow. + */ +class FlowInsensitiveCapturedVariableNode extends NodeImpl, TFlowInsensitiveCapturedVariableNode { + private LocalScopeVariable v; + + FlowInsensitiveCapturedVariableNode() { this = TFlowInsensitiveCapturedVariableNode(v) } + + LocalScopeVariable getVariable() { result = v } + + override DataFlowCallable getEnclosingCallableImpl() { result.asCapturedVariable() = v } + + override Type getTypeImpl() { result = v.getType() } + + override ControlFlow::Node getControlFlowNodeImpl() { none() } + + override Location getLocationImpl() { result = v.getLocation() } + + override string toStringImpl() { result = "[flow-insensitive] " + v } +} + /** * Holds if `pred` can flow to `succ`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* @@ -1987,6 +2242,8 @@ predicate jumpStep(Node pred, Node succ) { or FlowSummaryImpl::Private::Steps::summaryJumpStep(pred.(FlowSummaryNode).getSummaryNode(), succ.(FlowSummaryNode).getSummaryNode()) + or + succ = pred.(LocalFunctionCreationNode).getAnAccess(false) } private class StoreStepConfiguration extends ControlFlowReachabilityConfiguration { @@ -2019,12 +2276,11 @@ private PropertyContent getResultContent() { } private predicate primaryConstructorParameterStore( - SsaDefinitionExtNode node1, PrimaryConstructorParameterContent c, Node node2 + AssignableDefinitionNode node1, PrimaryConstructorParameterContent c, Node node2 ) { - exists(Ssa::ExplicitDefinition def, ControlFlow::Node cfn, Parameter p | - def = node1.getDefinitionExt() and - p = def.getSourceVariable().getAssignable() and - cfn = def.getControlFlowNode() and + exists(AssignableDefinition def, ControlFlow::Node cfn, Parameter p | + node1 = TAssignableDefinitionNode(def, cfn) and + p = def.getTarget() and node2 = TInstanceParameterAccessNode(cfn, true) and c.getParameter() = p ) @@ -2072,11 +2328,15 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { exists(Parameter p | node1 = TExplicitParameterNode(p) and node2 = TPrimaryConstructorThisAccessNode(p, true) and - c.(PrimaryConstructorParameterContent).getParameter() = p + if p.getCallable().getDeclaringType() instanceof RecordType + then c.(PropertyContent).getProperty().getName() = p.getName() + else c.(PrimaryConstructorParameterContent).getParameter() = p ) or FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(FlowSummaryNode).getSummaryNode(), c, node2.(FlowSummaryNode).getSummaryNode()) + or + VariableCapture::storeStep(node1, c, node2) } private class ReadStepConfiguration extends ControlFlowReachabilityConfiguration { @@ -2168,10 +2428,9 @@ predicate readStep(Node node1, ContentSet c, Node node2) { c = getResultContent() or node1 = - any(InstanceParameterAccessNode n | + any(InstanceParameterAccessPreNode n | n.getUnderlyingControlFlowNode() = node2.(ExprNode).getControlFlowNode() and - n.getParameter() = c.(PrimaryConstructorParameterContent).getParameter() and - n.isPreUpdate() + n.getParameter() = c.(PrimaryConstructorParameterContent).getParameter() ) and node2.asExpr() instanceof ParameterRead or @@ -2189,18 +2448,16 @@ predicate readStep(Node node1, ContentSet c, Node node2) { hasNodePath(x, node1, node2) or // item = variable in node1 = (..., variable, ...) - exists(AssignableDefinitions::TupleAssignmentDefinition tad, Ssa::ExplicitDefinition def | - node2.(SsaDefinitionExtNode).getDefinitionExt() = def and - def.getADefinition() = tad and + exists(AssignableDefinitions::TupleAssignmentDefinition tad | + node2.(AssignableDefinitionNode).getDefinition() = tad and tad.getLeaf() = item and hasNodePath(x, node1, node2) ) or // item = variable in node1 = (..., variable, ...) in a case/is var (..., ...) te = any(PatternExpr pe).getAChildExpr*() and - exists(AssignableDefinitions::LocalVariableDefinition lvd, Ssa::ExplicitDefinition def | - node2.(SsaDefinitionExtNode).getDefinitionExt() = def and - def.getADefinition() = lvd and + exists(AssignableDefinitions::LocalVariableDefinition lvd | + node2.(AssignableDefinitionNode).getDefinition() = lvd and lvd.getDeclaration() = item and hasNodePath(x, node1, node2) ) @@ -2209,6 +2466,8 @@ predicate readStep(Node node1, ContentSet c, Node node2) { or FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c, node2.(FlowSummaryNode).getSummaryNode()) + or + VariableCapture::readStep(node1, c, node2) } /** @@ -2239,6 +2498,8 @@ predicate clearsContent(Node n, ContentSet c) { ) or n = any(PostUpdateNode n1 | primaryConstructorParameterStore(_, c, n1)).getPreUpdateNode() + or + VariableCapture::clearsContent(n, c) } /** @@ -2287,7 +2548,7 @@ class DataFlowType extends TDataFlowType { * For methods used as method groups in calls there can be multiple * creations associated with the same type. */ - Expr getADelegateCreation() { + ControlFlowElement getADelegateCreation() { exists(Callable callable | lambdaCreationExpr(result, callable) and this = TDelegateDataFlowType(callable) @@ -2312,7 +2573,10 @@ DataFlowType getNodeType(Node n) { result = getNodeType(arg) ) or - n.asExpr() = result.getADelegateCreation() + [ + n.asExpr().(ControlFlowElement), + n.(LocalFunctionCreationPreNode).getUnderlyingControlFlowNode().getAstNode() + ] = result.getADelegateCreation() } /** Gets a string representation of a `DataFlowType`. */ @@ -2532,11 +2796,11 @@ module PostUpdateNodes { private class InstanceParameterAccessPostUpdateNode extends PostUpdateNode, InstanceParameterAccessNode { - private ControlFlow::Node cfn; + InstanceParameterAccessPostUpdateNode() { isPostUpdate = true } - InstanceParameterAccessPostUpdateNode() { this = TInstanceParameterAccessNode(cfn, true) } - - override Node getPreUpdateNode() { result = TInstanceParameterAccessNode(cfn, false) } + override InstanceParameterAccessPreNode getPreUpdateNode() { + result = TInstanceParameterAccessNode(cfn, false) + } override string toStringImpl() { result = "[post] this" } } @@ -2544,16 +2808,37 @@ module PostUpdateNodes { private class PrimaryConstructorThisAccessPostUpdateNode extends PostUpdateNode, PrimaryConstructorThisAccessNode { - private Parameter p; + PrimaryConstructorThisAccessPostUpdateNode() { isPostUpdate = true } - PrimaryConstructorThisAccessPostUpdateNode() { - this = TPrimaryConstructorThisAccessNode(p, true) + override PrimaryConstructorThisAccessPreNode getPreUpdateNode() { + result = TPrimaryConstructorThisAccessNode(p, false) } - override Node getPreUpdateNode() { result = TPrimaryConstructorThisAccessNode(p, false) } - override string toStringImpl() { result = "[post] this" } } + + class LocalFunctionCreationPostUpdateNode extends LocalFunctionCreationNode, PostUpdateNode { + LocalFunctionCreationPostUpdateNode() { isPostUpdate = true } + + override LocalFunctionCreationPreNode getPreUpdateNode() { + result = TLocalFunctionCreationNode(cfn, false) + } + + override string toStringImpl() { result = "[post] " + cfn } + } + + private class CapturePostUpdateNode extends PostUpdateNode, CaptureNode { + private CaptureNode pre; + + CapturePostUpdateNode() { + VariableCapture::Flow::capturePostUpdateNode(this.getSynthesizedCaptureNode(), + pre.getSynthesizedCaptureNode()) + } + + override CaptureNode getPreUpdateNode() { result = pre } + + override string toStringImpl() { result = "[post] " + cn } + } } private import PostUpdateNodes @@ -2607,12 +2892,13 @@ int accessPathLimit() { result = 5 } */ predicate forceHighPrecision(Content c) { c instanceof ElementContent } -private predicate lambdaCreationExpr(Expr creation, Callable c) { +private predicate lambdaCreationExpr(ControlFlowElement creation, Callable c) { c = [ creation.(AnonymousFunctionExpr), creation.(CallableAccess).getTarget().getUnboundDeclaration(), - creation.(AddressOfExpr).getOperand().(CallableAccess).getTarget().getUnboundDeclaration() + creation.(AddressOfExpr).getOperand().(CallableAccess).getTarget().getUnboundDeclaration(), + creation.(LocalFunctionStmt).getLocalFunction() ] } @@ -2639,19 +2925,32 @@ private class LambdaConfiguration extends ControlFlowReachabilityConfiguration { exactScope = false and scope = e2 and isSuccessor = true + or + e1.(LocalFunctionAccess).getParent() = e2.(LocalFunctionCall) and + exactScope = false and + scope = e2 and + isSuccessor = true } } -private predicate lambdaCallExpr(DataFlowCall call, ExprNode receiver) { +private predicate lambdaCallExpr(DataFlowCall call, ControlFlow::Node receiver) { exists(LambdaConfiguration x, DelegateLikeCall dc | - x.hasExprPath(dc.getExpr(), receiver.getControlFlowNode(), dc, call.getControlFlowNode()) + x.hasExprPath(dc.getExpr(), receiver, dc, call.getControlFlowNode()) + ) + or + // In local function calls, `F()`, we use the local function access `F` + // to represent the receiver. Only needed for flow through captured variables. + exists(LambdaConfiguration x, LocalFunctionCall fc | + x.hasExprPath(fc.getAChild(), receiver, fc, call.getControlFlowNode()) ) } /** Holds if `call` is a lambda call where `receiver` is the lambda expression. */ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { ( - lambdaCallExpr(call, receiver) + lambdaCallExpr(call, receiver.(ExprNode).getControlFlowNode()) and + // local function calls can be resolved directly without a flow analysis + not call.getControlFlowNode().getAstNode() instanceof LocalFunctionCall or receiver.(FlowSummaryNode).getSummaryNode() = call.(SummaryCall).getReceiver() ) and @@ -2669,8 +2968,11 @@ private predicate delegateCreationStep(Node nodeFrom, Node nodeTo) { predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) { exists(SsaImpl::DefinitionExt def | LocalFlow::localSsaFlowStep(def, nodeFrom, nodeTo) and - LocalFlow::usesInstanceField(def) and preservesValue = true + | + LocalFlow::usesInstanceField(def) + or + def instanceof VariableCapture::CapturedSsaDefinitionExt ) or delegateCreationStep(nodeFrom, nodeTo) and @@ -2699,6 +3001,9 @@ predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preserves fa = nodeTo.asExpr() and fa.(FieldOrPropertyRead).hasNonlocalValue() ) + or + VariableCapture::flowInsensitiveStep(nodeFrom, nodeTo) and + preservesValue = true } /** @@ -2713,6 +3018,9 @@ predicate allowParameterReturnInSelf(ParameterNode p) { parameterNode(p, c, pos) and FlowSummaryImpl::Private::summaryAllowParameterReturnInSelf(c.asSummarizedCallable(), pos) ) + or + VariableCapture::Flow::heuristicAllowInstanceParameterReturnInSelf(p.(DelegateSelfReferenceNode) + .getCallable()) } /** An approximated `Content`. */ @@ -2735,6 +3043,10 @@ class ContentApprox extends TContentApprox { this = TPrimaryConstructorParameterApproxContent(firstChar) and result = "approximated parameter field " + firstChar ) + or + exists(VariableCapture::CapturedVariable v | + this = TCapturedVariableContentApprox(v) and result = "captured " + v + ) } } @@ -2769,6 +3081,8 @@ ContentApprox getContentApprox(Content c) { or result = TPrimaryConstructorParameterApproxContent(approximatePrimaryConstructorParameterContent(c)) + or + result = TCapturedVariableContentApprox(VariableCapture::getCapturedVariableContent(c)) } /** diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll index 1dc3f77a450..1f99522b34a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll @@ -109,18 +109,13 @@ class ParameterNode extends Node instanceof ParameterNodeImpl { } /** A definition, viewed as a node in a data flow graph. */ -class AssignableDefinitionNode extends Node, TSsaDefinitionExtNode { - private Ssa::ExplicitDefinition edef; - - AssignableDefinitionNode() { this = TSsaDefinitionExtNode(edef) } - +class AssignableDefinitionNode extends Node instanceof AssignableDefinitionNodeImpl { /** Gets the underlying definition. */ - AssignableDefinition getDefinition() { result = this.getDefinitionAtNode(_) } + AssignableDefinition getDefinition() { result = super.getDefinition() } /** Gets the underlying definition, at control flow node `cfn`, if any. */ AssignableDefinition getDefinitionAtNode(ControlFlow::Node cfn) { - result = edef.getADefinition() and - cfn = edef.getControlFlowNode() + result = super.getDefinitionAtNode(cfn) } } @@ -263,6 +258,17 @@ class ElementContent extends Content, TElementContent { override Location getLocation() { result instanceof EmptyLocation } } +/** A captured variable. */ +class CapturedVariableContent extends Content, TCapturedVariableContent { + private VariableCapture::CapturedVariable v; + + CapturedVariableContent() { this = TCapturedVariableContent(v) } + + override string toString() { result = "captured " + v } + + override Location getLocation() { result = v.getLocation() } +} + /** * An entity that represents a set of `Content`s. * diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index 1804c976e52..19972a86ab6 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -358,63 +358,6 @@ private module BidirectionalImports { private import semmle.code.csharp.frameworks.EntityFramework } -private predicate recordConstructorFlow(Constructor c, int i, Property p) { - c = any(RecordType r).getAMember() and - exists(string name | - c.getParameter(i).getName() = name and - c.getDeclaringType().getAMember(name) = p - ) -} - -private class RecordConstructorFlow extends Impl::Private::SummarizedCallableImpl { - RecordConstructorFlow() { recordConstructorFlow(this, _, _) } - - predicate propagatesFlowImpl( - Impl::Private::SummaryComponentStack input, Impl::Private::SummaryComponentStack output, - boolean preservesValue - ) { - exists(int i, Property p | - recordConstructorFlow(this, i, p) and - input = Private::SummaryComponentStack::argument(i) and - output = - Private::SummaryComponentStack::propertyOf(p, Private::SummaryComponentStack::return()) and - preservesValue = true - ) - } - - override predicate propagatesFlow( - Impl::Private::SummaryComponentStack input, Impl::Private::SummaryComponentStack output, - boolean preservesValue - ) { - this.propagatesFlowImpl(input, output, preservesValue) - } - - override predicate hasProvenance(Public::Provenance provenance) { provenance = "manual" } -} - -// see `SummarizedCallableImpl` qldoc -private class RecordConstructorFlowAdapter extends Impl::Public::SummarizedCallable instanceof RecordConstructorFlow -{ - override predicate propagatesFlow(string input, string output, boolean preservesValue) { none() } - - override predicate hasProvenance(Public::Provenance provenance) { - RecordConstructorFlow.super.hasProvenance(provenance) - } -} - -private class RecordConstructorFlowRequiredSummaryComponentStack extends Impl::Private::RequiredSummaryComponentStack -{ - override predicate required( - Impl::Private::SummaryComponent head, Impl::Private::SummaryComponentStack tail - ) { - exists(Property p | - recordConstructorFlow(_, _, p) and - head = Private::SummaryComponent::property(p) and - tail = Private::SummaryComponentStack::return() - ) - } -} - private import semmle.code.csharp.frameworks.system.linq.Expressions private predicate mayInvokeCallback(Callable c, int n) { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll index 8b7db48140a..9757121566b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -5,6 +5,7 @@ import csharp private import codeql.ssa.Ssa as SsaImplCommon private import AssignableDefinitions +private import semmle.code.csharp.controlflow.internal.PreSsa private module SsaInput implements SsaImplCommon::InputSig { class BasicBlock = ControlFlow::BasicBlock; @@ -30,9 +31,6 @@ private module SsaInput implements SsaImplCommon::InputSig { or updatesNamedFieldOrProp(bb, i, _, v, _) and certain = false - or - updatesCapturedVariable(bb, i, _, v, _, _) and - certain = false } /** @@ -724,401 +722,10 @@ private module FieldOrPropsImpl { } } -/** - * As in the SSA construction for fields and properties, SSA construction - * for captured variables relies on implicit update nodes at every call - * site that conceivably could reach an update of the captured variable. - * For example, there is an implicit update of `v` on line 4 in - * - * ```csharp - * int M() { - * int i = 0; - * Action a = () => { i = 1; }; - * a(); // implicit update of `v` - * return i; - * } - * ``` - * - * We find update paths of the form: - * - * ``` - * Call --(callEdge)-->* Callable(update of v) - * ``` - * - * For simplicity, and for performance reasons, we ignore cases where a path - * goes through the callable that introduces `v`; such a path does not - * represent an actual update, as a new copy of `v` is updated. - */ -private module CapturedVariableImpl { - /** - * A local scope variable that is captured, and updated by at least one capturer. - */ - private class CapturedWrittenLocalScopeVariable extends LocalScopeVariable { - CapturedWrittenLocalScopeVariable() { - exists(AssignableDefinition def | def.getTarget() = this | - def.getEnclosingCallable() != this.getCallable() - ) - } - } - - private class CapturedWrittenLocalScopeSourceVariable extends LocalScopeSourceVariable { - CapturedWrittenLocalScopeSourceVariable() { - this.getAssignable() instanceof CapturedWrittenLocalScopeVariable - } - } - - private class CapturedWrittenLocalScopeVariableDefinition extends AssignableDefinition { - CapturedWrittenLocalScopeVariableDefinition() { - this.getTarget() instanceof CapturedWrittenLocalScopeVariable - } - } - - /** - * Holds if `vdef` is an update of captured variable `v` in callable `c` - * that is relevant for SSA construction. - */ - predicate relevantDefinition( - Callable c, CapturedWrittenLocalScopeVariable v, - CapturedWrittenLocalScopeVariableDefinition vdef - ) { - exists(ControlFlow::BasicBlock bb, CapturedWrittenLocalScopeSourceVariable sv | - vdef.getTarget() = v and - vdef.getEnclosingCallable() = c and - sv.getAssignable() = v and - bb.getNode(_) = vdef.getAControlFlowNode() and - c != v.getCallable() - ) - } - - /** - * Holds if `call` occurs in basic block `bb` at index `i`, captured variable - * `v` has an update somewhere, and `v` is likely to be live in `bb` at index - * `i`. - */ - predicate updateCandidate( - ControlFlow::BasicBlock bb, int i, CapturedWrittenLocalScopeSourceVariable v, Call call - ) { - FieldOrPropsImpl::callAt(bb, i, call) and - call.getEnclosingCallable() = v.getEnclosingCallable() and - exists(Assignable a | - a = v.getAssignable() and - relevantDefinition(_, a, _) and - not exists(AssignableDefinitions::OutRefDefinition def | - def.getCall() = call and - def.getTarget() = a - ) - ) - } - - private predicate source( - Call call, CapturedWrittenLocalScopeSourceVariable v, - CapturedWrittenLocalScopeVariable captured, Callable c, boolean libraryDelegateCall - ) { - updateCandidate(_, _, v, call) and - c = getARuntimeTarget(call, libraryDelegateCall) and - captured = v.getAssignable() and - relevantDefinition(_, captured, _) - } - - /** - * Holds if `c` is a relevant part of the call graph for - * `updatesCapturedVariable` based on following edges in forward direction. - */ - private predicate reachableFromSource(Callable c) { - source(_, _, _, c, _) - or - exists(Callable mid | reachableFromSource(mid) | callEdge(mid, c)) - } - - private predicate sink(Callable c, CapturedWrittenLocalScopeVariable captured) { - reachableFromSource(c) and - relevantDefinition(c, captured, _) - } - - private predicate prunedCallable(Callable c) { - sink(c, _) - or - exists(Callable mid | callEdge(c, mid) and prunedCallable(mid)) - } - - private predicate prunedEdge(Callable c1, Callable c2) { - prunedCallable(c1) and - prunedCallable(c2) and - callEdge(c1, c2) - } - - private predicate edgePlus(Callable c1, Callable c2) = fastTC(prunedEdge/2)(c1, c2) - - /** - * Holds if `call` may change the value of captured variable `v`. The actual - * update occurs in `writer`. That is, `writer` can be reached from `call` - * using zero or more additional calls (as indicated by `additionalCalls`). - * One of the intermediate callables may be the callable that introduces `v`, - * in which case `call` is not an actual update. - */ - pragma[noopt] - predicate updatesCapturedVariableWriter( - Call call, CapturedWrittenLocalScopeSourceVariable v, Callable writer, boolean additionalCalls - ) { - exists(Callable src, CapturedWrittenLocalScopeVariable captured, boolean libraryDelegateCall | - source(call, v, captured, src, libraryDelegateCall) and - sink(writer, captured) and - ( - src = writer and additionalCalls = libraryDelegateCall - or - edgePlus(src, writer) and additionalCalls = true - ) - ) - } - - /** - * Holds if captured local scope variable `v` is written inside the callable - * to which `bb` belongs. - * - * In this case a pseudo-read is inserted at the exit node at index `i` in `bb`, - * in order to make the write live. - * - * Example: - * - * ```csharp - * class C { - * void M1() { - * int i = 0; - * void M2() { i = 2; }; - * M2(); - * System.Console.WriteLine(i); - * } - * } - * ``` - * - * The write to `i` inside `M2` on line 4 is live because of the implicit call - * definition on line 5. - */ - predicate capturedExitRead( - ControlFlow::BasicBlock bb, int i, CapturedWrittenLocalScopeSourceVariable v - ) { - exists(ControlFlow::Nodes::AnnotatedExitNode exit | - exit.isNormal() and - variableDefinition(bb.getAPredecessor*(), _, v, _) and - exit = bb.getNode(i) - ) - } -} - -/** - * Liveness analysis to restrict the size of the SSA representation for - * captured variables. - * - * Example: - * - * ```csharp - * void M() { - * int i = 0; - * void M2() { - * System.Console.WriteLine(i); - * } - * M2(); - * } - * ``` - * - * The definition of `i` on line 2 is live, because of the call to `M2` on - * line 6. However, that call is not a direct read of `i`, so we account - * for that by inserting an implicit read of `i` on line 6. - * - * The predicates in this module follow the same structure as those in - * `CapturedVariableImpl`. - */ -private module CapturedVariableLivenessImpl { - /** - * Holds if `c` is a callable that captures local scope variable `v`, and - * `c` may read the value of the captured variable. - */ - private predicate capturerReads(Callable c, LocalScopeVariable v) { - exists(LocalScopeSourceVariable sv | - c = sv.getEnclosingCallable() and - v = sv.getAssignable() and - v.getCallable() != c - | - variableReadActual(_, _, sv) - or - refReadBeforeWrite(_, _, sv) - ) - } - - /** - * A local scope variable that is captured, and read by at least one capturer. - */ - private class CapturedReadLocalScopeVariable extends LocalScopeVariable { - CapturedReadLocalScopeVariable() { capturerReads(_, this) } - } - - private class CapturedReadLocalScopeSourceVariable extends LocalScopeSourceVariable { - CapturedReadLocalScopeSourceVariable() { - this.getAssignable() instanceof CapturedReadLocalScopeVariable - } - } - - /** - * Holds if a write to captured source variable `v` may be read by a - * callable reachable from the call `c`. - */ - private predicate implicitReadCandidate( - CapturedReadLocalScopeSourceVariable v, ControlFlow::Nodes::ElementNode c - ) { - exists(ControlFlow::BasicBlock bb, int i | variableWriteDirect(bb, i, v, _) | - c = bb.getNode(any(int j | j > i)) - or - c = bb.getASuccessor+().getANode() - ) - } - - private predicate source( - ControlFlow::Nodes::ElementNode call, CapturedReadLocalScopeSourceVariable v, - CapturedReadLocalScopeVariable captured, Callable c, boolean libraryDelegateCall - ) { - implicitReadCandidate(v, call) and - c = getARuntimeTarget(call.getAstNode(), libraryDelegateCall) and - captured = v.getAssignable() and - capturerReads(_, captured) - } - - /** - * Holds if `c` is a relevant part of the call graph for - * `readsCapturedVariable` based on following edges in forward direction. - */ - private predicate reachableFromSource(Callable c) { - source(_, _, _, c, _) - or - exists(Callable mid | reachableFromSource(mid) | callEdge(mid, c)) - } - - private predicate sink(Callable c, CapturedReadLocalScopeVariable captured) { - reachableFromSource(c) and - capturerReads(c, captured) - } - - private predicate prunedCallable(Callable c) { - sink(c, _) - or - exists(Callable mid | callEdge(c, mid) and prunedCallable(mid)) - } - - private predicate prunedEdge(Callable c1, Callable c2) { - prunedCallable(c1) and - prunedCallable(c2) and - callEdge(c1, c2) - } - - private predicate edgePlus(Callable c1, Callable c2) = fastTC(prunedEdge/2)(c1, c2) - - /** - * Holds if `call` may read the value of captured variable `v`. The actual - * read occurs in `reader`. That is, `reader` can be reached from `call` - * using zero or more additional calls (as indicated by `additionalCalls`). - * One of the intermediate callables may be a callable that writes to `v`, - * in which case `call` is not an actual read. - */ - pragma[noopt] - private predicate readsCapturedVariable( - ControlFlow::Nodes::ElementNode call, CapturedReadLocalScopeSourceVariable v, Callable reader, - boolean additionalCalls - ) { - exists(Callable src, CapturedReadLocalScopeVariable captured, boolean libraryDelegateCall | - source(call, v, captured, src, libraryDelegateCall) and - sink(reader, captured) and - ( - src = reader and additionalCalls = libraryDelegateCall - or - edgePlus(src, reader) and additionalCalls = true - ) - ) - } - - /** - * Holds if captured local scope variable `v` is written inside the callable - * to which `bb` belongs, and the value may be read via `call` using zero or - * more additional calls (as indicated by `additionalCalls`). - * - * In this case a pseudo-read is inserted at the exit node at index `i` in `bb`, - * in order to make the write live. - * - * Example: - * - * ```csharp - * class C { - * void M1() { - * int i = 0; - * void M2() { i = 2; }; - * M2(); - * System.Console.WriteLine(i); - * } - * } - * ``` - * - * The write to `i` inside `M2` on line 4 is live because of the implicit call - * definition on line 5. - */ - predicate capturedReadOut( - ControlFlow::BasicBlock bb, int i, LocalScopeSourceVariable v, LocalScopeSourceVariable outer, - Call call, boolean additionalCalls - ) { - exists( - ControlFlow::Nodes::AnnotatedExitNode exit, ControlFlow::BasicBlock pred, - AssignableDefinition adef - | - exit.isNormal() and - variableDefinition(pred, _, v, adef) and - updatesCapturedVariable(_, _, call, outer, adef, additionalCalls) and - pred.getASuccessor*() = bb and - exit = bb.getNode(i) - ) - } - - /** - * Holds if a value written to captured local scope variable `outer` may be - * read as `inner` via `call`, at index `i` in basic block `bb`, using one or - * more calls (as indicated by `additionalCalls`). - * - * Example: - * - * ```csharp - * class C { - * void M1() { - * int i = 0; - * void M2() => System.Console.WriteLine(i); - * i = 1; - * M2(); - * } - * } - * ``` - * - * The write to `i` on line 5 is live because of the call to `M2` on line 6, which - * reaches the entry definition for `i` in `M2` on line 4. - */ - predicate capturedReadIn( - ControlFlow::BasicBlock bb, int i, LocalScopeSourceVariable outer, - LocalScopeSourceVariable inner, ControlFlow::Nodes::ElementNode call, boolean additionalCalls - ) { - exists(Callable reader | - implicitReadCandidate(outer, call) and - readsCapturedVariable(call, outer, reader, additionalCalls) and - reader = inner.getEnclosingCallable() and - outer.getAssignable() = inner.getAssignable() and - call = bb.getNode(i) - ) - } -} - -private import CapturedVariableLivenessImpl - private predicate variableReadPseudo(ControlFlow::BasicBlock bb, int i, Ssa::SourceVariable v) { outRefExitRead(bb, i, v) or refReadBeforeWrite(bb, i, v) - or - CapturedVariableImpl::capturedExitRead(bb, i, v) - or - capturedReadIn(bb, i, v, _, _, _) } pragma[noinline] @@ -1223,7 +830,7 @@ cached private module Cached { cached newtype TSourceVariable = - TLocalVar(Callable c, LocalScopeVariable v) { + TLocalVar(Callable c, PreSsa::SimpleLocalScopeVariable v) { c = v.getCallable() or // Local scope variables can be captured @@ -1297,23 +904,6 @@ private module Cached { FieldOrPropsImpl::updatesNamedFieldOrProp(fp, c, setter) } - /** - * Holds if `call` may change the value of captured variable `v`. The actual - * update occurs in `def`. - */ - cached - predicate updatesCapturedVariable( - ControlFlow::BasicBlock bb, int i, Call call, LocalScopeSourceVariable v, - AssignableDefinition def, boolean additionalCalls - ) { - CapturedVariableImpl::updateCandidate(bb, i, v, call) and - exists(Callable writer | - CapturedVariableImpl::relevantDefinition(writer, v.getAssignable(), def) - | - CapturedVariableImpl::updatesCapturedVariableWriter(call, v, writer, additionalCalls) - ) - } - cached predicate variableWriteQualifier( ControlFlow::BasicBlock bb, int i, QualifiedFieldOrPropSourceVariable v, boolean certain @@ -1327,32 +917,6 @@ private module Cached { not updatesNamedFieldOrProp(bb, i, _, v, _) } - cached - predicate isCapturedVariableDefinitionFlowIn( - Ssa::ExplicitDefinition def, Ssa::ImplicitEntryDefinition edef, - ControlFlow::Nodes::ElementNode c, boolean additionalCalls - ) { - exists(Ssa::SourceVariable v, Ssa::Definition def0, ControlFlow::BasicBlock bb, int i | - v = def.getSourceVariable() and - capturedReadIn(_, _, v, edef.getSourceVariable(), c, additionalCalls) and - def = def0.getAnUltimateDefinition() and - Impl::ssaDefReachesRead(_, def0, bb, i) and - capturedReadIn(bb, i, v, _, _, _) and - c = bb.getNode(i) - ) - } - - cached - predicate isCapturedVariableDefinitionFlowOut( - Ssa::ExplicitDefinition def, Ssa::ImplicitCallDefinition cdef, boolean additionalCalls - ) { - exists(Ssa::Definition def0 | - def = def0.getAnUltimateDefinition() and - capturedReadOut(_, _, def0.getSourceVariable(), cdef.getSourceVariable(), cdef.getCall(), - additionalCalls) - ) - } - cached predicate explicitDefinition(WriteDefinition def, Ssa::SourceVariable v, AssignableDefinition ad) { exists(ControlFlow::BasicBlock bb, int i | diff --git a/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll index 9905f4939b3..282bd98ef34 100644 --- a/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll +++ b/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll @@ -121,12 +121,19 @@ class OverridableCallable extends Callable, Overridable { result = c.getDeclaringType() } + pragma[nomagic] private predicate isDeclaringSubType(ValueOrRefType t) { t = this.getDeclaringType() or exists(ValueOrRefType mid | this.isDeclaringSubType(mid) | t = mid.getASubType()) } + pragma[nomagic] + private predicate isDeclaringSubType(ValueOrRefType t, ValueOrRefType sub) { + this.isDeclaringSubType(t) and + t = sub.getABaseType() + } + pragma[noinline] private Callable getAnOverrider0(ValueOrRefType t) { // A (transitive) overrider @@ -155,10 +162,7 @@ class OverridableCallable extends Callable, Overridable { Callable getAnOverrider(ValueOrRefType t) { result = this.getAnOverrider0(t) or - exists(ValueOrRefType mid | result = this.getAnOverrider(mid) | - t = mid.getABaseType() and - this.isDeclaringSubType(t) - ) + exists(ValueOrRefType mid | result = this.getAnOverrider(mid) | this.isDeclaringSubType(t, mid)) } } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll index 77334e709f3..98e5b6f340a 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll @@ -65,7 +65,7 @@ class Expr extends DotNet::Expr, ControlFlowElement, @expr { * Holds if this expression is generated by the compiler and does not appear * explicitly in the source code. */ - predicate isImplicit() { expr_compiler_generated(this) } + predicate isImplicit() { compiler_generated(this) } /** * Gets an expression that is the result of stripping (recursively) all diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll index b634aa7d1a5..739546dde46 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll @@ -49,6 +49,8 @@ module EntityFramework { StoredFlowSource() { this.asExpr() = any(PropertyRead read | read.getTarget() instanceof MappedProperty) } + + override string getSourceType() { result = "ORM mapped property" } } private class EFClass extends Class { diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/NHibernate.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/NHibernate.qll index a13c84250c5..74796ccedd1 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/NHibernate.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/NHibernate.qll @@ -91,6 +91,8 @@ module NHibernate { StoredFlowSource() { this.asExpr() = any(PropertyRead read | read.getTarget() instanceof MappedProperty) } + + override string getSourceType() { result = "ORM mapped property" } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/CodeAnalysis.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/CodeAnalysis.qll new file mode 100644 index 00000000000..d0392f8fc3b --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/CodeAnalysis.qll @@ -0,0 +1,15 @@ +/** Provides definitions related to the namespace `System.Diagnostics.CodeAnalysis`. */ + +private import csharp + +/** An attribute of type `System.Diagnostics.CodeAnalysis.ExperimentalAttribute`. */ +class ExperimentalAttribute extends Attribute { + ExperimentalAttribute() { + this.getType().hasFullyQualifiedName("System.Diagnostics.CodeAnalysis", "ExperimentalAttribute") + } + + /** + * Gets the diagnostic ID. + */ + string getId() { result = this.getConstructorArgument(0).getValue() } +} diff --git a/csharp/ql/lib/semmle/code/csharp/security/auth/InsecureDirectObjectReferenceQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/auth/InsecureDirectObjectReferenceQuery.qll index d4fa6401650..858adcc2268 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/auth/InsecureDirectObjectReferenceQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/auth/InsecureDirectObjectReferenceQuery.qll @@ -1,7 +1,8 @@ /** Definitions for the Insecure Direct Object Reference query */ import csharp -import semmle.code.csharp.dataflow.flowsources.Remote +import semmle.code.csharp.security.dataflow.flowsources.FlowSources +deprecated import semmle.code.csharp.dataflow.flowsources.Remote import ActionMethods /** @@ -17,7 +18,7 @@ private predicate needsChecks(ActionMethod m) { m.isEdit() and not m.isAdmin() } * that may indicate that it's used as the ID for some resource */ private predicate hasIdParameter(ActionMethod m) { - exists(RemoteFlowSource src | src.getEnclosingCallable() = m | + exists(ThreatModelFlowSource src | src.getEnclosingCallable() = m | src.asParameter().getName().toLowerCase().matches(["%id", "%idx"]) or // handle cases like `Request.QueryString["Id"]` diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll index d41c6b8f811..fdfd422c47b 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll @@ -3,8 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote -private import semmle.code.csharp.security.dataflow.flowsources.Local +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.codedom.Compiler private import semmle.code.csharp.security.Sanitizers private import semmle.code.csharp.dataflow.internal.ExternalFlow @@ -55,11 +54,24 @@ private module CodeInjectionConfig implements DataFlow::ConfigSig { */ module CodeInjection = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } -/** A source of local user input. */ -class LocalSource extends Source instanceof LocalFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of local user input. + */ +deprecated class LocalSource extends DataFlow::Node instanceof LocalFlowSource { } + +private class AddLocalSource extends Source instanceof LocalFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } private class SimpleTypeSanitizer extends Sanitizer, SimpleTypeSanitizedExpr { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll index b174405443f..d0b24125ba9 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll @@ -3,7 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.Diagnostics private import semmle.code.csharp.security.Sanitizers private import semmle.code.csharp.dataflow.internal.ExternalFlow @@ -64,8 +64,15 @@ module CommandInjectionConfig implements DataFlow::ConfigSig { */ module CommandInjection = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** Command Injection sinks defined through Models as Data. */ private class ExternalCommandInjectionExprSink extends Sink { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll index e919684d751..a8938ecc6c9 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll @@ -6,7 +6,7 @@ import csharp private import semmle.code.csharp.controlflow.Guards private import semmle.code.csharp.controlflow.BasicBlocks -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.System private import semmle.code.csharp.frameworks.system.Net private import semmle.code.csharp.security.SensitiveActions @@ -60,8 +60,15 @@ private module ConditionalBypassConfig implements DataFlow::ConfigSig { */ module ConditionalBypass = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** The result of a reverse dns may be user-controlled. */ class ReverseDnsSource extends Source { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll index 0b53d9d1ca6..03db7fadf81 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll @@ -3,7 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.security.dataflow.flowsinks.ExternalLocationSink private import semmle.code.csharp.security.PrivateData diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll index e1630503da5..3075fe53a87 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll @@ -5,7 +5,7 @@ import csharp private import semmle.code.csharp.commons.QualifiedName -private import semmle.code.csharp.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.System private import semmle.code.csharp.dataflow.FlowSummary @@ -92,19 +92,19 @@ class ExternalApiDataNode extends DataFlow::Node { deprecated class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration { UntrustedDataToExternalApiConfig() { this = "UntrustedDataToExternalAPIConfig" } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + override predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource } override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } -/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ +/** A configuration for tracking flow from `ThreatModelFlowSource`s to `ExternalApiDataNode`s. */ private module RemoteSourceToExternalApiConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource } predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } -/** A module for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ +/** A module for tracking flow from `ThreatModelFlowSource`s to `ExternalApiDataNode`s. */ module RemoteSourceToExternalApi = TaintTracking::Global; /** A node representing untrusted data being passed to an external API. */ diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll index 25134fbcb12..58a34f7604b 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll @@ -4,7 +4,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.DirectoryServices private import semmle.code.csharp.frameworks.system.directoryservices.Protocols private import semmle.code.csharp.security.Sanitizers @@ -66,8 +66,15 @@ module LdapInjectionConfig implements DataFlow::ConfigSig { */ module LdapInjection = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreadModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** LDAP sinks defined through Models as Data. */ private class ExternalLdapExprSink extends Sink { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/LogForgingQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LogForgingQuery.qll index 800e86457b4..ed6e69f0709 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/LogForgingQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LogForgingQuery.qll @@ -3,7 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.System private import semmle.code.csharp.frameworks.system.text.RegularExpressions private import semmle.code.csharp.security.Sanitizers @@ -57,7 +57,7 @@ private module LogForgingConfig implements DataFlow::ConfigSig { module LogForging = TaintTracking::Global; /** A source of remote user input. */ -private class RemoteSource extends Source instanceof RemoteFlowSource { } +private class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } private class HtmlSanitizer extends Sanitizer { HtmlSanitizer() { this.asExpr() instanceof HtmlSanitizedExpr } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll index 676b77b8446..914239bf7d5 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll @@ -4,7 +4,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.Xml private import semmle.code.csharp.security.Sanitizers @@ -62,8 +62,17 @@ private module MissingXmlValidationConfig implements DataFlow::ConfigSig { */ module MissingXmlValidation = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelFlowSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** + * A source supported by the current threat model. + */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * The input argument to a call to `XmlReader.Create` where the input will not be validated against diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll index 27f70a0d4e4..84d12fca0cc 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll @@ -5,7 +5,7 @@ import csharp private import semmle.code.csharp.dataflow.DataFlow2 -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.text.RegularExpressions private import semmle.code.csharp.security.Sanitizers @@ -55,8 +55,15 @@ private module ReDoSConfig implements DataFlow::ConfigSig { */ module ReDoS = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * An expression that represents a regular expression with potential exponential behavior. diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll index 89baeda92b6..501ede13f29 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll @@ -4,7 +4,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.text.RegularExpressions private import semmle.code.csharp.security.Sanitizers @@ -54,8 +54,15 @@ private module RegexInjectionConfig implements DataFlow::ConfigSig { */ module RegexInjection = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * A `pattern` argument to a construction of a `Regex`. diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll index 336ca17ca75..56cb59001cd 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll @@ -3,8 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote -private import semmle.code.csharp.security.dataflow.flowsources.Local +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.Data private import semmle.code.csharp.security.Sanitizers @@ -54,11 +53,24 @@ private module ResourceInjectionConfig implements DataFlow::ConfigSig { */ module ResourceInjection = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } -/** A source of local user input. */ -class LocalSource extends Source instanceof LocalFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of local user input. + */ +deprecated class LocalSource extends DataFlow::Node instanceof LocalFlowSource { } + +private class AddLocalSource extends Source instanceof LocalFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** An argument to the `ConnectionString` property on a data connection class. */ class SqlConnectionStringSink extends Sink { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll index 7500ac7a994..12c580381b9 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll @@ -3,8 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote -private import semmle.code.csharp.security.dataflow.flowsources.Local +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.Sql private import semmle.code.csharp.security.Sanitizers private import semmle.code.csharp.dataflow.internal.ExternalFlow @@ -65,11 +64,24 @@ module SqlInjectionConfig implements DataFlow::ConfigSig { */ module SqlInjection = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } -/** A source of local user input. */ -class LocalSource extends Source instanceof LocalFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of local user input. + */ +deprecated class LocalSource extends DataFlow::Node instanceof LocalFlowSource { } + +private class AddLocalSource extends Source instanceof LocalFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** An SQL expression passed to an API call that executes SQL. */ class SqlInjectionExprSink extends Sink { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll index 005a9e96bfa..bbd32b58353 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll @@ -5,7 +5,7 @@ import csharp private import semmle.code.csharp.controlflow.Guards -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.IO private import semmle.code.csharp.frameworks.system.Web private import semmle.code.csharp.security.Sanitizers @@ -56,8 +56,15 @@ private module TaintedPathConfig implements DataFlow::ConfigSig { */ module TaintedPath = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * A path argument to a `File` method call. diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll index cf558b62c43..6de1305a11d 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll @@ -6,7 +6,7 @@ import csharp private import semmle.code.csharp.serialization.Deserializers private import semmle.code.csharp.dataflow.TaintTracking2 -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources /** * A data flow source for unsafe deserialization vulnerabilities. @@ -48,7 +48,7 @@ abstract private class ConstructorOrStaticMethodSink extends Sink { } */ abstract class Sanitizer extends DataFlow::Node { } -private class RemoteSource extends Source instanceof RemoteFlowSource { } +private class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * DEPRECATED: Use `TaintToObjectMethodTracking` instead. diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll index 53b4cceb960..9a5ec46cb37 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll @@ -3,7 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.controlflow.Guards private import semmle.code.csharp.frameworks.Format private import semmle.code.csharp.frameworks.system.Web @@ -58,8 +58,15 @@ private module UrlRedirectConfig implements DataFlow::ConfigSig { */ module UrlRedirect = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** URL Redirection sinks defined through Models as Data. */ private class ExternalUrlRedirectExprSink extends Sink { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll index e2d347a2268..7e7fd61fb1c 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll @@ -3,7 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.System private import semmle.code.csharp.frameworks.system.text.RegularExpressions private import semmle.code.csharp.security.xml.InsecureXMLQuery as InsecureXml @@ -14,7 +14,7 @@ private import semmle.code.csharp.security.Sanitizers */ abstract class Source extends DataFlow::Node { } -private class RemoteSource extends Source instanceof RemoteFlowSource { } +private class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * A data flow sink for untrusted user input used in XML processing. diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll index 57a0d6e9b50..1edddf45f56 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll @@ -3,7 +3,7 @@ */ import csharp -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.xml.XPath private import semmle.code.csharp.frameworks.system.Xml private import semmle.code.csharp.security.Sanitizers @@ -64,8 +64,15 @@ module XpathInjectionConfig implements DataFlow::ConfigSig { */ module XpathInjection = TaintTracking::Global; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** The `xpath` argument to an `XPathExpression.Compile(..)` call. */ class XPathExpressionCompileSink extends Sink { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll index 1dea41c8a7c..b9fd47689f9 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll @@ -6,7 +6,7 @@ import csharp private import XSSSinks private import semmle.code.csharp.security.Sanitizers -private import semmle.code.csharp.security.dataflow.flowsources.Remote +private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.dataflow.DataFlow2 private import semmle.code.csharp.dataflow.TaintTracking2 @@ -179,8 +179,8 @@ module XssTrackingConfig implements DataFlow::ConfigSig { module XssTracking = TaintTracking::Global; -/** A source of remote user input. */ -private class RemoteSource extends Source instanceof RemoteFlowSource { } +/** A source supported by the current threat model. */ +private class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } private class SimpleTypeSanitizer extends Sanitizer, SimpleTypeSanitizedExpr { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/FlowSources.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/FlowSources.qll index 6da08298fb9..a5ada1cbaf8 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/FlowSources.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/FlowSources.qll @@ -14,6 +14,9 @@ abstract class SourceNode extends DataFlow::Node { * Gets a string that represents the source kind with respect to threat modeling. */ abstract string getThreatModel(); + + /** Gets a string that describes the type of this flow source. */ + abstract string getSourceType(); } /** diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Local.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Local.qll index 7ee1d4b744c..121f53c4929 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Local.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Local.qll @@ -9,8 +9,7 @@ private import semmle.code.csharp.security.dataflow.flowsources.FlowSources /** A data flow source of local data. */ abstract class LocalFlowSource extends SourceNode { - /** Gets a string that describes the type of this local flow source. */ - abstract string getSourceType(); + override string getSourceType() { result = "local flow source" } override string getThreatModel() { result = "local" } } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll index 07c230c19c2..dc2fb36c47a 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll @@ -17,8 +17,7 @@ private import semmle.code.csharp.security.dataflow.flowsources.FlowSources /** A data flow source of remote user input. */ abstract class RemoteFlowSource extends SourceNode { - /** Gets a string that describes the type of this remote flow source. */ - abstract string getSourceType(); + override string getSourceType() { result = "remote flow source" } override string getThreatModel() { result = "remote" } } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Stored.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Stored.qll index 95df5284b1d..2d2ecd0bccb 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Stored.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Stored.qll @@ -21,6 +21,8 @@ abstract class StoredFlowSource extends SourceNode { */ abstract class DatabaseInputSource extends StoredFlowSource { override string getThreatModel() { result = "database" } + + override string getSourceType() { result = "database input" } } /** @@ -76,4 +78,6 @@ class FileStreamStoredFlowSource extends StoredFlowSource { FileStreamStoredFlowSource() { sourceNode(this, "file") } override string getThreatModel() { result = "file" } + + override string getSourceType() { result = "file stream" } } diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index c9ee11bd1ee..fd04e45710e 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -682,8 +682,6 @@ 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; @@ -890,7 +888,7 @@ params( 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 mode: int ref, /* value = 0, ref = 1, out = 2, params/array = 3, this = 4, in = 5, ref readonly = 6 */ int parent_id: @parameterizable ref, int unbound_id: @parameter ref); @@ -1271,9 +1269,6 @@ 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); @@ -1316,6 +1311,10 @@ lambda_expr_return_type( unique int id: @lambda_expr ref, int type_id: @type_or_ref ref); +/* Compiler generated */ + +compiler_generated(unique int id: @element ref); + /** CONTROL/DATA FLOW **/ @control_flow_element = @stmt | @expr; diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats index e217f9cea60..82714bfe1d0 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats @@ -1,41725 +1,4 @@ - - - @compilation - 1607 - - - @diagnostic - 138224 - - - @extractor_message - 11378 - - - @externalDataElement - 0 - - - @assembly - 14527 - - - @file - 92261 - - - @folder - 34263 - - - @namespace - 206514 - - - @namespace_declaration - 37444 - - - @using_static_directive - 1202 - - - @directive_if - 20769 - - - @using_namespace_directive - 286854 - - - @directive_elif - 293 - - - @directive_else - 6744 - - - @directive_endif - 20338 - - - @directive_region - 38812 - - - @directive_endregion - 38812 - - - @directive_line - 539550 - - - @directive_nullable - 467925 - - - @directive_warning - 23 - - - @directive_error - 45 - - - @directive_undefine - 68 - - - @pragma_checksum - 9570 - - - @directive_define - 83 - - - @pragma_warning - 57623 - - - @typeref - 4008699 - - - @bool_type - 60 - - - @char_type - 60 - - - @decimal_type - 60 - - - @sbyte_type - 60 - - - @short_type - 60 - - - @int_type - 60 - - - @long_type - 60 - - - @byte_type - 60 - - - @ushort_type - 60 - - - @uint_type - 60 - - - @ulong_type - 60 - - - @float_type - 60 - - - @double_type - 60 - - - @enum_type - 163759 - - - @struct_type - 716372 - - - @class_type - 4319716 - - - @interface_type - 2787078 - - - @delegate_type - 834351 - - - @null_type - 60 - - - @type_parameter - 897781 - - - @pointer_type - 11632 - - - @nullable_type - 24628 - - - @array_type - 95572 - - - @void_type - 60 - - - @int_ptr_type - 60 - - - @arglist_type - 25 - - - @unknown_type - 60 - - - @tuple_type - 47199 - - - @function_pointer_type - 47919 - - - @inline_array_type - 21 - - - @uint_ptr_type - 0 - - - @dynamic_type - 25 - - - @attribute_default - 13884733 - - - @attribute_return - 338135 - - - @attribute_assembly - 42996 - - - @attribute_module - 66 - - - @oblivious - 18476 - - - @not_annotated - 6903 - - - @annotated - 4922 - - - @type_mention - 3322420 - - - @type_parameter_constraints - 897781 - - - @location_default - 154005847 - - - @modifier - 1020 - - - @property - 5910563 - - - @indexer - 103350 - - - @getter - 6006897 - - - @setter - 895152 - - - @event - 60800 - - - @add_event_accessor - 60800 - - - @remove_event_accessor - 60800 - - - @operator - 146898 - - - @method - 17406043 - - - @constructor - 5023456 - - - @destructor - 4588 - - - @local_function - 4768 - - - @addressable_field - 9983437 - - - @constant - 3004004 - - - @addressable_local_variable - 617257 - - - @local_constant - 1960 - - - @local_variable_ref - 1708 - - - @parameter - 31463795 - - - @block_stmt - 797317 - - - @expr_stmt - 866006 - - - @if_stmt - 371632 - - - @switch_stmt - 12529 - - - @while_stmt - 23333 - - - @do_stmt - 2314 - - - @for_stmt - 22828 - - - @foreach_stmt - 32474 - - - @break_stmt - 115991 - - - @continue_stmt - 10334 - - - @goto_stmt - 6331 - - - @goto_case_stmt - 1397 - - - @goto_default_stmt - 261 - - - @throw_stmt - 175588 - - - @return_stmt - 374214 - - - @yield_stmt - 7198 - - - @try_stmt - 21811 - - - @checked_stmt - 487 - - - @unchecked_stmt - 194 - - - @lock_stmt - 9587 - - - @using_block_stmt - 9206 - - - @var_decl_stmt - 557023 - - - @const_decl_stmt - 1946 - - - @empty_stmt - 846 - - - @unsafe_stmt - 626 - - - @fixed_stmt - 3152 - - - @label_stmt - 2802 - - - @catch - 30233 - - - @case_stmt - 130471 - - - @local_function_stmt - 4652 - - - @using_decl_stmt - 13937 - - - @bool_literal_expr - 517984 - - - @char_literal_expr - 75977 - - - @decimal_literal_expr - 185559 - - - @int_literal_expr - 4873070 - - - @long_literal_expr - 10293 - - - @uint_literal_expr - 10265 - - - @ulong_literal_expr - 4223 - - - @float_literal_expr - 129369 - - - @double_literal_expr - 67946 - - - @utf16_string_literal_expr - 1936327 - - - @null_literal_expr - 249861 - - - @this_access_expr - 1139940 - - - @base_access_expr - 57393 - - - @local_variable_access_expr - 1800136 - - - @parameter_access_expr - 1043167 - - - @field_access_expr - 1361171 - - - @property_access_expr - 1468688 - - - @method_access_expr - 21420 - - - @event_access_expr - 14995 - - - @indexer_access_expr - 73964 - - - @array_access_expr - 95237 - - - @type_access_expr - 1319868 - - - @typeof_expr - 733326 - - - @method_invocation_expr - 1292925 - - - @delegate_invocation_expr - 14027 - - - @operator_invocation_expr - 53469 - - - @cast_expr - 666635 - - - @object_creation_expr - 232984 - - - @explicit_delegate_creation_expr - 3838 - - - @implicit_delegate_creation_expr - 13629 - - - @array_creation_expr - 842441 - - - @default_expr - 475094 - - - @plus_expr - 1494 - - - @minus_expr - 83947 - - - @bit_not_expr - 2592 - - - @log_not_expr - 69874 - - - @post_incr_expr - 34720 - - - @post_decr_expr - 4264 - - - @pre_incr_expr - 16259 - - - @pre_decr_expr - 1332 - - - @mul_expr - 13674 - - - @div_expr - 4708 - - - @rem_expr - 1733 - - - @add_expr - 89975 - - - @sub_expr - 32231 - - - @lshift_expr - 20397 - - - @rshift_expr - 6358 - - - @lt_expr - 42475 - - - @gt_expr - 26005 - - - @le_expr - 22303 - - - @ge_expr - 13933 - - - @eq_expr - 167777 - - - @ne_expr - 126219 - - - @bit_and_expr - 19733 - - - @bit_xor_expr - 3459 - - - @bit_or_expr - 37840 - - - @log_and_expr - 64040 - - - @log_or_expr - 40879 - - - @is_expr - 27099 - - - @as_expr - 25539 - - - @null_coalescing_expr - 12230 - - - @conditional_expr - 25477 - - - @simple_assign_expr - 1445815 - - - @assign_add_expr - 10985 - - - @assign_sub_expr - 3479 - - - @assign_mul_expr - 448 - - - @assign_div_expr - 224 - - - @assign_rem_expr - 54 - - - @assign_and_expr - 1371 - - - @assign_xor_expr - 1366 - - - @assign_or_expr - 5049 - - - @assign_lshift_expr - 312 - - - @assign_rshift_expr - 476 - - - @object_init_expr - 192703 - - - @collection_init_expr - 17877 - - - @array_init_expr - 836505 - - - @checked_expr - 1516 - - - @unchecked_expr - 2773 - - - @constructor_init_expr - 48759 - - - @add_event_expr - 4425 - - - @remove_event_expr - 2983 - - - @local_var_decl_expr - 619052 - - - @lambda_expr - 246837 - - - @anonymous_method_expr - 485 - - - @pointer_indirection_expr - 8987 - - - @address_of_expr - 3502 - - - @sizeof_expr - 4139 - - - @await_expr - 111125 - - - @nameof_expr - 60898 - - - @interpolated_string_expr - 45841 - - - @unknown_expr - 9 - - - @throw_expr - 6053 - - - @tuple_expr - 10147 - - - @local_function_invocation_expr - 16381 - - - @ref_expr - 3049 - - - @discard_expr - 3701 - - - @range_expr - 1288 - - - @index_expr - 308 - - - @switch_expr - 1803 - - - @recursive_pattern_expr - 4161 - - - @property_pattern_expr - 3675 - - - @positional_pattern_expr - 1021 - - - @switch_case_expr - 13128 - - - @assign_coalesce_expr - 6746 - - - @suppress_nullable_warning_expr - 49307 - - - @lt_pattern_expr - 67 - - - @gt_pattern_expr - 133 - - - @le_pattern_expr - 89 - - - @ge_pattern_expr - 102 - - - @not_pattern_expr - 4720 - - - @and_pattern_expr - 331 - - - @or_pattern_expr - 3131 - - - @function_pointer_invocation_expr - 182 - - - @with_expr - 291 - - - @list_pattern_expr - 291 - - - @slice_pattern_expr - 105 - - - @urshift_expr - 65 - - - @assign_urshift_expr - 2 - - - @utf8_string_literal_expr - 4006 - - - @collection_expr - 1900 - - - @define_symbol_expr - 40315 - - - @par_expr - 0 - - - @namespace_expr - 0 - - - @dynamic_element_access_expr - 222 - - - @dynamic_member_access_expr - 10662 - - - @namespace_access_expr - 117 - - - @spread_element_expr - 15 - - - @xmldtd - 72 - - - @xmlelement - 67055539 - - - @xmlattribute - 45628904 - - - @xmlnamespace - 429 - - - @xmlcomment - 12809 - - - @xmlcharacters - 50180784 - - - @singlelinecomment - 835522 - - - @xmldoccomment - 1480593 - - - @multilinecomment - 102852 - - - @commentblock - 452748 - - - @asp_close_tag - 24357 - - - @asp_code - 1371 - - - @asp_comment - 290 - - - @asp_data_binding - 586 - - - @asp_directive - 3329 - - - @asp_open_tag - 33601 - - - @asp_quoted_string - 58509 - - - @asp_text - 60436 - - - @asp_xml_directive - 1530 - - - @cil_nop - 0 - - - @cil_break - 0 - - - @cil_ldarg_0 - 0 - - - @cil_ldarg_1 - 0 - - - @cil_ldarg_2 - 0 - - - @cil_ldarg_3 - 0 - - - @cil_ldloc_0 - 0 - - - @cil_ldloc_1 - 0 - - - @cil_ldloc_2 - 0 - - - @cil_ldloc_3 - 0 - - - @cil_stloc_0 - 0 - - - @cil_stloc_1 - 0 - - - @cil_stloc_2 - 0 - - - @cil_stloc_3 - 0 - - - @cil_ldarg_s - 0 - - - @cil_ldarga_s - 0 - - - @cil_starg_s - 0 - - - @cil_ldloc_s - 0 - - - @cil_ldloca_s - 0 - - - @cil_stloc_s - 0 - - - @cil_ldnull - 0 - - - @cil_ldc_i4_m1 - 0 - - - @cil_ldc_i4_0 - 0 - - - @cil_ldc_i4_1 - 0 - - - @cil_ldc_i4_2 - 0 - - - @cil_ldc_i4_3 - 0 - - - @cil_ldc_i4_4 - 0 - - - @cil_ldc_i4_5 - 0 - - - @cil_ldc_i4_6 - 0 - - - @cil_ldc_i4_7 - 0 - - - @cil_ldc_i4_8 - 0 - - - @cil_ldc_i4_s - 0 - - - @cil_ldc_i4 - 0 - - - @cil_ldc_i8 - 0 - - - @cil_ldc_r4 - 0 - - - @cil_ldc_r8 - 0 - - - @cil_dup - 0 - - - @cil_pop - 0 - - - @cil_jmp - 0 - - - @cil_call - 0 - - - @cil_calli - 0 - - - @cil_ret - 0 - - - @cil_br_s - 0 - - - @cil_brfalse_s - 0 - - - @cil_brtrue_s - 0 - - - @cil_beq_s - 0 - - - @cil_bge_s - 0 - - - @cil_bgt_s - 0 - - - @cil_ble_s - 0 - - - @cil_blt_s - 0 - - - @cil_bne_un_s - 0 - - - @cil_bge_un_s - 0 - - - @cil_bgt_un_s - 0 - - - @cil_ble_un_s - 0 - - - @cil_blt_un_s - 0 - - - @cil_br - 0 - - - @cil_brfalse - 0 - - - @cil_brtrue - 0 - - - @cil_beq - 0 - - - @cil_bge - 0 - - - @cil_bgt - 0 - - - @cil_ble - 0 - - - @cil_blt - 0 - - - @cil_bne_un - 0 - - - @cil_bge_un - 0 - - - @cil_bgt_un - 0 - - - @cil_ble_un - 0 - - - @cil_blt_un - 0 - - - @cil_switch - 0 - - - @cil_ldind_i1 - 0 - - - @cil_ldind_u1 - 0 - - - @cil_ldind_i2 - 0 - - - @cil_ldind_u2 - 0 - - - @cil_ldind_i4 - 0 - - - @cil_ldind_u4 - 0 - - - @cil_ldind_i8 - 0 - - - @cil_ldind_i - 0 - - - @cil_ldind_r4 - 0 - - - @cil_ldind_r8 - 0 - - - @cil_ldind_ref - 0 - - - @cil_stind_ref - 0 - - - @cil_stind_i1 - 0 - - - @cil_stind_i2 - 0 - - - @cil_stind_i4 - 0 - - - @cil_stind_i8 - 0 - - - @cil_stind_r4 - 0 - - - @cil_stind_r8 - 0 - - - @cil_add - 0 - - - @cil_sub - 0 - - - @cil_mul - 0 - - - @cil_div - 0 - - - @cil_div_un - 0 - - - @cil_rem - 0 - - - @cil_rem_un - 0 - - - @cil_and - 0 - - - @cil_or - 0 - - - @cil_xor - 0 - - - @cil_shl - 0 - - - @cil_shr - 0 - - - @cil_shr_un - 0 - - - @cil_neg - 0 - - - @cil_not - 0 - - - @cil_conv_i1 - 0 - - - @cil_conv_i2 - 0 - - - @cil_conv_i4 - 0 - - - @cil_conv_i8 - 0 - - - @cil_conv_r4 - 0 - - - @cil_conv_r8 - 0 - - - @cil_conv_u4 - 0 - - - @cil_conv_u8 - 0 - - - @cil_callvirt - 0 - - - @cil_cpobj - 0 - - - @cil_ldobj - 0 - - - @cil_ldstr - 0 - - - @cil_newobj - 0 - - - @cil_castclass - 0 - - - @cil_isinst - 0 - - - @cil_conv_r_un - 0 - - - @cil_unbox - 0 - - - @cil_throw - 0 - - - @cil_ldfld - 0 - - - @cil_ldflda - 0 - - - @cil_stfld - 0 - - - @cil_ldsfld - 0 - - - @cil_ldsflda - 0 - - - @cil_stsfld - 0 - - - @cil_stobj - 0 - - - @cil_conv_ovf_i1_un - 0 - - - @cil_conv_ovf_i2_un - 0 - - - @cil_conv_ovf_i4_un - 0 - - - @cil_conv_ovf_i8_un - 0 - - - @cil_conv_ovf_u1_un - 0 - - - @cil_conv_ovf_u2_un - 0 - - - @cil_conv_ovf_u4_un - 0 - - - @cil_conv_ovf_u8_un - 0 - - - @cil_conv_ovf_i_un - 0 - - - @cil_conv_ovf_u_un - 0 - - - @cil_box - 0 - - - @cil_newarr - 0 - - - @cil_ldlen - 0 - - - @cil_ldelema - 0 - - - @cil_ldelem_i1 - 0 - - - @cil_ldelem_u1 - 0 - - - @cil_ldelem_i2 - 0 - - - @cil_ldelem_u2 - 0 - - - @cil_ldelem_i4 - 0 - - - @cil_ldelem_u4 - 0 - - - @cil_ldelem_i8 - 0 - - - @cil_ldelem_i - 0 - - - @cil_ldelem_r4 - 0 - - - @cil_ldelem_r8 - 0 - - - @cil_ldelem_ref - 0 - - - @cil_stelem_i - 0 - - - @cil_stelem_i1 - 0 - - - @cil_stelem_i2 - 0 - - - @cil_stelem_i4 - 0 - - - @cil_stelem_i8 - 0 - - - @cil_stelem_r4 - 0 - - - @cil_stelem_r8 - 0 - - - @cil_stelem_ref - 0 - - - @cil_ldelem - 0 - - - @cil_stelem - 0 - - - @cil_unbox_any - 0 - - - @cil_conv_ovf_i1 - 0 - - - @cil_conv_ovf_u1 - 0 - - - @cil_conv_ovf_i2 - 0 - - - @cil_conv_ovf_u2 - 0 - - - @cil_conv_ovf_i4 - 0 - - - @cil_conv_ovf_u4 - 0 - - - @cil_conv_ovf_i8 - 0 - - - @cil_conv_ovf_u8 - 0 - - - @cil_refanyval - 0 - - - @cil_ckinfinite - 0 - - - @cil_mkrefany - 0 - - - @cil_ldtoken - 0 - - - @cil_conv_u2 - 0 - - - @cil_conv_u1 - 0 - - - @cil_conv_i - 0 - - - @cil_conv_ovf_i - 0 - - - @cil_conv_ovf_u - 0 - - - @cil_add_ovf - 0 - - - @cil_add_ovf_un - 0 - - - @cil_mul_ovf - 0 - - - @cil_mul_ovf_un - 0 - - - @cil_sub_ovf - 0 - - - @cil_sub_ovf_un - 0 - - - @cil_endfinally - 0 - - - @cil_leave - 0 - - - @cil_leave_s - 0 - - - @cil_stind_i - 0 - - - @cil_conv_u - 0 - - - @cil_arglist - 0 - - - @cil_ceq - 0 - - - @cil_cgt - 0 - - - @cil_cgt_un - 0 - - - @cil_clt - 0 - - - @cil_clt_un - 0 - - - @cil_ldftn - 0 - - - @cil_ldvirtftn - 0 - - - @cil_ldarg - 0 - - - @cil_ldarga - 0 - - - @cil_starg - 0 - - - @cil_ldloc - 0 - - - @cil_ldloca - 0 - - - @cil_stloc - 0 - - - @cil_localloc - 0 - - - @cil_endfilter - 0 - - - @cil_unaligned - 0 - - - @cil_volatile - 0 - - - @cil_tail - 0 - - - @cil_initobj - 0 - - - @cil_constrained - 0 - - - @cil_cpblk - 0 - - - @cil_initblk - 0 - - - @cil_rethrow - 0 - - - @cil_sizeof - 0 - - - @cil_refanytype - 0 - - - @cil_readonly - 0 - - - @cil_valueorreftype - 0 - - - @cil_typeparameter - 0 - - - @cil_array_type - 0 - - - @cil_pointer_type - 0 - - - @cil_function_pointer_type - 0 - - - @cil_method - 0 - - - @cil_method_implementation - 0 - - - @cil_parameter - 0 - - - @cil_field - 0 - - - @cil_property - 0 - - - @cil_event - 0 - - - @cil_local_variable - 0 - - - @cil_catch_handler - 0 - - - @cil_filter_handler - 0 - - - @cil_finally_handler - 0 - - - @cil_fault_handler - 0 - - - @cil_attribute - 0 - - - - - compilations - 1607 - - - id - 1607 - - - cwd - 1353 - - - - - id - cwd - - - 12 - - - 1 - 2 - 1607 - - - - - - - cwd - id - - - 12 - - - 1 - 2 - 1208 - - - 2 - 3 - 55 - - - 3 - 7 - 90 - - - - - - - - - compilation_info - 0 - - - id - 0 - - - info_key - 0 - - - info_value - 0 - - - - - id - info_key - - - 12 - - - - - - id - info_value - - - 12 - - - - - - info_key - id - - - 12 - - - - - - info_key - info_value - - - 12 - - - - - - info_value - id - - - 12 - - - - - - info_value - info_key - - - 12 - - - - - - - - compilation_args - 17990 - - - id - 777 - - - num - 166 - - - arg - 2580 - - - - - id - num - - - 12 - - - 7 - 20 - 36 - - - 20 - 21 - 115 - - - 21 - 22 - 277 - - - 22 - 23 - 108 - - - 23 - 24 - 55 - - - 24 - 26 - 59 - - - 26 - 30 - 64 - - - 30 - 93 - 59 - - - - - - - id - arg - - - 12 - - - 7 - 20 - 36 - - - 20 - 21 - 115 - - - 21 - 22 - 279 - - - 22 - 23 - 108 - - - 23 - 24 - 54 - - - 24 - 26 - 59 - - - 26 - 30 - 64 - - - 30 - 93 - 59 - - - - - - - num - id - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 73 - - - 4 - 8 - 12 - - - 9 - 15 - 14 - - - 15 - 58 - 12 - - - 69 - 412 - 12 - - - 428 - 430 - 3 - - - 430 - 431 - 18 - - - 431 - 432 - 12 - - - - - - - num - arg - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 81 - - - 4 - 8 - 12 - - - 9 - 10 - 7 - - - 10 - 11 - 12 - - - 12 - 16 - 12 - - - 19 - 42 - 12 - - - 53 - 117 - 12 - - - 120 - 274 - 9 - - - - - - - arg - id - - - 12 - - - 1 - 2 - 2111 - - - 2 - 3 - 194 - - - 3 - 16 - 200 - - - 16 - 432 - 73 - - - - - - - arg - num - - - 12 - - - 1 - 2 - 2167 - - - 2 - 3 - 209 - - - 3 - 15 - 196 - - - 16 - 26 - 7 - - - - - - - - - compilation_expanded_args - 593382 - - - id - 1375 - - - num - 6110 - - - arg - 64718 - - - - - id - num - - - 12 - - - 12 - 356 - 121 - - - 356 - 361 - 114 - - - 361 - 365 - 94 - - - 365 - 374 - 114 - - - 374 - 380 - 67 - - - 381 - 394 - 114 - - - 394 - 412 - 107 - - - 412 - 428 - 107 - - - 429 - 443 - 107 - - - 444 - 472 - 107 - - - 472 - 505 - 107 - - - 512 - 558 - 107 - - - 559 - 907 - 101 - - - - - - - id - arg - - - 12 - - - 12 - 356 - 121 - - - 356 - 361 - 114 - - - 361 - 365 - 94 - - - 365 - 374 - 114 - - - 374 - 380 - 67 - - - 381 - 394 - 114 - - - 394 - 412 - 107 - - - 412 - 428 - 107 - - - 429 - 443 - 107 - - - 444 - 472 - 107 - - - 472 - 505 - 107 - - - 512 - 558 - 107 - - - 559 - 907 - 101 - - - - - - - num - id - - - 12 - - - 1 - 4 - 472 - - - 4 - 5 - 478 - - - 5 - 7 - 485 - - - 7 - 11 - 161 - - - 11 - 12 - 411 - - - 12 - 19 - 458 - - - 19 - 45 - 458 - - - 47 - 105 - 458 - - - 105 - 201 - 364 - - - 201 - 202 - 1018 - - - 203 - 204 - 1261 - - - 204 - 205 - 80 - - - - - - - num - arg - - - 12 - - - 1 - 4 - 532 - - - 4 - 5 - 478 - - - 5 - 7 - 492 - - - 7 - 11 - 175 - - - 11 - 12 - 397 - - - 12 - 18 - 451 - - - 18 - 22 - 472 - - - 22 - 28 - 418 - - - 28 - 40 - 492 - - - 40 - 59 - 465 - - - 59 - 63 - 438 - - - 63 - 66 - 458 - - - 66 - 85 - 472 - - - 85 - 198 - 364 - - - - - - - arg - id - - - 12 - - - 1 - 2 - 59241 - - - 2 - 204 - 5456 - - - 204 - 205 - 20 - - - - - - - arg - num - - - 12 - - - 1 - 2 - 59322 - - - 2 - 67 - 5132 - - - 67 - 122 - 263 - - - - - - - - - compilation_compiling_files - 49163 - - - id - 777 - - - num - 3512 - - - file - 33855 - - - - - id - num - - - 12 - - - 1 - 2 - 32 - - - 2 - 3 - 324 - - - 3 - 4 - 57 - - - 4 - 9 - 63 - - - 9 - 21 - 63 - - - 21 - 46 - 59 - - - 47 - 97 - 59 - - - 98 - 173 - 59 - - - 175 - 1947 - 57 - - - - - - - id - file - - - 12 - - - 1 - 2 - 32 - - - 2 - 3 - 324 - - - 3 - 4 - 57 - - - 4 - 9 - 63 - - - 9 - 21 - 63 - - - 21 - 46 - 59 - - - 47 - 97 - 59 - - - 98 - 173 - 59 - - - 175 - 1947 - 57 - - - - - - - num - id - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 918 - - - 3 - 5 - 140 - - - 5 - 6 - 729 - - - 6 - 7 - 83 - - - 7 - 8 - 328 - - - 8 - 9 - 102 - - - 10 - 11 - 315 - - - 11 - 17 - 276 - - - 17 - 29 - 294 - - - 29 - 112 - 265 - - - 113 - 432 - 55 - - - - - - - num - file - - - 12 - - - 1 - 2 - 14 - - - 2 - 3 - 905 - - - 3 - 5 - 144 - - - 5 - 6 - 725 - - - 6 - 7 - 83 - - - 7 - 8 - 328 - - - 8 - 10 - 202 - - - 10 - 13 - 281 - - - 13 - 19 - 274 - - - 19 - 35 - 267 - - - 35 - 140 - 263 - - - 140 - 343 - 21 - - - - - - - file - id - - - 12 - - - 1 - 2 - 21715 - - - 2 - 3 - 10785 - - - 3 - 171 - 1355 - - - - - - - file - num - - - 12 - - - 1 - 2 - 23185 - - - 2 - 3 - 9805 - - - 3 - 32 - 864 - - - - - - - - - compilation_referencing_files - 466138 - - - id - 1375 - - - num - 4491 - - - file - 4876 - - - - - id - num - - - 12 - - - 4 - 303 - 114 - - - 303 - 305 - 40 - - - 305 - 307 - 121 - - - 307 - 310 - 114 - - - 310 - 313 - 107 - - - 314 - 329 - 107 - - - 329 - 330 - 87 - - - 330 - 336 - 121 - - - 336 - 340 - 107 - - - 340 - 349 - 107 - - - 350 - 374 - 107 - - - 374 - 382 - 114 - - - 383 - 626 - 107 - - - 649 - 667 - 13 - - - - - - - id - file - - - 12 - - - 4 - 303 - 114 - - - 303 - 305 - 40 - - - 305 - 307 - 121 - - - 307 - 310 - 114 - - - 310 - 313 - 107 - - - 314 - 329 - 107 - - - 329 - 330 - 87 - - - 330 - 336 - 121 - - - 336 - 340 - 107 - - - 340 - 349 - 107 - - - 350 - 374 - 107 - - - 374 - 382 - 114 - - - 383 - 626 - 107 - - - 649 - 667 - 13 - - - - - - - num - id - - - 12 - - - 1 - 6 - 350 - - - 6 - 7 - 1382 - - - 7 - 49 - 337 - - - 49 - 147 - 337 - - - 152 - 191 - 53 - - - 201 - 202 - 930 - - - 203 - 204 - 1072 - - - 204 - 205 - 26 - - - - - - - num - file - - - 12 - - - 1 - 5 - 370 - - - 5 - 6 - 613 - - - 6 - 7 - 755 - - - 7 - 23 - 370 - - - 23 - 29 - 377 - - - 29 - 33 - 337 - - - 33 - 46 - 350 - - - 46 - 63 - 343 - - - 63 - 69 - 350 - - - 69 - 73 - 411 - - - 73 - 83 - 209 - - - - - - - file - id - - - 12 - - - 1 - 2 - 404 - - - 2 - 6 - 242 - - - 6 - 7 - 505 - - - 7 - 8 - 505 - - - 8 - 10 - 384 - - - 10 - 47 - 391 - - - 47 - 140 - 370 - - - 142 - 184 - 40 - - - 201 - 202 - 930 - - - 203 - 204 - 1099 - - - - - - - file - num - - - 12 - - - 1 - 2 - 418 - - - 2 - 5 - 323 - - - 5 - 6 - 296 - - - 6 - 7 - 593 - - - 7 - 9 - 418 - - - 9 - 19 - 370 - - - 19 - 26 - 418 - - - 26 - 33 - 411 - - - 33 - 40 - 384 - - - 40 - 69 - 370 - - - 69 - 71 - 343 - - - 71 - 74 - 377 - - - 74 - 82 - 148 - - - - - - - - - compilation_time - 11249 - - - id - 1607 - - - num - 2 - - - kind - 17 - - - seconds - 6580 - - - - - id - num - - - 12 - - - 1 - 2 - 1607 - - - - - - - id - kind - - - 12 - - - 7 - 8 - 1607 - - - - - - - id - seconds - - - 12 - - - 6 - 7 - 12 - - - 7 - 8 - 1594 - - - - - - - num - id - - - 12 - - - 641 - 642 - 2 - - - - - - - num - kind - - - 12 - - - 7 - 8 - 2 - - - - - - - num - seconds - - - 12 - - - 2625 - 2626 - 2 - - - - - - - kind - id - - - 12 - - - 641 - 642 - 17 - - - - - - - kind - num - - - 12 - - - 1 - 2 - 17 - - - - - - - kind - seconds - - - 12 - - - 280 - 281 - 2 - - - 290 - 291 - 2 - - - 372 - 373 - 2 - - - 382 - 383 - 2 - - - 639 - 640 - 5 - - - 640 - 641 - 2 - - - - - - - seconds - id - - - 12 - - - 1 - 2 - 5545 - - - 2 - 6 - 589 - - - 6 - 17 - 446 - - - - - - - seconds - num - - - 12 - - - 1 - 2 - 6580 - - - - - - - seconds - kind - - - 12 - - - 1 - 2 - 5648 - - - 2 - 3 - 468 - - - 3 - 5 - 463 - - - - - - - - - diagnostic_for - 138224 - - - diagnostic - 138224 - - - compilation - 1335 - - - file_number - 6 - - - file_number_diagnostic_number - 31165 - - - - - diagnostic - compilation - - - 12 - - - 1 - 2 - 138224 - - - - - - - diagnostic - file_number - - - 12 - - - 1 - 2 - 138224 - - - - - - - diagnostic - file_number_diagnostic_number - - - 12 - - - 1 - 2 - 138224 - - - - - - - compilation - diagnostic - - - 12 - - - 2 - 4 - 40 - - - 4 - 5 - 593 - - - 5 - 7 - 121 - - - 7 - 23 - 114 - - - 24 - 48 - 101 - - - 50 - 88 - 101 - - - 99 - 184 - 101 - - - 222 - 303 - 101 - - - 327 - 4622 - 60 - - - - - - - compilation - file_number - - - 12 - - - 1 - 2 - 1335 - - - - - - - compilation - file_number_diagnostic_number - - - 12 - - - 2 - 4 - 40 - - - 4 - 5 - 593 - - - 5 - 7 - 121 - - - 7 - 23 - 114 - - - 24 - 48 - 101 - - - 50 - 88 - 101 - - - 99 - 184 - 101 - - - 222 - 303 - 101 - - - 327 - 4622 - 60 - - - - - - - file_number - diagnostic - - - 12 - - - 20495 - 20496 - 6 - - - - - - - file_number - compilation - - - 12 - - - 198 - 199 - 6 - - - - - - - file_number - file_number_diagnostic_number - - - 12 - - - 4621 - 4622 - 6 - - - - - - - file_number_diagnostic_number - diagnostic - - - 12 - - - 1 - 2 - 12753 - - - 2 - 3 - 8875 - - - 3 - 4 - 1315 - - - 4 - 5 - 4060 - - - 5 - 15 - 2380 - - - 15 - 199 - 1780 - - - - - - - file_number_diagnostic_number - compilation - - - 12 - - - 1 - 2 - 12753 - - - 2 - 3 - 8875 - - - 3 - 4 - 1315 - - - 4 - 5 - 4060 - - - 5 - 15 - 2380 - - - 15 - 199 - 1780 - - - - - - - file_number_diagnostic_number - file_number - - - 12 - - - 1 - 2 - 31165 - - - - - - - - - diagnostics - 138224 - - - id - 138224 - - - severity - 6 - - - error_tag - 13 - - - error_message - 13 - - - full_error_message - 26 - - - location - 138224 - - - - - id - severity - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - error_tag - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - full_error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - location - - - 12 - - - 1 - 2 - 138224 - - - - - - - severity - id - - - 12 - - - 20495 - 20496 - 6 - - - - - - - severity - error_tag - - - 12 - - - 2 - 3 - 6 - - - - - - - severity - error_message - - - 12 - - - 2 - 3 - 6 - - - - - - - severity - full_error_message - - - 12 - - - 4 - 5 - 6 - - - - - - - severity - location - - - 12 - - - 20495 - 20496 - 6 - - - - - - - error_tag - id - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - error_tag - severity - - - 12 - - - 1 - 2 - 13 - - - - - - - error_tag - error_message - - - 12 - - - 1 - 2 - 13 - - - - - - - error_tag - full_error_message - - - 12 - - - 1 - 2 - 6 - - - 3 - 4 - 6 - - - - - - - error_tag - location - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - error_message - id - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - error_message - severity - - - 12 - - - 1 - 2 - 13 - - - - - - - error_message - error_tag - - - 12 - - - 1 - 2 - 13 - - - - - - - error_message - full_error_message - - - 12 - - - 1 - 2 - 6 - - - 3 - 4 - 6 - - - - - - - error_message - location - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - full_error_message - id - - - 12 - - - 2 - 3 - 6 - - - 5 - 6 - 6 - - - 10 - 11 - 6 - - - 20478 - 20479 - 6 - - - - - - - full_error_message - severity - - - 12 - - - 1 - 2 - 26 - - - - - - - full_error_message - error_tag - - - 12 - - - 1 - 2 - 26 - - - - - - - full_error_message - error_message - - - 12 - - - 1 - 2 - 26 - - - - - - - full_error_message - location - - - 12 - - - 2 - 3 - 6 - - - 5 - 6 - 6 - - - 10 - 11 - 6 - - - 20478 - 20479 - 6 - - - - - - - location - id - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - severity - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - error_tag - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - full_error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - - - extractor_messages - 11378 - - - id - 11378 - - - severity - 2 - - - origin - 1 - - - text - 62 - - - entity - 4649 - - - location - 7633 - - - stack_trace - 282 - - - - - id - severity - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - origin - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - text - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - entity - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - location - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - stack_trace - - - 12 - - - 1 - 2 - 11378 - - - - - - - severity - id - - - 12 - - - 171 - 172 - 1 - - - 11207 - 11208 - 1 - - - - - - - severity - origin - - - 12 - - - 1 - 2 - 2 - - - - - - - severity - text - - - 12 - - - 2 - 3 - 1 - - - 60 - 61 - 1 - - - - - - - severity - entity - - - 12 - - - 13 - 14 - 1 - - - 4637 - 4638 - 1 - - - - - - - severity - location - - - 12 - - - 145 - 146 - 1 - - - 7488 - 7489 - 1 - - - - - - - severity - stack_trace - - - 12 - - - 1 - 2 - 1 - - - 281 - 282 - 1 - - - - - - - origin - id - - - 12 - - - 11378 - 11379 - 1 - - - - - - - origin - severity - - - 12 - - - 2 - 3 - 1 - - - - - - - origin - text - - - 12 - - - 62 - 63 - 1 - - - - - - - origin - entity - - - 12 - - - 4649 - 4650 - 1 - - - - - - - origin - location - - - 12 - - - 7633 - 7634 - 1 - - - - - - - origin - stack_trace - - - 12 - - - 282 - 283 - 1 - - - - - - - text - id - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 50 - - - 62 - 1999 - 5 - - - 2443 - 4657 - 2 - - - - - - - text - severity - - - 12 - - - 1 - 2 - 62 - - - - - - - text - origin - - - 12 - - - 1 - 2 - 62 - - - - - - - text - entity - - - 12 - - - 1 - 2 - 56 - - - 12 - 1398 - 5 - - - 1631 - 1632 - 1 - - - - - - - text - location - - - 12 - - - 1 - 2 - 55 - - - 36 - 1894 - 5 - - - 2045 - 3033 - 2 - - - - - - - text - stack_trace - - - 12 - - - 1 - 2 - 57 - - - 3 - 193 - 5 - - - - - - - entity - id - - - 12 - - - 1 - 2 - 3385 - - - 2 - 3 - 260 - - - 3 - 4 - 369 - - - 4 - 6 - 91 - - - 6 - 7 - 384 - - - 7 - 214 - 160 - - - - - - - entity - severity - - - 12 - - - 1 - 2 - 4648 - - - 2 - 3 - 1 - - - - - - - entity - origin - - - 12 - - - 1 - 2 - 4649 - - - - - - - entity - text - - - 12 - - - 1 - 2 - 4642 - - - 2 - 56 - 7 - - - - - - - entity - location - - - 12 - - - 1 - 2 - 3986 - - - 2 - 4 - 423 - - - 4 - 164 - 240 - - - - - - - entity - stack_trace - - - 12 - - - 1 - 2 - 4028 - - - 2 - 3 - 518 - - - 3 - 12 - 103 - - - - - - - location - id - - - 12 - - - 1 - 2 - 6201 - - - 2 - 3 - 64 - - - 3 - 4 - 1053 - - - 6 - 7 - 315 - - - - - - - location - severity - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - origin - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - text - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - entity - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - stack_trace - - - 12 - - - 1 - 2 - 7254 - - - 2 - 4 - 379 - - - - - - - stack_trace - id - - - 12 - - - 1 - 2 - 79 - - - 2 - 3 - 44 - - - 3 - 4 - 24 - - - 4 - 6 - 26 - - - 6 - 9 - 23 - - - 9 - 16 - 22 - - - 16 - 34 - 24 - - - 35 - 80 - 22 - - - 85 - 2137 - 18 - - - - - - - stack_trace - severity - - - 12 - - - 1 - 2 - 282 - - - - - - - stack_trace - origin - - - 12 - - - 1 - 2 - 282 - - - - - - - stack_trace - text - - - 12 - - - 1 - 2 - 279 - - - 2 - 37 - 3 - - - - - - - stack_trace - entity - - - 12 - - - 1 - 2 - 95 - - - 2 - 3 - 47 - - - 3 - 4 - 28 - - - 4 - 5 - 15 - - - 5 - 7 - 26 - - - 7 - 17 - 24 - - - 18 - 37 - 24 - - - 37 - 609 - 22 - - - 809 - 810 - 1 - - - - - - - stack_trace - location - - - 12 - - - 1 - 2 - 85 - - - 2 - 3 - 47 - - - 3 - 4 - 23 - - - 4 - 5 - 16 - - - 5 - 7 - 26 - - - 7 - 14 - 22 - - - 14 - 30 - 23 - - - 31 - 62 - 22 - - - 63 - 1135 - 18 - - - - - - - - - compilation_finished - 1607 - - - id - 1607 - - - cpu_seconds - 1110 - - - elapsed_seconds - 1607 - - - - - id - cpu_seconds - - - 12 - - - 1 - 2 - 1607 - - - - - - - id - elapsed_seconds - - - 12 - - - 1 - 2 - 1607 - - - - - - - cpu_seconds - id - - - 12 - - - 1 - 2 - 772 - - - 2 - 3 - 220 - - - 3 - 4 - 87 - - - 4 - 7 - 30 - - - - - - - cpu_seconds - elapsed_seconds - - - 12 - - - 1 - 2 - 772 - - - 2 - 3 - 220 - - - 3 - 4 - 87 - - - 4 - 7 - 30 - - - - - - - elapsed_seconds - id - - - 12 - - - 1 - 2 - 1607 - - - - - - - elapsed_seconds - cpu_seconds - - - 12 - - - 1 - 2 - 1607 - - - - - - - - - compilation_assembly - 1607 - - - id - 1607 - - - assembly - 1607 - - - - - id - assembly - - - 12 - - - 1 - 2 - 1607 - - - - - - - assembly - id - - - 12 - - - 1 - 2 - 1607 - - - - - - - - - externalData - 0 - - - id - 0 - - - path - 0 - - - column - 0 - - - value - 0 - - - - - id - path - - - 12 - - - - - - id - column - - - 12 - - - - - - id - value - - - 12 - - - - - - path - id - - - 12 - - - - - - path - column - - - 12 - - - - - - path - value - - - 12 - - - - - - column - id - - - 12 - - - - - - column - path - - - 12 - - - - - - column - value - - - 12 - - - - - - value - id - - - 12 - - - - - - value - path - - - 12 - - - - - - value - column - - - 12 - - - - - - - - sourceLocationPrefix - 60 - - - prefix - 60 - - - - - - locations_default - 154005847 - - - id - 154005847 - - - file - 85462 - - - beginLine - 373077 - - - beginColumn - 11198 - - - endLine - 387748 - - - endColumn - 15839 - - - - - id - file - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - beginLine - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - beginColumn - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - endLine - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - endColumn - - - 12 - - - 1 - 2 - 154005847 - - - - - - - file - id - - - 12 - - - 1 - 14 - 6553 - - - 14 - 29 - 6445 - - - 29 - 56 - 6478 - - - 56 - 99 - 6540 - - - 99 - 147 - 6550 - - - 147 - 247 - 6418 - - - 247 - 383 - 6433 - - - 383 - 562 - 6478 - - - 562 - 887 - 6410 - - - 887 - 1560 - 6701 - - - 1561 - 2241 - 6658 - - - 2243 - 4570 - 6623 - - - 4570 - 25909 - 6420 - - - 26296 - 267080 - 749 - - - - - - - file - beginLine - - - 12 - - - 1 - 9 - 7099 - - - 9 - 17 - 6999 - - - 17 - 27 - 6801 - - - 27 - 44 - 6663 - - - 44 - 65 - 6428 - - - 65 - 101 - 6455 - - - 101 - 151 - 6999 - - - 151 - 229 - 6508 - - - 229 - 401 - 6538 - - - 401 - 674 - 6415 - - - 674 - 1032 - 7047 - - - 1032 - 2141 - 6425 - - - 2149 - 121882 - 5079 - - - - - - - file - beginColumn - - - 12 - - - 1 - 6 - 5974 - - - 6 - 10 - 6906 - - - 10 - 18 - 6701 - - - 18 - 27 - 7578 - - - 27 - 38 - 6846 - - - 38 - 51 - 6628 - - - 51 - 64 - 6513 - - - 64 - 82 - 6698 - - - 82 - 106 - 6651 - - - 106 - 126 - 7543 - - - 126 - 167 - 6435 - - - 167 - 229 - 6500 - - - 229 - 2578 - 4482 - - - - - - - file - endLine - - - 12 - - - 1 - 9 - 6954 - - - 9 - 18 - 6596 - - - 18 - 27 - 6703 - - - 27 - 43 - 6606 - - - 43 - 72 - 6523 - - - 72 - 112 - 6530 - - - 112 - 190 - 7237 - - - 190 - 285 - 6901 - - - 285 - 484 - 6593 - - - 484 - 841 - 6410 - - - 841 - 1381 - 7237 - - - 1381 - 2762 - 6433 - - - 2765 - 135652 - 4733 - - - - - - - file - endColumn - - - 12 - - - 1 - 12 - 7044 - - - 12 - 23 - 6831 - - - 23 - 37 - 6616 - - - 37 - 51 - 6490 - - - 51 - 66 - 6533 - - - 66 - 86 - 6726 - - - 86 - 107 - 6555 - - - 107 - 131 - 6633 - - - 131 - 153 - 6839 - - - 153 - 183 - 7049 - - - 183 - 226 - 7117 - - - 226 - 304 - 6423 - - - 304 - 4355 - 4600 - - - - - - - beginLine - id - - - 12 - - - 1 - 2 - 5856 - - - 2 - 3 - 30300 - - - 3 - 6 - 29573 - - - 6 - 7 - 18313 - - - 7 - 9 - 33659 - - - 9 - 11 - 28219 - - - 11 - 15 - 28334 - - - 15 - 21 - 29580 - - - 21 - 29 - 28557 - - - 29 - 47 - 28698 - - - 47 - 84 - 28141 - - - 84 - 146 - 28164 - - - 146 - 946 - 27991 - - - 946 - 61765 - 27687 - - - - - - - beginLine - file - - - 12 - - - 1 - 2 - 39445 - - - 2 - 3 - 14322 - - - 3 - 4 - 51905 - - - 4 - 5 - 40202 - - - 5 - 6 - 18775 - - - 6 - 7 - 17654 - - - 7 - 8 - 20018 - - - 8 - 11 - 32034 - - - 11 - 20 - 29196 - - - 20 - 35 - 29470 - - - 35 - 59 - 28076 - - - 59 - 366 - 28026 - - - 366 - 32788 - 23947 - - - - - - - beginLine - beginColumn - - - 12 - - - 1 - 2 - 22673 - - - 2 - 3 - 54618 - - - 3 - 4 - 40508 - - - 4 - 5 - 27918 - - - 5 - 7 - 32207 - - - 7 - 9 - 24087 - - - 9 - 12 - 28181 - - - 12 - 17 - 31495 - - - 17 - 26 - 29131 - - - 26 - 43 - 28891 - - - 43 - 89 - 28349 - - - 89 - 2349 - 25012 - - - - - - - beginLine - endLine - - - 12 - - - 1 - 2 - 58511 - - - 2 - 3 - 97596 - - - 3 - 4 - 60735 - - - 4 - 5 - 32338 - - - 5 - 6 - 21886 - - - 6 - 8 - 33205 - - - 8 - 11 - 30317 - - - 11 - 16 - 28219 - - - 16 - 1412 - 10266 - - - - - - - beginLine - endColumn - - - 12 - - - 1 - 2 - 6653 - - - 2 - 3 - 38525 - - - 3 - 4 - 21545 - - - 4 - 5 - 20663 - - - 5 - 6 - 27168 - - - 6 - 8 - 31892 - - - 8 - 11 - 29788 - - - 11 - 15 - 28344 - - - 15 - 22 - 31310 - - - 22 - 33 - 28339 - - - 33 - 53 - 28033 - - - 53 - 80 - 28698 - - - 80 - 146 - 28269 - - - 146 - 4143 - 23844 - - - - - - - beginColumn - id - - - 12 - - - 1 - 2 - 3928 - - - 2 - 3 - 857 - - - 3 - 4 - 1985 - - - 4 - 31 - 900 - - - 31 - 72 - 847 - - - 72 - 223 - 842 - - - 223 - 1906 - 842 - - - 1936 - 129644 - 842 - - - 130043 - 9382473 - 152 - - - - - - - beginColumn - file - - - 12 - - - 1 - 2 - 6495 - - - 2 - 17 - 935 - - - 17 - 45 - 847 - - - 45 - 113 - 842 - - - 113 - 403 - 842 - - - 404 - 6301 - 842 - - - 6367 - 33866 - 393 - - - - - - - beginColumn - beginLine - - - 12 - - - 1 - 2 - 6438 - - - 2 - 4 - 900 - - - 4 - 9 - 905 - - - 9 - 28 - 842 - - - 28 - 189 - 842 - - - 190 - 4498 - 842 - - - 4502 - 139673 - 428 - - - - - - - beginColumn - endLine - - - 12 - - - 1 - 2 - 6438 - - - 2 - 4 - 900 - - - 4 - 9 - 905 - - - 9 - 29 - 847 - - - 29 - 198 - 844 - - - 200 - 4659 - 842 - - - 4677 - 139725 - 421 - - - - - - - beginColumn - endColumn - - - 12 - - - 1 - 2 - 4387 - - - 2 - 3 - 1118 - - - 3 - 4 - 2203 - - - 4 - 9 - 962 - - - 9 - 25 - 859 - - - 25 - 97 - 842 - - - 97 - 1240 - 824 - - - - - - - endLine - id - - - 12 - - - 1 - 2 - 26328 - - - 2 - 4 - 28657 - - - 4 - 6 - 29379 - - - 6 - 7 - 14573 - - - 7 - 8 - 21560 - - - 8 - 10 - 32501 - - - 10 - 14 - 31969 - - - 14 - 20 - 29585 - - - 20 - 28 - 29495 - - - 28 - 45 - 29417 - - - 45 - 83 - 29720 - - - 83 - 147 - 29114 - - - 147 - 987 - 29099 - - - 987 - 60323 - 26343 - - - - - - - endLine - file - - - 12 - - - 1 - 2 - 44630 - - - 2 - 3 - 2587 - - - 3 - 4 - 39390 - - - 4 - 5 - 56857 - - - 5 - 7 - 31373 - - - 7 - 8 - 17253 - - - 8 - 9 - 23844 - - - 9 - 13 - 31914 - - - 13 - 26 - 29833 - - - 26 - 45 - 29708 - - - 45 - 78 - 29101 - - - 78 - 500 - 29121 - - - 500 - 32902 - 22132 - - - - - - - endLine - beginLine - - - 12 - - - 1 - 2 - 86407 - - - 2 - 3 - 84928 - - - 3 - 4 - 60986 - - - 4 - 5 - 31814 - - - 5 - 6 - 21342 - - - 6 - 8 - 33285 - - - 8 - 11 - 30377 - - - 11 - 17 - 30786 - - - 17 - 72 - 7819 - - - - - - - endLine - beginColumn - - - 12 - - - 1 - 2 - 31277 - - - 2 - 3 - 44216 - - - 3 - 4 - 46029 - - - 4 - 5 - 28271 - - - 5 - 7 - 35898 - - - 7 - 9 - 25599 - - - 9 - 12 - 30415 - - - 12 - 17 - 33566 - - - 17 - 26 - 29861 - - - 26 - 44 - 30192 - - - 44 - 93 - 29084 - - - 93 - 2350 - 23335 - - - - - - - endLine - endColumn - - - 12 - - - 1 - 2 - 33539 - - - 2 - 3 - 26050 - - - 3 - 4 - 10908 - - - 4 - 5 - 37242 - - - 5 - 6 - 21219 - - - 6 - 8 - 34328 - - - 8 - 11 - 28309 - - - 11 - 16 - 33376 - - - 16 - 24 - 31979 - - - 24 - 38 - 30365 - - - 38 - 62 - 29806 - - - 62 - 102 - 29252 - - - 102 - 183 - 29156 - - - 183 - 4143 - 12214 - - - - - - - endColumn - id - - - 12 - - - 1 - 2 - 10476 - - - 2 - 17 - 1215 - - - 17 - 70 - 1190 - - - 70 - 387 - 1188 - - - 389 - 21752 - 1188 - - - 21853 - 3512891 - 579 - - - - - - - endColumn - file - - - 12 - - - 1 - 2 - 10662 - - - 2 - 18 - 1233 - - - 18 - 72 - 1190 - - - 73 - 337 - 1190 - - - 337 - 11711 - 1190 - - - 11721 - 28029 - 371 - - - - - - - endColumn - beginLine - - - 12 - - - 1 - 2 - 10644 - - - 2 - 6 - 1366 - - - 6 - 20 - 1223 - - - 20 - 227 - 1188 - - - 227 - 25452 - 1188 - - - 25707 - 121783 - 228 - - - - - - - endColumn - beginColumn - - - 12 - - - 1 - 2 - 11171 - - - 2 - 6 - 1413 - - - 6 - 19 - 1238 - - - 19 - 123 - 1193 - - - 123 - 429 - 822 - - - - - - - endColumn - endLine - - - 12 - - - 1 - 2 - 10634 - - - 2 - 6 - 1371 - - - 6 - 19 - 1188 - - - 19 - 203 - 1190 - - - 205 - 22718 - 1188 - - - 22852 - 121781 - 265 - - - - - - - - - locations_mapped - 997878 - - - id - 997878 - - - mapped_to - 757768 - - - - - id - mapped_to - - - 12 - - - 1 - 2 - 997878 - - - - - - - mapped_to - id - - - 12 - - - 1 - 2 - 683587 - - - 2 - 4 - 58533 - - - 4 - 141 - 15646 - - - - - - - - - numlines - 67406913 - - - element_id - 67406743 - - - num_lines - 8225 - - - num_code - 8127 - - - num_comment - 641 - - - - - element_id - num_lines - - - 12 - - - 1 - 2 - 67406610 - - - 2 - 11 - 132 - - - - - - - element_id - num_code - - - 12 - - - 1 - 2 - 67406612 - - - 2 - 11 - 130 - - - - - - - element_id - num_comment - - - 12 - - - 1 - 2 - 67406730 - - - 2 - 3 - 12 - - - - - - - num_lines - element_id - - - 12 - - - 1 - 2 - 2705 - - - 2 - 3 - 1045 - - - 3 - 4 - 406 - - - 4 - 6 - 561 - - - 6 - 9 - 671 - - - 9 - 12 - 711 - - - 12 - 18 - 641 - - - 18 - 41 - 626 - - - 41 - 304 - 619 - - - 310 - 17523363 - 235 - - - - - - - num_lines - num_code - - - 12 - - - 1 - 2 - 6127 - - - 2 - 3 - 704 - - - 3 - 7 - 679 - - - 7 - 35 - 621 - - - 35 - 43 - 92 - - - - - - - num_lines - num_comment - - - 12 - - - 1 - 2 - 6119 - - - 2 - 3 - 722 - - - 3 - 7 - 701 - - - 7 - 30 - 636 - - - 30 - 107 - 45 - - - - - - - num_code - element_id - - - 12 - - - 1 - 2 - 2637 - - - 2 - 3 - 1035 - - - 3 - 4 - 426 - - - 4 - 6 - 576 - - - 6 - 9 - 636 - - - 9 - 12 - 709 - - - 12 - 18 - 654 - - - 18 - 41 - 621 - - - 41 - 324 - 611 - - - 324 - 17558507 - 218 - - - - - - - num_code - num_lines - - - 12 - - - 1 - 2 - 6317 - - - 2 - 3 - 596 - - - 3 - 8 - 629 - - - 8 - 111 - 584 - - - - - - - num_code - num_comment - - - 12 - - - 1 - 2 - 6307 - - - 2 - 3 - 624 - - - 3 - 7 - 611 - - - 7 - 107 - 584 - - - - - - - num_comment - element_id - - - 12 - - - 1 - 2 - 228 - - - 2 - 3 - 77 - - - 3 - 4 - 45 - - - 4 - 8 - 50 - - - 8 - 16 - 50 - - - 16 - 27 - 50 - - - 27 - 64 - 50 - - - 64 - 257 - 50 - - - 305 - 26794617 - 40 - - - - - - - num_comment - num_lines - - - 12 - - - 1 - 2 - 228 - - - 2 - 3 - 80 - - - 3 - 4 - 45 - - - 4 - 8 - 55 - - - 8 - 15 - 50 - - - 15 - 24 - 50 - - - 25 - 54 - 50 - - - 55 - 123 - 50 - - - 136 - 3069 - 32 - - - - - - - num_comment - num_code - - - 12 - - - 1 - 2 - 228 - - - 2 - 3 - 80 - - - 3 - 4 - 45 - - - 4 - 8 - 55 - - - 8 - 15 - 50 - - - 15 - 24 - 50 - - - 24 - 50 - 50 - - - 51 - 114 - 50 - - - 129 - 3063 - 32 - - - - - - - - - assemblies - 14527 - - - id - 14527 - - - file - 14527 - - - fullname - 14107 - - - name - 13867 - - - version - 1680 - - - - - id - file - - - 12 - - - 1 - 2 - 14527 - - - - - - - id - fullname - - - 12 - - - 1 - 2 - 14527 - - - - - - - id - name - - - 12 - - - 1 - 2 - 14527 - - - - - - - id - version - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - id - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - fullname - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - name - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - version - - - 12 - - - 1 - 2 - 14527 - - - - - - - fullname - id - - - 12 - - - 1 - 2 - 13687 - - - 2 - 3 - 420 - - - - - - - fullname - file - - - 12 - - - 1 - 2 - 13687 - - - 2 - 3 - 420 - - - - - - - fullname - name - - - 12 - - - 1 - 2 - 14107 - - - - - - - fullname - version - - - 12 - - - 1 - 2 - 14107 - - - - - - - name - id - - - 12 - - - 1 - 2 - 13267 - - - 2 - 4 - 600 - - - - - - - name - file - - - 12 - - - 1 - 2 - 13267 - - - 2 - 4 - 600 - - - - - - - name - fullname - - - 12 - - - 1 - 2 - 13687 - - - 2 - 4 - 180 - - - - - - - name - version - - - 12 - - - 1 - 2 - 13687 - - - 2 - 4 - 180 - - - - - - - version - id - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 32 - 134 - 120 - - - - - - - version - file - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 32 - 134 - 120 - - - - - - - version - fullname - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 25 - 134 - 120 - - - - - - - version - name - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 25 - 134 - 120 - - - - - - - - - files - 92261 - - - id - 92261 - - - name - 92261 - - - - - id - name - - - 12 - - - 1 - 2 - 92261 - - - - - - - name - id - - - 12 - - - 1 - 2 - 92261 - - - - - - - - - folders - 34263 - - - id - 34263 - - - name - 34263 - - - - - id - name - - - 12 - - - 1 - 2 - 34263 - - - - - - - name - id - - - 12 - - - 1 - 2 - 34263 - - - - - - - - - containerparent - 126520 - - - parent - 34263 - - - child - 126520 - - - - - parent - child - - - 12 - - - 1 - 2 - 20883 - - - 2 - 3 - 4735 - - - 3 - 4 - 1724 - - - 4 - 7 - 3108 - - - 7 - 17 - 2599 - - - 17 - 546 - 1210 - - - - - - - child - parent - - - 12 - - - 1 - 2 - 126520 - - - - - - - - - file_extraction_mode - 57602 - - - file - 57602 - - - mode - 6 - - - - - file - mode - - - 12 - - - 1 - 2 - 57602 - - - - - - - mode - file - - - 12 - - - 8541 - 8542 - 6 - - - - - - - - - namespaces - 206514 - - - id - 206514 - - - name - 67590 - - - - - id - name - - - 12 - - - 1 - 2 - 206514 - - - - - - - name - id - - - 12 - - - 1 - 2 - 40636 - - - 2 - 3 - 9485 - - - 3 - 4 - 6748 - - - 4 - 7 - 5267 - - - 7 - 47 - 5082 - - - 47 - 160 - 370 - - - - - - - - - namespace_declarations - 37444 - - - id - 37444 - - - namespace_id - 6649 - - - - - id - namespace_id - - - 12 - - - 1 - 2 - 37444 - - - - - - - namespace_id - id - - - 12 - - - 1 - 2 - 2340 - - - 2 - 3 - 1362 - - - 3 - 4 - 674 - - - 4 - 5 - 465 - - - 5 - 6 - 377 - - - 6 - 9 - 600 - - - 9 - 16 - 526 - - - 16 - 1420 - 303 - - - - - - - - - namespace_declaration_location - 37444 - - - id - 37444 - - - loc - 37444 - - - - - id - loc - - - 12 - - - 1 - 2 - 37444 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 37444 - - - - - - - - - parent_namespace - 8107683 - - - child_id - 8107683 - - - namespace_id - 204930 - - - - - child_id - namespace_id - - - 12 - - - 1 - 2 - 8107683 - - - - - - - namespace_id - child_id - - - 12 - - - 1 - 2 - 43208 - - - 2 - 3 - 28476 - - - 3 - 4 - 19320 - - - 4 - 5 - 13950 - - - 5 - 6 - 11892 - - - 6 - 8 - 17221 - - - 8 - 11 - 16501 - - - 11 - 16 - 15596 - - - 16 - 27 - 15925 - - - 27 - 76 - 15369 - - - 76 - 102770 - 7468 - - - - - - - - - parent_namespace_declaration - 185724 - - - child_id - 184422 - - - namespace_id - 37444 - - - - - child_id - namespace_id - - - 12 - - - 1 - 2 - 184119 - - - 2 - 76 - 303 - - - - - - - namespace_id - child_id - - - 12 - - - 1 - 2 - 25965 - - - 2 - 9 - 2866 - - - 9 - 14 - 2879 - - - 14 - 18 - 3324 - - - 18 - 39 - 2407 - - - - - - - - - using_global - 9371 - - - id - 9371 - - - - - - using_namespace_directives - 286854 - - - id - 286854 - - - namespace_id - 7263 - - - - - id - namespace_id - - - 12 - - - 1 - 2 - 286854 - - - - - - - namespace_id - id - - - 12 - - - 1 - 2 - 2535 - - - 2 - 3 - 910 - - - 3 - 4 - 526 - - - 4 - 6 - 627 - - - 6 - 9 - 593 - - - 9 - 19 - 606 - - - 19 - 39 - 566 - - - 40 - 148 - 546 - - - 149 - 3400 - 350 - - - - - - - - - using_static_directives - 1202 - - - id - 1202 - - - type_id - 134 - - - - - id - type_id - - - 12 - - - 1 - 2 - 1202 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 11 - - - 2 - 3 - 24 - - - 3 - 4 - 24 - - - 4 - 5 - 18 - - - 5 - 7 - 10 - - - 7 - 9 - 11 - - - 9 - 12 - 10 - - - 12 - 16 - 11 - - - 16 - 49 - 11 - - - 56 - 156 - 4 - - - - - - - - - using_directive_location - 286956 - - - id - 286956 - - - loc - 286888 - - - - - id - loc - - - 12 - - - 1 - 2 - 286956 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 286821 - - - 2 - 3 - 67 - - - - - - - - - directive_ifs - 20769 - - - id - 20769 - - - branchTaken - 3 - - - conditionValue - 3 - - - - - id - branchTaken - - - 12 - - - 1 - 2 - 20769 - - - - - - - id - conditionValue - - - 12 - - - 1 - 2 - 20769 - - - - - - - branchTaken - id - - - 12 - - - 5274 - 5275 - 1 - - - 6234 - 6235 - 1 - - - - - - - branchTaken - conditionValue - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - - - - - conditionValue - id - - - 12 - - - 5423 - 5424 - 1 - - - 6085 - 6086 - 1 - - - - - - - conditionValue - branchTaken - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - - - - - - - directive_elifs - 293 - - - id - 293 - - - branchTaken - 5 - - - conditionValue - 5 - - - parent - 177 - - - index - 17 - - - - - id - branchTaken - - - 12 - - - 1 - 2 - 293 - - - - - - - id - conditionValue - - - 12 - - - 1 - 2 - 293 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 293 - - - - - - - id - index - - - 12 - - - 1 - 2 - 293 - - - - - - - branchTaken - id - - - 12 - - - 21 - 22 - 2 - - - 96 - 97 - 2 - - - - - - - branchTaken - conditionValue - - - 12 - - - 1 - 2 - 5 - - - - - - - branchTaken - parent - - - 12 - - - 18 - 19 - 2 - - - 57 - 58 - 2 - - - - - - - branchTaken - index - - - 12 - - - 3 - 4 - 2 - - - 6 - 7 - 2 - - - - - - - conditionValue - id - - - 12 - - - 21 - 22 - 2 - - - 96 - 97 - 2 - - - - - - - conditionValue - branchTaken - - - 12 - - - 1 - 2 - 5 - - - - - - - conditionValue - parent - - - 12 - - - 18 - 19 - 2 - - - 57 - 58 - 2 - - - - - - - conditionValue - index - - - 12 - - - 3 - 4 - 2 - - - 6 - 7 - 2 - - - - - - - parent - id - - - 12 - - - 1 - 2 - 75 - - - 2 - 3 - 92 - - - 4 - 8 - 10 - - - - - - - parent - branchTaken - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 10 - - - - - - - parent - conditionValue - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 10 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 75 - - - 2 - 3 - 100 - - - 7 - 8 - 2 - - - - - - - index - id - - - 12 - - - 1 - 2 - 12 - - - 41 - 42 - 2 - - - 71 - 72 - 2 - - - - - - - index - branchTaken - - - 12 - - - 1 - 2 - 12 - - - 2 - 3 - 5 - - - - - - - index - conditionValue - - - 12 - - - 1 - 2 - 12 - - - 2 - 3 - 5 - - - - - - - index - parent - - - 12 - - - 1 - 2 - 12 - - - 41 - 42 - 2 - - - 71 - 72 - 2 - - - - - - - - - directive_elses - 6744 - - - id - 6744 - - - branchTaken - 3 - - - parent - 6746 - - - index - 10 - - - - - id - branchTaken - - - 12 - - - 1 - 2 - 6744 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 6744 - - - - - - - id - index - - - 12 - - - 1 - 2 - 6744 - - - - - - - branchTaken - id - - - 12 - - - 1686 - 1687 - 1 - - - 2051 - 2052 - 1 - - - - - - - branchTaken - parent - - - 12 - - - 1691 - 1692 - 1 - - - 2051 - 2052 - 1 - - - - - - - branchTaken - index - - - 12 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - - - - - parent - id - - - 12 - - - 1 - 2 - 6739 - - - 2 - 3 - 7 - - - - - - - parent - branchTaken - - - 12 - - - 1 - 2 - 6739 - - - 2 - 3 - 7 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 6746 - - - - - - - index - id - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 1 - - - 3 - 4 - 1 - - - 37 - 38 - 1 - - - 3693 - 3694 - 1 - - - - - - - index - branchTaken - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 5 - - - - - - - index - parent - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 1 - - - 3 - 4 - 1 - - - 38 - 39 - 1 - - - 3693 - 3694 - 1 - - - - - - - - - directive_endifs - 20338 - - - id - 20338 - - - start - 20769 - - - - - id - start - - - 12 - - - 1 - 2 - 20338 - - - - - - - start - id - - - 12 - - - 1 - 2 - 20769 - - - - - - - - - directive_define_symbols - 40315 - - - id - 40315 - - - name - 887 - - - - - id - name - - - 12 - - - 1 - 2 - 40315 - - - - - - - name - id - - - 12 - - - 1 - 2 - 102 - - - 2 - 3 - 151 - - - 3 - 4 - 45 - - - 4 - 5 - 64 - - - 5 - 7 - 77 - - - 7 - 10 - 66 - - - 10 - 13 - 68 - - - 13 - 21 - 66 - - - 21 - 40 - 66 - - - 40 - 77 - 66 - - - 78 - 174 - 66 - - - 178 - 2403 - 43 - - - - - - - - - directive_regions - 38812 - - - id - 38812 - - - name - 18812 - - - - - id - name - - - 12 - - - 1 - 2 - 38812 - - - - - - - name - id - - - 12 - - - 1 - 2 - 15529 - - - 2 - 3 - 1528 - - - 3 - 14 - 1414 - - - 14 - 111 - 339 - - - - - - - - - directive_endregions - 38812 - - - id - 38812 - - - start - 38812 - - - - - id - start - - - 12 - - - 1 - 2 - 38812 - - - - - - - start - id - - - 12 - - - 1 - 2 - 38812 - - - - - - - - - directive_lines - 539550 - - - id - 539550 - - - kind - 26 - - - - - id - kind - - - 12 - - - 1 - 2 - 539550 - - - - - - - kind - id - - - 12 - - - 8245 - 8246 - 6 - - - 17726 - 17727 - 6 - - - 25971 - 25972 - 6 - - - 28059 - 28060 - 6 - - - - - - - - - directive_line_value - 119549 - - - id - 119549 - - - line - 1706 - - - - - id - line - - - 12 - - - 1 - 2 - 119549 - - - - - - - line - id - - - 12 - - - 1 - 2 - 343 - - - 2 - 3 - 269 - - - 3 - 4 - 121 - - - 4 - 6 - 155 - - - 6 - 9 - 101 - - - 9 - 13 - 141 - - - 13 - 22 - 134 - - - 22 - 38 - 128 - - - 38 - 218 - 134 - - - 219 - 760 - 128 - - - 761 - 1105 - 47 - - - - - - - - - directive_line_file - 175155 - - - id - 175155 - - - file - 9246 - - - - - id - file - - - 12 - - - 1 - 2 - 175155 - - - - - - - file - id - - - 12 - - - 1 - 2 - 1119 - - - 2 - 3 - 1571 - - - 3 - 4 - 1031 - - - 4 - 6 - 809 - - - 6 - 8 - 843 - - - 8 - 11 - 714 - - - 11 - 14 - 775 - - - 14 - 21 - 701 - - - 21 - 36 - 755 - - - 36 - 78 - 694 - - - 78 - 3808 - 229 - - - - - - - - - directive_line_offset - 55606 - - - id - 55606 - - - offset - 60 - - - - - id - offset - - - 12 - - - 1 - 2 - 55606 - - - - - - - offset - id - - - 12 - - - 2 - 3 - 6 - - - 21 - 22 - 6 - - - 36 - 37 - 6 - - - 201 - 202 - 6 - - - 250 - 251 - 6 - - - 456 - 457 - 6 - - - 521 - 522 - 6 - - - 648 - 649 - 6 - - - 6110 - 6111 - 6 - - - - - - - - - directive_line_span - 55606 - - - id - 55606 - - - startLine - 2030 - - - startColumn - 2097 - - - endLine - 2030 - - - endColumn - 2306 - - - - - id - startLine - - - 12 - - - 1 - 2 - 55606 - - - - - - - id - startColumn - - - 12 - - - 1 - 2 - 55606 - - - - - - - id - endLine - - - 12 - - - 1 - 2 - 55606 - - - - - - - id - endColumn - - - 12 - - - 1 - 2 - 55606 - - - - - - - startLine - id - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 222 - - - 3 - 5 - 161 - - - 5 - 8 - 175 - - - 8 - 10 - 128 - - - 10 - 15 - 168 - - - 16 - 29 - 161 - - - 30 - 45 - 161 - - - 47 - 93 - 155 - - - 93 - 252 - 155 - - - 262 - 374 - 20 - - - - - - - startLine - startColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 155 - - - 5 - 7 - 134 - - - 7 - 9 - 128 - - - 9 - 13 - 168 - - - 13 - 23 - 175 - - - 24 - 31 - 161 - - - 32 - 52 - 168 - - - 52 - 81 - 155 - - - 81 - 90 - 33 - - - - - - - startLine - endLine - - - 12 - - - 1 - 2 - 1996 - - - 2 - 3 - 33 - - - - - - - startLine - endColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 161 - - - 5 - 7 - 114 - - - 7 - 9 - 155 - - - 9 - 14 - 161 - - - 14 - 24 - 161 - - - 24 - 34 - 161 - - - 34 - 58 - 155 - - - 58 - 94 - 161 - - - 94 - 124 - 47 - - - - - - - startColumn - id - - - 12 - - - 1 - 2 - 411 - - - 2 - 3 - 215 - - - 3 - 4 - 121 - - - 4 - 6 - 155 - - - 6 - 8 - 155 - - - 8 - 11 - 134 - - - 11 - 16 - 188 - - - 16 - 27 - 161 - - - 27 - 50 - 168 - - - 50 - 74 - 161 - - - 74 - 142 - 161 - - - 145 - 495 - 60 - - - - - - - startColumn - startLine - - - 12 - - - 1 - 2 - 418 - - - 2 - 3 - 229 - - - 3 - 4 - 128 - - - 4 - 5 - 74 - - - 5 - 6 - 121 - - - 6 - 9 - 182 - - - 9 - 12 - 188 - - - 12 - 19 - 175 - - - 19 - 29 - 168 - - - 29 - 44 - 168 - - - 44 - 58 - 161 - - - 58 - 103 - 80 - - - - - - - startColumn - endLine - - - 12 - - - 1 - 2 - 418 - - - 2 - 3 - 229 - - - 3 - 4 - 128 - - - 4 - 5 - 74 - - - 5 - 6 - 121 - - - 6 - 9 - 182 - - - 9 - 12 - 188 - - - 12 - 19 - 175 - - - 19 - 29 - 168 - - - 29 - 44 - 168 - - - 44 - 58 - 161 - - - 58 - 103 - 80 - - - - - - - startColumn - endColumn - - - 12 - - - 1 - 2 - 458 - - - 2 - 3 - 195 - - - 3 - 4 - 161 - - - 4 - 5 - 148 - - - 5 - 7 - 168 - - - 7 - 9 - 128 - - - 9 - 12 - 182 - - - 12 - 17 - 188 - - - 17 - 27 - 175 - - - 27 - 34 - 161 - - - 35 - 127 - 128 - - - - - - - endLine - id - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 222 - - - 3 - 5 - 161 - - - 5 - 8 - 175 - - - 8 - 10 - 128 - - - 10 - 15 - 168 - - - 16 - 29 - 161 - - - 30 - 45 - 161 - - - 47 - 93 - 155 - - - 93 - 251 - 155 - - - 261 - 374 - 20 - - - - - - - endLine - startLine - - - 12 - - - 1 - 2 - 2003 - - - 2 - 4 - 26 - - - - - - - endLine - startColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 155 - - - 5 - 7 - 134 - - - 7 - 9 - 128 - - - 9 - 13 - 168 - - - 13 - 23 - 175 - - - 24 - 31 - 161 - - - 32 - 52 - 161 - - - 52 - 80 - 155 - - - 80 - 90 - 40 - - - - - - - endLine - endColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 161 - - - 5 - 7 - 114 - - - 7 - 9 - 155 - - - 9 - 14 - 161 - - - 14 - 24 - 161 - - - 24 - 34 - 161 - - - 34 - 59 - 161 - - - 59 - 94 - 155 - - - 94 - 124 - 47 - - - - - - - endColumn - id - - - 12 - - - 1 - 2 - 438 - - - 2 - 3 - 195 - - - 3 - 4 - 134 - - - 4 - 6 - 161 - - - 6 - 8 - 182 - - - 8 - 13 - 195 - - - 13 - 20 - 188 - - - 20 - 36 - 188 - - - 36 - 51 - 175 - - - 51 - 68 - 175 - - - 68 - 93 - 182 - - - 95 - 183 - 87 - - - - - - - endColumn - startLine - - - 12 - - - 1 - 2 - 465 - - - 2 - 3 - 175 - - - 3 - 4 - 155 - - - 4 - 6 - 209 - - - 6 - 8 - 182 - - - 8 - 12 - 182 - - - 12 - 20 - 209 - - - 20 - 28 - 188 - - - 28 - 39 - 175 - - - 39 - 48 - 175 - - - 48 - 64 - 175 - - - 67 - 69 - 13 - - - - - - - endColumn - startColumn - - - 12 - - - 1 - 2 - 492 - - - 2 - 3 - 222 - - - 3 - 4 - 148 - - - 4 - 5 - 141 - - - 5 - 7 - 202 - - - 7 - 11 - 195 - - - 11 - 15 - 202 - - - 15 - 20 - 195 - - - 20 - 26 - 188 - - - 26 - 29 - 175 - - - 29 - 37 - 141 - - - - - - - endColumn - endLine - - - 12 - - - 1 - 2 - 465 - - - 2 - 3 - 175 - - - 3 - 4 - 155 - - - 4 - 6 - 209 - - - 6 - 8 - 182 - - - 8 - 12 - 182 - - - 12 - 20 - 209 - - - 20 - 28 - 188 - - - 28 - 39 - 175 - - - 39 - 48 - 175 - - - 48 - 64 - 175 - - - 67 - 69 - 13 - - - - - - - - - directive_nullables - 467925 - - - id - 467925 - - - setting - 20 - - - target - 6 - - - - - id - setting - - - 12 - - - 1 - 2 - 467925 - - - - - - - id - target - - - 12 - - - 1 - 2 - 467925 - - - - - - - setting - id - - - 12 - - - 9 - 10 - 6 - - - 34686 - 34687 - 13 - - - - - - - setting - target - - - 12 - - - 1 - 2 - 20 - - - - - - - target - id - - - 12 - - - 69381 - 69382 - 6 - - - - - - - target - setting - - - 12 - - - 3 - 4 - 6 - - - - - - - - - directive_warnings - 23 - - - id - 23 - - - message - 14 - - - - - id - message - - - 12 - - - 1 - 2 - 23 - - - - - - - message - id - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 9 - - - - - - - - - directive_errors - 45 - - - id - 45 - - - message - 15 - - - - - id - message - - - 12 - - - 1 - 2 - 45 - - - - - - - message - id - - - 12 - - - 1 - 2 - 7 - - - 2 - 3 - 2 - - - 5 - 6 - 2 - - - 8 - 9 - 2 - - - - - - - - - directive_undefines - 68 - - - id - 68 - - - name - 43 - - - - - id - name - - - 12 - - - 1 - 2 - 68 - - - - - - - name - id - - - 12 - - - 1 - 2 - 30 - - - 2 - 3 - 7 - - - 3 - 4 - 3 - - - 7 - 8 - 1 - - - - - - - - - directive_defines - 83 - - - id - 83 - - - name - 57 - - - - - id - name - - - 12 - - - 1 - 2 - 83 - - - - - - - name - id - - - 12 - - - 1 - 2 - 41 - - - 2 - 3 - 12 - - - 4 - 6 - 3 - - - - - - - - - pragma_checksums - 9570 - - - id - 9570 - - - file - 9570 - - - guid - 6 - - - bytes - 8949 - - - - - id - file - - - 12 - - - 1 - 2 - 9570 - - - - - - - id - guid - - - 12 - - - 1 - 2 - 9570 - - - - - - - id - bytes - - - 12 - - - 1 - 2 - 9570 - - - - - - - file - id - - - 12 - - - 1 - 2 - 9570 - - - - - - - file - guid - - - 12 - - - 1 - 2 - 9570 - - - - - - - file - bytes - - - 12 - - - 1 - 2 - 9570 - - - - - - - guid - id - - - 12 - - - 1419 - 1420 - 6 - - - - - - - guid - file - - - 12 - - - 1419 - 1420 - 6 - - - - - - - guid - bytes - - - 12 - - - 1327 - 1328 - 6 - - - - - - - bytes - id - - - 12 - - - 1 - 2 - 8754 - - - 2 - 21 - 195 - - - - - - - bytes - file - - - 12 - - - 1 - 2 - 8754 - - - 2 - 21 - 195 - - - - - - - bytes - guid - - - 12 - - - 1 - 2 - 8949 - - - - - - - - - pragma_warnings - 57623 - - - id - 57623 - - - kind - 13 - - - - - id - kind - - - 12 - - - 1 - 2 - 57623 - - - - - - - kind - id - - - 12 - - - 4272 - 4273 - 13 - - - - - - - - - pragma_warning_error_codes - 57636 - - - id - 57623 - - - errorCode - 148 - - - index - 13 - - - - - id - errorCode - - - 12 - - - 1 - 2 - 57609 - - - 2 - 3 - 13 - - - - - - - id - index - - - 12 - - - 1 - 2 - 57609 - - - 2 - 3 - 13 - - - - - - - errorCode - id - - - 12 - - - 2 - 3 - 47 - - - 4 - 5 - 33 - - - 6 - 7 - 6 - - - 10 - 11 - 13 - - - 14 - 37 - 13 - - - 84 - 85 - 6 - - - 1338 - 1339 - 13 - - - 2838 - 2839 - 13 - - - - - - - errorCode - index - - - 12 - - - 1 - 2 - 148 - - - - - - - index - id - - - 12 - - - 2 - 3 - 6 - - - 8544 - 8545 - 6 - - - - - - - index - errorCode - - - 12 - - - 1 - 2 - 6 - - - 21 - 22 - 6 - - - - - - - - - preprocessor_directive_location - 1075323 - - - id - 1075323 - - - loc - 1075323 - - - - - id - loc - - - 12 - - - 1 - 2 - 1075323 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 1075323 - - - - - - - - - preprocessor_directive_compilation - 1075323 - - - id - 1075323 - - - compilation - 660 - - - - - id - compilation - - - 12 - - - 1 - 2 - 1075323 - - - - - - - compilation - id - - - 12 - - - 2 - 4 - 47 - - - 4 - 11 - 53 - - - 12 - 72 - 53 - - - 79 - 187 - 53 - - - 199 - 335 - 60 - - - 365 - 465 - 53 - - - 476 - 714 - 53 - - - 761 - 1089 - 53 - - - 1256 - 1553 - 53 - - - 1559 - 2257 - 53 - - - 2312 - 3069 - 53 - - - 3691 - 12998 - 53 - - - 17866 - 27931 - 13 - - - - - - - - - preprocessor_directive_active - 1075323 - - - id - 1075323 - - - active - 13 - - - - - id - active - - - 12 - - - 1 - 2 - 1075323 - - - - - - - active - id - - - 12 - - - 7 - 8 - 6 - - - 159435 - 159436 - 6 - - - - - - - - - types - 9818978 - - - id - 9818978 - - - kind - 617 - - - name - 2815698 - - - - - id - kind - - - 12 - - - 1 - 2 - 9818978 - - - - - - - id - name - - - 12 - - - 1 - 2 - 9818978 - - - - - - - kind - id - - - 12 - - - 1 - 2 - 390 - - - 101 - 250 - 41 - - - 1197 - 2295 - 41 - - - 4645 - 7960 - 41 - - - 34817 - 39988 - 41 - - - 40551 - 135458 - 41 - - - 209946 - 209947 - 20 - - - - - - - kind - name - - - 12 - - - 1 - 2 - 411 - - - 101 - 242 - 41 - - - 1307 - 1615 - 41 - - - 1892 - 2930 - 41 - - - 6876 - 10426 - 41 - - - 13272 - 99339 - 41 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2509722 - - - 2 - 4 - 213901 - - - 4 - 26166 - 92074 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 2793662 - - - 2 - 7 - 22036 - - - - - - - - - typerefs - 4008699 - - - id - 4008699 - - - name - 2703480 - - - - - id - name - - - 12 - - - 1 - 2 - 4008699 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2495813 - - - 2 - 17 - 202811 - - - 17 - 14950 - 4855 - - - - - - - - - typeref_type - 3978165 - - - id - 3978165 - - - typeId - 3978165 - - - - - id - typeId - - - 12 - - - 1 - 2 - 3978165 - - - - - - - typeId - id - - - 12 - - - 1 - 2 - 3978165 - - - - - - - - - array_element_type - 95572 - - - array - 95572 - - - dimension - 61 - - - rank - 61 - - - element - 95263 - - - - - array - dimension - - - 12 - - - 1 - 2 - 95572 - - - - - - - array - rank - - - 12 - - - 1 - 2 - 95572 - - - - - - - array - element - - - 12 - - - 1 - 2 - 95572 - - - - - - - dimension - array - - - 12 - - - 2 - 3 - 20 - - - 66 - 67 - 20 - - - 4577 - 4578 - 20 - - - - - - - dimension - rank - - - 12 - - - 1 - 2 - 41 - - - 3 - 4 - 20 - - - - - - - dimension - element - - - 12 - - - 2 - 3 - 20 - - - 66 - 67 - 20 - - - 4562 - 4563 - 20 - - - - - - - rank - array - - - 12 - - - 4 - 5 - 20 - - - 19 - 20 - 20 - - - 4622 - 4623 - 20 - - - - - - - rank - dimension - - - 12 - - - 1 - 2 - 41 - - - 3 - 4 - 20 - - - - - - - rank - element - - - 12 - - - 4 - 5 - 20 - - - 19 - 20 - 20 - - - 4622 - 4623 - 20 - - - - - - - element - array - - - 12 - - - 1 - 2 - 94996 - - - 2 - 4 - 267 - - - - - - - element - dimension - - - 12 - - - 1 - 2 - 95263 - - - - - - - element - rank - - - 12 - - - 1 - 2 - 94996 - - - 2 - 4 - 267 - - - - - - - - - nullable_underlying_type - 24628 - - - nullable - 24628 - - - underlying - 24628 - - - - - nullable - underlying - - - 12 - - - 1 - 2 - 24628 - - - - - - - underlying - nullable - - - 12 - - - 1 - 2 - 24628 - - - - - - - - - pointer_referent_type - 11632 - - - pointer - 11632 - - - referent - 11632 - - - - - pointer - referent - - - 12 - - - 1 - 2 - 11632 - - - - - - - referent - pointer - - - 12 - - - 1 - 2 - 11632 - - - - - - - - - enum_underlying_type - 163759 - - - enum_id - 163759 - - - underlying_type_id - 164 - - - - - enum_id - underlying_type_id - - - 12 - - - 1 - 2 - 163759 - - - - - - - underlying_type_id - enum_id - - - 12 - - - 8 - 9 - 20 - - - 18 - 19 - 20 - - - 49 - 50 - 20 - - - 105 - 106 - 20 - - - 108 - 109 - 20 - - - 356 - 357 - 20 - - - 413 - 414 - 20 - - - 6902 - 6903 - 20 - - - - - - - - - delegate_return_type - 834351 - - - delegate_id - 834351 - - - return_type_id - 303795 - - - - - delegate_id - return_type_id - - - 12 - - - 1 - 2 - 834351 - - - - - - - return_type_id - delegate_id - - - 12 - - - 1 - 2 - 269763 - - - 2 - 4 - 24464 - - - 4 - 7800 - 9567 - - - - - - - - - function_pointer_return_type - 47919 - - - function_pointer_id - 47919 - - - return_type_id - 10013 - - - - - function_pointer_id - return_type_id - - - 12 - - - 1 - 2 - 47919 - - - - - - - return_type_id - function_pointer_id - - - 12 - - - 1 - 2 - 2933 - - - 2 - 3 - 3236 - - - 3 - 4 - 2326 - - - 4 - 7 - 809 - - - 7 - 569 - 708 - - - - - - - - - extend - 3329732 - - - sub - 3329136 - - - super - 487965 - - - - - sub - super - - - 12 - - - 1 - 2 - 3328539 - - - 2 - 3 - 596 - - - - - - - super - sub - - - 12 - - - 1 - 2 - 330584 - - - 2 - 3 - 75737 - - - 3 - 5 - 43784 - - - 5 - 97 - 36603 - - - 97 - 40552 - 1255 - - - - - - - - - anonymous_types - 6194 - - - id - 6194 - - - - - - implement - 11230469 - - - sub - 3882202 - - - super - 2387833 - - - - - sub - super - - - 12 - - - 1 - 2 - 1315836 - - - 2 - 3 - 1049097 - - - 3 - 4 - 724767 - - - 4 - 6 - 297643 - - - 6 - 9 - 320626 - - - 9 - 31 - 174232 - - - - - - - super - sub - - - 12 - - - 1 - 2 - 1138538 - - - 2 - 3 - 715570 - - - 3 - 5 - 204992 - - - 5 - 6 - 182009 - - - 6 - 109829 - 146722 - - - - - - - - - type_location - 5295009 - - - id - 5063104 - - - loc - 11460 - - - - - id - loc - - - 12 - - - 1 - 2 - 4974816 - - - 2 - 551 - 88288 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 2325 - - - 2 - 12 - 905 - - - 12 - 25 - 864 - - - 25 - 43 - 864 - - - 43 - 77 - 864 - - - 77 - 116 - 884 - - - 116 - 194 - 905 - - - 195 - 315 - 864 - - - 321 - 527 - 864 - - - 528 - 854 - 864 - - - 854 - 3409 - 864 - - - 3696 - 12084 - 390 - - - - - - - - - tuple_underlying_type - 47199 - - - tuple - 47199 - - - struct - 47199 - - - - - tuple - struct - - - 12 - - - 1 - 2 - 47199 - - - - - - - struct - tuple - - - 12 - - - 1 - 2 - 47199 - - - - - - - - - tuple_element - 115839 - - - tuple - 47179 - - - index - 432 - - - field - 115839 - - - - - tuple - index - - - 12 - - - 1 - 2 - 205 - - - 2 - 3 - 38866 - - - 3 - 4 - 4814 - - - 4 - 22 - 3292 - - - - - - - tuple - field - - - 12 - - - 1 - 2 - 205 - - - 2 - 3 - 38866 - - - 3 - 4 - 4814 - - - 4 - 22 - 3292 - - - - - - - index - tuple - - - 12 - - - 2 - 3 - 20 - - - 4 - 5 - 20 - - - 6 - 7 - 20 - - - 8 - 9 - 20 - - - 10 - 11 - 20 - - - 12 - 13 - 20 - - - 14 - 15 - 20 - - - 18 - 19 - 20 - - - 22 - 23 - 20 - - - 26 - 27 - 20 - - - 30 - 31 - 20 - - - 35 - 36 - 20 - - - 43 - 44 - 20 - - - 48 - 49 - 20 - - - 57 - 58 - 20 - - - 69 - 70 - 20 - - - 96 - 97 - 20 - - - 160 - 161 - 20 - - - 394 - 395 - 20 - - - 2283 - 2284 - 20 - - - 2293 - 2294 - 20 - - - - - - - index - field - - - 12 - - - 2 - 3 - 20 - - - 4 - 5 - 20 - - - 6 - 7 - 20 - - - 8 - 9 - 20 - - - 10 - 11 - 20 - - - 12 - 13 - 20 - - - 14 - 15 - 20 - - - 18 - 19 - 20 - - - 22 - 23 - 20 - - - 26 - 27 - 20 - - - 30 - 31 - 20 - - - 35 - 36 - 20 - - - 43 - 44 - 20 - - - 48 - 49 - 20 - - - 57 - 58 - 20 - - - 69 - 70 - 20 - - - 96 - 97 - 20 - - - 160 - 161 - 20 - - - 394 - 395 - 20 - - - 2283 - 2284 - 20 - - - 2293 - 2294 - 20 - - - - - - - field - tuple - - - 12 - - - 1 - 2 - 115839 - - - - - - - field - index - - - 12 - - - 1 - 2 - 115839 - - - - - - - - - attributes - 14223506 - - - id - 14223506 - - - kind - 61 - - - type_id - 14978 - - - target - 12264155 - - - - - id - kind - - - 12 - - - 1 - 2 - 14223506 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 14223506 - - - - - - - id - target - - - 12 - - - 1 - 2 - 14223506 - - - - - - - kind - id - - - 12 - - - 31 - 32 - 20 - - - 16434 - 16435 - 20 - - - 674823 - 674824 - 20 - - - - - - - kind - type_id - - - 12 - - - 9 - 10 - 20 - - - 11 - 12 - 20 - - - 726 - 727 - 20 - - - - - - - kind - target - - - 12 - - - 3 - 4 - 20 - - - 15476 - 15477 - 20 - - - 586278 - 586279 - 20 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 1543 - - - 2 - 3 - 1481 - - - 3 - 4 - 823 - - - 4 - 6 - 1172 - - - 6 - 9 - 1131 - - - 9 - 15 - 1316 - - - 15 - 24 - 1213 - - - 24 - 39 - 1152 - - - 39 - 70 - 1193 - - - 70 - 150 - 1131 - - - 150 - 430 - 1131 - - - 431 - 1781 - 1131 - - - 1807 - 207674 - 555 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 14608 - - - 2 - 3 - 370 - - - - - - - type_id - target - - - 12 - - - 1 - 2 - 1728 - - - 2 - 3 - 1481 - - - 3 - 4 - 843 - - - 4 - 6 - 1275 - - - 6 - 9 - 1172 - - - 9 - 15 - 1234 - - - 15 - 24 - 1152 - - - 24 - 40 - 1172 - - - 40 - 70 - 1172 - - - 72 - 153 - 1131 - - - 153 - 442 - 1152 - - - 442 - 2620 - 1131 - - - 2908 - 202968 - 329 - - - - - - - target - id - - - 12 - - - 1 - 2 - 11192302 - - - 2 - 4 - 963421 - - - 4 - 4012 - 108432 - - - - - - - target - kind - - - 12 - - - 1 - 2 - 12146937 - - - 2 - 3 - 117217 - - - - - - - target - type_id - - - 12 - - - 1 - 2 - 11400133 - - - 2 - 29 - 864021 - - - - - - - - - attribute_location - 14224247 - - - id - 14223506 - - - loc - 12098 - - - - - id - loc - - - 12 - - - 1 - 2 - 14222786 - - - 2 - 4 - 720 - - - - - - - loc - id - - - 12 - - - 1 - 10 - 802 - - - 10 - 11 - 1748 - - - 11 - 22 - 925 - - - 22 - 41 - 925 - - - 42 - 74 - 925 - - - 74 - 126 - 925 - - - 126 - 208 - 925 - - - 208 - 325 - 925 - - - 325 - 573 - 925 - - - 593 - 1056 - 925 - - - 1061 - 2081 - 925 - - - 2119 - 11182 - 925 - - - 11260 - 40492 - 288 - - - - - - - - - type_mention - 3322420 - - - id - 3322420 - - - type_id - 93831 - - - parent - 2594238 - - - - - id - type_id - - - 12 - - - 1 - 2 - 3322420 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 3322420 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 17301 - - - 2 - 3 - 18106 - - - 3 - 4 - 10207 - - - 4 - 5 - 7735 - - - 5 - 6 - 4991 - - - 6 - 7 - 6347 - - - 7 - 10 - 7628 - - - 10 - 16 - 7154 - - - 16 - 36 - 7080 - - - 36 - 1547 - 7038 - - - 1553 - 103831 - 240 - - - - - - - type_id - parent - - - 12 - - - 1 - 2 - 29400 - - - 2 - 3 - 15369 - - - 3 - 4 - 7878 - - - 4 - 5 - 6975 - - - 5 - 6 - 4977 - - - 6 - 8 - 7304 - - - 8 - 13 - 7530 - - - 13 - 30 - 7082 - - - 30 - 931 - 7038 - - - 949 - 78000 - 275 - - - - - - - parent - id - - - 12 - - - 1 - 2 - 2213261 - - - 2 - 3 - 271774 - - - 3 - 851 - 109202 - - - - - - - parent - type_id - - - 12 - - - 1 - 2 - 2538267 - - - 2 - 40 - 55971 - - - - - - - - - type_mention_location - 3322420 - - - id - 3322420 - - - loc - 2857079 - - - - - id - loc - - - 12 - - - 1 - 2 - 3322420 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 2673027 - - - 2 - 213 - 184052 - - - - - - - - - type_annotation - 924266 - - - id - 924266 - - - annotation - 61 - - - - - id - annotation - - - 12 - - - 1 - 2 - 924266 - - - - - - - annotation - id - - - 12 - - - 3236 - 3237 - 20 - - - 14983 - 14984 - 20 - - - 26702 - 26703 - 20 - - - - - - - - - nullability - 26089 - - - nullability - 26089 - - - kind - 61 - - - - - nullability - kind - - - 12 - - - 1 - 2 - 26089 - - - - - - - kind - nullability - - - 12 - - - 44 - 45 - 20 - - - 326 - 327 - 20 - - - 898 - 899 - 20 - - - - - - - - - nullability_parent - 83204 - - - nullability - 6183 - - - index - 1020 - - - parent - 24192 - - - - - nullability - index - - - 12 - - - 1 - 2 - 4622 - - - 2 - 3 - 960 - - - 3 - 9 - 480 - - - 17 - 18 - 120 - - - - - - - nullability - parent - - - 12 - - - 1 - 2 - 4022 - - - 2 - 3 - 780 - - - 3 - 5 - 540 - - - 5 - 14 - 480 - - - 19 - 219 - 360 - - - - - - - index - nullability - - - 12 - - - 2 - 3 - 540 - - - 3 - 4 - 240 - - - 5 - 6 - 60 - - - 10 - 11 - 60 - - - 59 - 60 - 60 - - - 70 - 71 - 60 - - - - - - - index - parent - - - 12 - - - 3 - 4 - 60 - - - 6 - 7 - 60 - - - 9 - 10 - 60 - - - 12 - 13 - 60 - - - 15 - 16 - 60 - - - 18 - 19 - 60 - - - 21 - 22 - 60 - - - 24 - 25 - 60 - - - 27 - 28 - 60 - - - 32 - 33 - 60 - - - 44 - 45 - 60 - - - 60 - 61 - 60 - - - 81 - 82 - 60 - - - 119 - 120 - 60 - - - 184 - 185 - 60 - - - 328 - 329 - 60 - - - 403 - 404 - 60 - - - - - - - parent - nullability - - - 12 - - - 1 - 2 - 7143 - - - 2 - 3 - 15488 - - - 3 - 5 - 1560 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 4502 - - - 2 - 3 - 8644 - - - 3 - 4 - 3902 - - - 4 - 5 - 2281 - - - 5 - 7 - 2221 - - - 7 - 14 - 1921 - - - 14 - 18 - 720 - - - - - - - - - type_nullability - 40401386 - - - id - 40393691 - - - nullability - 25739 - - - - - id - nullability - - - 12 - - - 1 - 2 - 40386490 - - - 2 - 5 - 7201 - - - - - - - nullability - id - - - 12 - - - 1 - 2 - 9114 - - - 2 - 3 - 3127 - - - 3 - 4 - 2551 - - - 4 - 5 - 1604 - - - 5 - 6 - 1399 - - - 6 - 9 - 1913 - - - 9 - 14 - 1934 - - - 14 - 41 - 1934 - - - 43 - 1603 - 1934 - - - 2271 - 1725181 - 226 - - - - - - - - - expr_flowstate - 6545248 - - - id - 6545248 - - - state - 4 - - - - - id - state - - - 12 - - - 1 - 2 - 6545248 - - - - - - - state - id - - - 12 - - - 238130 - 238131 - 2 - - - 2566670 - 2566671 - 2 - - - - - - - - - type_parameters - 897781 - - - id - 897781 - - - index - 1800 - - - generic_id - 486441 - - - variance - 180 - - - - - id - index - - - 12 - - - 1 - 2 - 897781 - - - - - - - id - generic_id - - - 12 - - - 1 - 2 - 897781 - - - - - - - id - variance - - - 12 - - - 1 - 2 - 897781 - - - - - - - index - id - - - 12 - - - 1 - 3 - 120 - - - 3 - 5 - 120 - - - 5 - 7 - 120 - - - 7 - 9 - 120 - - - 9 - 14 - 120 - - - 17 - 22 - 120 - - - 27 - 45 - 120 - - - 69 - 98 - 120 - - - 126 - 156 - 120 - - - 184 - 214 - 120 - - - 243 - 276 - 120 - - - 320 - 377 - 120 - - - 429 - 501 - 120 - - - 621 - 913 - 120 - - - 2165 - 8104 - 120 - - - - - - - index - generic_id - - - 12 - - - 1 - 3 - 120 - - - 3 - 5 - 120 - - - 5 - 7 - 120 - - - 7 - 9 - 120 - - - 9 - 14 - 120 - - - 17 - 22 - 120 - - - 27 - 45 - 120 - - - 69 - 98 - 120 - - - 126 - 156 - 120 - - - 184 - 214 - 120 - - - 243 - 276 - 120 - - - 320 - 377 - 120 - - - 429 - 501 - 120 - - - 621 - 913 - 120 - - - 2165 - 8104 - 120 - - - - - - - index - variance - - - 12 - - - 1 - 2 - 780 - - - 2 - 3 - 60 - - - 3 - 4 - 960 - - - - - - - generic_id - id - - - 12 - - - 1 - 2 - 356471 - - - 2 - 3 - 75220 - - - 3 - 9 - 38240 - - - 9 - 31 - 16508 - - - - - - - generic_id - index - - - 12 - - - 1 - 2 - 356471 - - - 2 - 3 - 75220 - - - 3 - 9 - 38240 - - - 9 - 31 - 16508 - - - - - - - generic_id - variance - - - 12 - - - 1 - 2 - 485240 - - - 2 - 3 - 1200 - - - - - - - variance - id - - - 12 - - - 52 - 53 - 60 - - - 289 - 290 - 60 - - - 14614 - 14615 - 60 - - - - - - - variance - index - - - 12 - - - 16 - 17 - 60 - - - 17 - 18 - 60 - - - 30 - 31 - 60 - - - - - - - variance - generic_id - - - 12 - - - 49 - 50 - 60 - - - 50 - 51 - 60 - - - 8024 - 8025 - 60 - - - - - - - - - type_arguments - 6159319 - - - id - 1600702 - - - index - 432 - - - constructed_id - 4581373 - - - - - id - index - - - 12 - - - 1 - 2 - 1361410 - - - 2 - 3 - 218983 - - - 3 - 13 - 20307 - - - - - - - id - constructed_id - - - 12 - - - 1 - 2 - 707031 - - - 2 - 3 - 283075 - - - 3 - 4 - 199375 - - - 4 - 5 - 99481 - - - 5 - 7 - 121826 - - - 7 - 11 - 126476 - - - 11 - 10327 - 63433 - - - - - - - index - id - - - 12 - - - 2 - 3 - 164 - - - 4 - 5 - 20 - - - 9 - 10 - 20 - - - 14 - 15 - 20 - - - 25 - 26 - 20 - - - 44 - 45 - 20 - - - 159 - 160 - 20 - - - 160 - 161 - 20 - - - 205 - 206 - 20 - - - 327 - 328 - 20 - - - 797 - 798 - 20 - - - 3259 - 3260 - 20 - - - 21100 - 21101 - 20 - - - 64692 - 64693 - 20 - - - - - - - index - constructed_id - - - 12 - - - 2 - 3 - 164 - - - 4 - 5 - 20 - - - 9 - 10 - 20 - - - 16 - 17 - 20 - - - 29 - 30 - 20 - - - 65 - 66 - 20 - - - 187 - 188 - 20 - - - 236 - 237 - 20 - - - 311 - 312 - 20 - - - 578 - 579 - 20 - - - 1749 - 1750 - 20 - - - 7001 - 7002 - 20 - - - 66490 - 66491 - 20 - - - 222663 - 222664 - 20 - - - - - - - constructed_id - id - - - 12 - - - 1 - 2 - 3249262 - - - 2 - 3 - 1220181 - - - 3 - 22 - 111930 - - - - - - - constructed_id - index - - - 12 - - - 1 - 2 - 3213317 - - - 2 - 3 - 1224008 - - - 3 - 22 - 144048 - - - - - - - - - constructed_generic - 4581373 - - - constructed - 4581373 - - - generic - 89832 - - - - - constructed - generic - - - 12 - - - 1 - 2 - 4581373 - - - - - - - generic - constructed - - - 12 - - - 1 - 2 - 26130 - - - 2 - 3 - 18723 - - - 3 - 4 - 8888 - - - 4 - 5 - 5596 - - - 5 - 7 - 6563 - - - 7 - 11 - 7036 - - - 11 - 23 - 7160 - - - 23 - 118 - 6769 - - - 126 - 23756 - 2962 - - - - - - - - - type_parameter_constraints - 897781 - - - id - 897781 - - - param_id - 897781 - - - - - id - param_id - - - 12 - - - 1 - 2 - 897781 - - - - - - - param_id - id - - - 12 - - - 1 - 2 - 897781 - - - - - - - - - type_parameter_constraints_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - - - - loc - id - - - 12 - - - - - - - - general_type_parameter_constraints - 345670 - - - id - 344368 - - - kind - 17 - - - - - id - kind - - - 12 - - - 1 - 2 - 343067 - - - 2 - 3 - 1301 - - - - - - - kind - id - - - 12 - - - 71 - 72 - 3 - - - 77 - 78 - 3 - - - 684 - 685 - 3 - - - 1350 - 1351 - 3 - - - 93972 - 93973 - 3 - - - - - - - - - specific_type_parameter_constraints - 250875 - - - id - 244702 - - - base_id - 45348 - - - - - id - base_id - - - 12 - - - 1 - 2 - 240114 - - - 2 - 9 - 4588 - - - - - - - base_id - id - - - 12 - - - 1 - 2 - 30533 - - - 2 - 3 - 4012 - - - 3 - 5 - 3806 - - - 5 - 10 - 3806 - - - 10 - 2494 - 3189 - - - - - - - - - specific_type_parameter_nullability - 44237 - - - id - 43990 - - - base_id - 9135 - - - nullability - 205 - - - - - id - base_id - - - 12 - - - 1 - 2 - 43743 - - - 2 - 3 - 246 - - - - - - - id - nullability - - - 12 - - - 1 - 2 - 43990 - - - - - - - base_id - id - - - 12 - - - 1 - 2 - 6234 - - - 2 - 3 - 1172 - - - 3 - 6 - 781 - - - 6 - 24 - 720 - - - 24 - 858 - 226 - - - - - - - base_id - nullability - - - 12 - - - 1 - 2 - 9073 - - - 2 - 3 - 61 - - - - - - - nullability - id - - - 12 - - - 1 - 2 - 61 - - - 3 - 4 - 20 - - - 4 - 5 - 20 - - - 6 - 7 - 20 - - - 16 - 17 - 20 - - - 35 - 36 - 20 - - - 68 - 69 - 20 - - - 2003 - 2004 - 20 - - - - - - - nullability - base_id - - - 12 - - - 1 - 2 - 61 - - - 3 - 4 - 41 - - - 4 - 5 - 20 - - - 8 - 9 - 20 - - - 35 - 36 - 20 - - - 68 - 69 - 20 - - - 323 - 324 - 20 - - - - - - - - - function_pointer_calling_conventions - 47919 - - - id - 47919 - - - kind - 50 - - - - - id - kind - - - 12 - - - 1 - 2 - 47919 - - - - - - - kind - id - - - 12 - - - 3 - 4 - 25 - - - 1892 - 1893 - 25 - - - - - - - - - has_unmanaged_calling_conventions - 0 - - - id - 0 - - - index - 0 - - - conv_id - 0 - - - - - id - index - - - 12 - - - - - - id - conv_id - - - 12 - - - - - - index - id - - - 12 - - - - - - index - conv_id - - - 12 - - - - - - conv_id - id - - - 12 - - - - - - conv_id - index - - - 12 - - - - - - - - modifiers - 1020 - - - id - 1020 - - - name - 1020 - - - - - id - name - - - 12 - - - 1 - 2 - 1020 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1020 - - - - - - - - - has_modifiers - 87000980 - - - id - 57381746 - - - mod_id - 329 - - - - - id - mod_id - - - 12 - - - 1 - 2 - 29262107 - - - 2 - 3 - 26625311 - - - 3 - 5 - 1494327 - - - - - - - mod_id - id - - - 12 - - - 108 - 109 - 20 - - - 229 - 230 - 20 - - - 301 - 302 - 20 - - - 579 - 580 - 20 - - - 2937 - 2938 - 20 - - - 122171 - 122172 - 20 - - - 141164 - 141165 - 20 - - - 146000 - 146001 - 20 - - - 172050 - 172051 - 20 - - - 173508 - 173509 - 20 - - - 187757 - 187758 - 20 - - - 237126 - 237127 - 20 - - - 285248 - 285249 - 20 - - - 391584 - 391585 - 20 - - - 581112 - 581113 - 20 - - - 1786530 - 1786531 - 20 - - - - - - - - - compiler_generated - 479159 - - - id - 479159 - - - - - - exprorstmt_name - 10335 - - - parent_id - 10335 - - - name - 1213 - - - - - parent_id - name - - - 12 - - - 1 - 2 - 10335 - - - - - - - name - parent_id - - - 12 - - - 1 - 2 - 107 - - - 2 - 3 - 280 - - - 3 - 4 - 133 - - - 4 - 5 - 133 - - - 5 - 6 - 86 - - - 6 - 8 - 107 - - - 8 - 9 - 91 - - - 9 - 12 - 60 - - - 12 - 17 - 98 - - - 17 - 43 - 91 - - - 45 - 239 - 25 - - - - - - - - - nested_types - 1913920 - - - id - 1913920 - - - declaring_type_id - 774477 - - - unbound_id - 1613746 - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 1913920 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 1913920 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 455147 - - - 2 - 3 - 135879 - - - 3 - 4 - 62322 - - - 4 - 6 - 58084 - - - 6 - 22 - 58166 - - - 22 - 391 - 4876 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 456670 - - - 2 - 3 - 136250 - - - 3 - 4 - 61952 - - - 4 - 6 - 58043 - - - 6 - 24 - 58290 - - - 24 - 391 - 3271 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 1556444 - - - 2 - 691 - 57302 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 1565888 - - - 2 - 691 - 47858 - - - - - - - - - properties - 5910563 - - - id - 5910563 - - - name - 1743021 - - - declaring_type_id - 1511302 - - - type_id - 597529 - - - unbound_id - 5336551 - - - - - id - name - - - 12 - - - 1 - 2 - 5910563 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 5910563 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 5910563 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 5910563 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1266311 - - - 2 - 3 - 219642 - - - 3 - 6 - 146640 - - - 6 - 9450 - 110428 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 1267298 - - - 2 - 3 - 219168 - - - 3 - 6 - 146908 - - - 6 - 5564 - 109646 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 1585126 - - - 2 - 6 - 137854 - - - 6 - 1544 - 20040 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 1273245 - - - 2 - 3 - 224374 - - - 3 - 6 - 144624 - - - 6 - 8011 - 100778 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 549794 - - - 2 - 3 - 348711 - - - 3 - 4 - 196247 - - - 4 - 5 - 130468 - - - 5 - 7 - 125365 - - - 7 - 14 - 113966 - - - 14 - 3362 - 46747 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 630059 - - - 2 - 3 - 270298 - - - 3 - 4 - 196659 - - - 4 - 5 - 132628 - - - 5 - 7 - 125201 - - - 7 - 15 - 117361 - - - 15 - 3362 - 39093 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 636499 - - - 2 - 3 - 426033 - - - 3 - 4 - 180898 - - - 4 - 5 - 100284 - - - 5 - 9 - 124254 - - - 9 - 56 - 43331 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 549794 - - - 2 - 3 - 348711 - - - 3 - 4 - 196247 - - - 4 - 5 - 130468 - - - 5 - 7 - 125365 - - - 7 - 14 - 113966 - - - 14 - 3362 - 46747 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 329617 - - - 2 - 3 - 122711 - - - 3 - 4 - 38805 - - - 4 - 7 - 51541 - - - 7 - 36 - 44957 - - - 36 - 74677 - 9896 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 477430 - - - 2 - 3 - 66540 - - - 3 - 11 - 44977 - - - 11 - 39359 - 8579 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 345666 - - - 2 - 3 - 117896 - - - 3 - 4 - 37796 - - - 4 - 7 - 46891 - - - 7 - 66 - 44833 - - - 66 - 22259 - 4444 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 331345 - - - 2 - 3 - 125077 - - - 3 - 4 - 38805 - - - 4 - 7 - 50491 - - - 7 - 45 - 44977 - - - 45 - 72507 - 6831 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 5254497 - - - 2 - 1890 - 82054 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 5336551 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 5254497 - - - 2 - 1890 - 82054 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 5319391 - - - 2 - 1414 - 17159 - - - - - - - - - property_location - 6046401 - - - id - 5910563 - - - loc - 8579 - - - - - id - loc - - - 12 - - - 1 - 2 - 5818282 - - - 2 - 34 - 92280 - - - - - - - loc - id - - - 12 - - - 1 - 8 - 740 - - - 8 - 15 - 699 - - - 15 - 25 - 658 - - - 25 - 41 - 678 - - - 41 - 58 - 658 - - - 59 - 95 - 658 - - - 98 - 159 - 658 - - - 163 - 249 - 658 - - - 259 - 344 - 658 - - - 346 - 473 - 658 - - - 475 - 933 - 658 - - - 934 - 2733 - 658 - - - 2736 - 13303 - 534 - - - - - - - - - indexers - 103350 - - - id - 103350 - - - name - 205 - - - declaring_type_id - 92630 - - - type_id - 21809 - - - unbound_id - 31315 - - - - - id - name - - - 12 - - - 1 - 2 - 103350 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 103350 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 103350 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 103350 - - - - - - - name - id - - - 12 - - - 1 - 2 - 61 - - - 2 - 3 - 41 - - - 3 - 4 - 20 - - - 10 - 11 - 20 - - - 14 - 15 - 20 - - - 16 - 17 - 20 - - - 4973 - 4974 - 20 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 82 - - - 2 - 3 - 20 - - - 3 - 4 - 20 - - - 6 - 7 - 20 - - - 14 - 15 - 20 - - - 16 - 17 - 20 - - - 4460 - 4461 - 20 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 164 - - - 6 - 7 - 20 - - - 1049 - 1050 - 20 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 82 - - - 2 - 3 - 41 - - - 7 - 8 - 20 - - - 10 - 11 - 20 - - - 16 - 17 - 20 - - - 1481 - 1482 - 20 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 83577 - - - 2 - 3 - 7612 - - - 3 - 7 - 1440 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 92568 - - - 2 - 3 - 61 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 87651 - - - 2 - 4 - 4979 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 83577 - - - 2 - 3 - 7612 - - - 3 - 7 - 1440 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 10061 - - - 2 - 3 - 6296 - - - 3 - 4 - 3436 - - - 4 - 8 - 1666 - - - 8 - 2702 - 349 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 21748 - - - 2 - 3 - 61 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 12715 - - - 2 - 3 - 4156 - - - 3 - 4 - 3189 - - - 4 - 17 - 1646 - - - 23 - 2667 - 102 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 10081 - - - 2 - 3 - 6337 - - - 3 - 4 - 3477 - - - 4 - 9 - 1646 - - - 9 - 248 - 267 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 29278 - - - 2 - 1890 - 2036 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 31315 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 29278 - - - 2 - 1890 - 2036 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 29896 - - - 2 - 203 - 1419 - - - - - - - - - indexer_location - 104749 - - - id - 103350 - - - loc - 2530 - - - - - id - loc - - - 12 - - - 1 - 2 - 101950 - - - 2 - 3 - 1399 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 884 - - - 2 - 3 - 349 - - - 3 - 5 - 205 - - - 5 - 8 - 185 - - - 8 - 16 - 226 - - - 16 - 23 - 205 - - - 23 - 47 - 205 - - - 50 - 124 - 205 - - - 127 - 3210 - 61 - - - - - - - - - accessors - 6902049 - - - id - 6902049 - - - kind - 41 - - - name - 2155599 - - - declaring_member_id - 6013131 - - - unbound_id - 6177364 - - - - - id - kind - - - 12 - - - 1 - 2 - 6902049 - - - - - - - id - name - - - 12 - - - 1 - 2 - 6902049 - - - - - - - id - declaring_member_id - - - 12 - - - 1 - 2 - 6902049 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 6902049 - - - - - - - kind - id - - - 12 - - - 43506 - 43507 - 20 - - - 291946 - 291947 - 20 - - - - - - - kind - name - - - 12 - - - 17152 - 17153 - 20 - - - 87622 - 87623 - 20 - - - - - - - kind - declaring_member_id - - - 12 - - - 43506 - 43507 - 20 - - - 291946 - 291947 - 20 - - - - - - - kind - unbound_id - - - 12 - - - 39666 - 39667 - 20 - - - 260565 - 260566 - 20 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1548070 - - - 2 - 3 - 284454 - - - 3 - 6 - 187256 - - - 6 - 3848 - 135818 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 2155434 - - - 2 - 3 - 164 - - - - - - - name - declaring_member_id - - - 12 - - - 1 - 2 - 1548070 - - - 2 - 3 - 284454 - - - 3 - 6 - 187256 - - - 6 - 3848 - 135818 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 1560539 - - - 2 - 3 - 291388 - - - 3 - 6 - 181083 - - - 6 - 3822 - 122588 - - - - - - - declaring_member_id - id - - - 12 - - - 1 - 2 - 5124213 - - - 2 - 3 - 888917 - - - - - - - declaring_member_id - kind - - - 12 - - - 1 - 2 - 5124213 - - - 2 - 3 - 888917 - - - - - - - declaring_member_id - name - - - 12 - - - 1 - 2 - 5125139 - - - 2 - 3 - 887991 - - - - - - - declaring_member_id - unbound_id - - - 12 - - - 1 - 2 - 5124213 - - - 2 - 3 - 888917 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 6082223 - - - 2 - 1890 - 95140 - - - - - - - unbound_id - kind - - - 12 - - - 1 - 2 - 6177364 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 6177364 - - - - - - - unbound_id - declaring_member_id - - - 12 - - - 1 - 2 - 6082223 - - - 2 - 1890 - 95140 - - - - - - - - - init_only_accessors - 34504 - - - id - 34504 - - - - - - accessor_location - 7067248 - - - id - 6902049 - - - loc - 8579 - - - - - id - loc - - - 12 - - - 1 - 2 - 6784666 - - - 2 - 34 - 117382 - - - - - - - loc - id - - - 12 - - - 1 - 8 - 617 - - - 8 - 16 - 678 - - - 16 - 27 - 678 - - - 27 - 45 - 678 - - - 45 - 65 - 699 - - - 65 - 108 - 658 - - - 113 - 171 - 658 - - - 173 - 307 - 658 - - - 307 - 405 - 658 - - - 405 - 523 - 658 - - - 527 - 1068 - 658 - - - 1088 - 2613 - 658 - - - 2633 - 15945 - 617 - - - - - - - - - events - 60800 - - - id - 60800 - - - name - 25595 - - - declaring_type_id - 25225 - - - type_id - 15678 - - - unbound_id - 54030 - - - - - id - name - - - 12 - - - 1 - 2 - 60800 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 60800 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 60800 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 60800 - - - - - - - name - id - - - 12 - - - 1 - 2 - 14958 - - - 2 - 3 - 5226 - - - 3 - 4 - 2633 - - - 4 - 8 - 2098 - - - 8 - 240 - 678 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 14958 - - - 2 - 3 - 5226 - - - 3 - 4 - 2633 - - - 4 - 8 - 2098 - - - 8 - 228 - 678 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 22838 - - - 2 - 4 - 2098 - - - 4 - 10 - 658 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 15287 - - - 2 - 3 - 5473 - - - 3 - 4 - 2407 - - - 4 - 9 - 1995 - - - 9 - 165 - 432 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 13044 - - - 2 - 3 - 5164 - - - 3 - 4 - 2942 - - - 4 - 6 - 2283 - - - 6 - 75 - 1790 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 13106 - - - 2 - 3 - 5390 - - - 3 - 4 - 2674 - - - 4 - 6 - 2263 - - - 6 - 75 - 1790 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 15863 - - - 2 - 3 - 5246 - - - 3 - 4 - 2119 - - - 4 - 13 - 1892 - - - 14 - 52 - 102 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 13044 - - - 2 - 3 - 5164 - - - 3 - 4 - 2942 - - - 4 - 6 - 2283 - - - 6 - 75 - 1790 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 7798 - - - 2 - 3 - 3189 - - - 3 - 4 - 2530 - - - 4 - 7 - 1357 - - - 7 - 678 - 802 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 12427 - - - 2 - 3 - 1892 - - - 3 - 12 - 1213 - - - 12 - 276 - 144 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 9320 - - - 2 - 3 - 2695 - - - 3 - 4 - 2530 - - - 4 - 373 - 1131 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 7839 - - - 2 - 3 - 3312 - - - 3 - 4 - 2407 - - - 4 - 7 - 1440 - - - 7 - 605 - 678 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 52220 - - - 2 - 25 - 1810 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 54030 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 52220 - - - 2 - 25 - 1810 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 53701 - - - 2 - 6 - 329 - - - - - - - - - event_location - 73180 - - - id - 58236 - - - loc - 6675 - - - - - id - loc - - - 12 - - - 1 - 2 - 48677 - - - 2 - 3 - 4172 - - - 3 - 4 - 5386 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 5588 - - - 2 - 7 - 505 - - - 7 - 198 - 505 - - - 292 - 1024 - 75 - - - - - - - - - event_accessors - 121600 - - - id - 121600 - - - kind - 41 - - - name - 52137 - - - declaring_event_id - 60800 - - - unbound_id - 108061 - - - - - id - kind - - - 12 - - - 1 - 2 - 121600 - - - - - - - id - name - - - 12 - - - 1 - 2 - 121600 - - - - - - - id - declaring_event_id - - - 12 - - - 1 - 2 - 121600 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 121600 - - - - - - - kind - id - - - 12 - - - 2955 - 2956 - 41 - - - - - - - kind - name - - - 12 - - - 1267 - 1268 - 41 - - - - - - - kind - declaring_event_id - - - 12 - - - 2955 - 2956 - 41 - - - - - - - kind - unbound_id - - - 12 - - - 2626 - 2627 - 41 - - - - - - - name - id - - - 12 - - - 1 - 2 - 30492 - - - 2 - 3 - 10452 - - - 3 - 4 - 5308 - - - 4 - 8 - 4403 - - - 8 - 208 - 1481 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 52137 - - - - - - - name - declaring_event_id - - - 12 - - - 1 - 2 - 30492 - - - 2 - 3 - 10452 - - - 3 - 4 - 5308 - - - 4 - 8 - 4403 - - - 8 - 208 - 1481 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 31233 - - - 2 - 3 - 11069 - - - 3 - 4 - 5020 - - - 4 - 10 - 4073 - - - 10 - 146 - 740 - - - - - - - declaring_event_id - id - - - 12 - - - 2 - 3 - 60800 - - - - - - - declaring_event_id - kind - - - 12 - - - 2 - 3 - 60800 - - - - - - - declaring_event_id - name - - - 12 - - - 2 - 3 - 60800 - - - - - - - declaring_event_id - unbound_id - - - 12 - - - 2 - 3 - 60800 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 104440 - - - 2 - 25 - 3621 - - - - - - - unbound_id - kind - - - 12 - - - 1 - 2 - 108061 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 108061 - - - - - - - unbound_id - declaring_event_id - - - 12 - - - 1 - 2 - 104440 - - - 2 - 25 - 3621 - - - - - - - - - event_accessor_location - 146361 - - - id - 116472 - - - loc - 6675 - - - - - id - loc - - - 12 - - - 1 - 2 - 97355 - - - 2 - 3 - 8344 - - - 3 - 4 - 10772 - - - - - - - loc - id - - - 12 - - - 2 - 3 - 5588 - - - 4 - 13 - 505 - - - 14 - 395 - 505 - - - 584 - 2047 - 75 - - - - - - - - - operators - 146898 - - - id - 146898 - - - name - 1560 - - - symbol - 1440 - - - declaring_type_id - 31456 - - - type_id - 22452 - - - unbound_id - 119043 - - - - - id - name - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - symbol - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 146898 - - - - - - - name - id - - - 12 - - - 1 - 2 - 240 - - - 3 - 4 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 20 - 120 - - - 26 - 34 - 120 - - - 36 - 38 - 120 - - - 38 - 39 - 120 - - - 39 - 40 - 120 - - - 41 - 43 - 120 - - - 58 - 323 - 120 - - - 324 - 486 - 120 - - - 834 - 835 - 60 - - - - - - - name - symbol - - - 12 - - - 1 - 2 - 1560 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 240 - - - 3 - 4 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 9 - 60 - - - 19 - 20 - 120 - - - 22 - 33 - 120 - - - 33 - 34 - 120 - - - 34 - 35 - 180 - - - 39 - 40 - 120 - - - 51 - 97 - 120 - - - 304 - 305 - 60 - - - 308 - 309 - 120 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 3 - 360 - - - 3 - 4 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 20 - 120 - - - 20 - 23 - 120 - - - 33 - 35 - 120 - - - 39 - 40 - 120 - - - 44 - 140 - 120 - - - 262 - 263 - 60 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 4 - 120 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 9 - 180 - - - 19 - 27 - 120 - - - 36 - 38 - 120 - - - 38 - 39 - 120 - - - 41 - 43 - 120 - - - 58 - 321 - 120 - - - 322 - 470 - 120 - - - 483 - 484 - 60 - - - - - - - symbol - id - - - 12 - - - 1 - 2 - 240 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 27 - 120 - - - 33 - 37 - 120 - - - 37 - 38 - 60 - - - 38 - 39 - 120 - - - 39 - 40 - 120 - - - 41 - 42 - 60 - - - 61 - 62 - 120 - - - 322 - 325 - 120 - - - 485 - 835 - 120 - - - - - - - symbol - name - - - 12 - - - 1 - 2 - 1320 - - - 2 - 3 - 120 - - - - - - - symbol - declaring_type_id - - - 12 - - - 1 - 2 - 240 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 20 - 120 - - - 22 - 33 - 120 - - - 33 - 34 - 120 - - - 34 - 35 - 180 - - - 39 - 40 - 120 - - - 51 - 97 - 120 - - - 304 - 305 - 60 - - - 308 - 309 - 120 - - - - - - - symbol - type_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 3 - 360 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 21 - 120 - - - 22 - 34 - 120 - - - 34 - 35 - 60 - - - 39 - 40 - 120 - - - 44 - 140 - 120 - - - 262 - 263 - 60 - - - - - - - symbol - unbound_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 3 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 9 - 180 - - - 26 - 37 - 120 - - - 37 - 38 - 60 - - - 38 - 39 - 120 - - - 41 - 42 - 60 - - - 61 - 62 - 120 - - - 320 - 323 - 120 - - - 469 - 484 - 120 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 1740 - - - 2 - 3 - 17589 - - - 3 - 4 - 2581 - - - 4 - 6 - 1680 - - - 6 - 7 - 4742 - - - 7 - 27 - 2401 - - - 27 - 73 - 720 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 8824 - - - 2 - 3 - 13507 - - - 3 - 4 - 1680 - - - 4 - 5 - 4442 - - - 5 - 14 - 2581 - - - 15 - 24 - 420 - - - - - - - declaring_type_id - symbol - - - 12 - - - 1 - 2 - 8824 - - - 2 - 3 - 13507 - - - 3 - 4 - 1680 - - - 4 - 5 - 4442 - - - 5 - 13 - 2581 - - - 15 - 22 - 420 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 22452 - - - 2 - 3 - 3962 - - - 3 - 4 - 1860 - - - 4 - 6 - 2401 - - - 8 - 39 - 780 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 1740 - - - 2 - 3 - 17589 - - - 3 - 4 - 2581 - - - 4 - 6 - 1680 - - - 6 - 7 - 4742 - - - 7 - 27 - 2401 - - - 27 - 73 - 720 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 6303 - - - 2 - 3 - 6903 - - - 3 - 4 - 1800 - - - 4 - 6 - 1380 - - - 6 - 7 - 2761 - - - 7 - 14 - 1740 - - - 14 - 731 - 1560 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 16989 - - - 2 - 4 - 1800 - - - 4 - 5 - 2221 - - - 5 - 18 - 1440 - - - - - - - type_id - symbol - - - 12 - - - 1 - 2 - 16989 - - - 2 - 4 - 1921 - - - 4 - 5 - 2221 - - - 5 - 16 - 1320 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 19090 - - - 2 - 7 - 1740 - - - 7 - 306 - 1620 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 6303 - - - 2 - 3 - 6903 - - - 3 - 4 - 1800 - - - 4 - 6 - 1380 - - - 6 - 7 - 2761 - - - 7 - 14 - 1740 - - - 14 - 727 - 1560 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 116102 - - - 2 - 33 - 2941 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 119043 - - - - - - - unbound_id - symbol - - - 12 - - - 1 - 2 - 119043 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 116102 - - - 2 - 33 - 2941 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 116282 - - - 2 - 33 - 2761 - - - - - - - - - operator_location - 238350 - - - id - 94949 - - - loc - 10928 - - - - - id - loc - - - 12 - - - 1 - 2 - 7222 - - - 2 - 3 - 76786 - - - 3 - 10 - 8699 - - - 10 - 23 - 2240 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 9159 - - - 2 - 5 - 870 - - - 5 - 321 - 821 - - - 352 - 34717 - 77 - - - - - - - - - constant_value - 3005300 - - - id - 3004004 - - - value - 955314 - - - - - id - value - - - 12 - - - 1 - 2 - 3003119 - - - 2 - 9 - 884 - - - - - - - value - id - - - 12 - - - 1 - 2 - 763572 - - - 2 - 3 - 102053 - - - 3 - 9 - 73063 - - - 9 - 9057 - 16624 - - - - - - - - - methods - 17406043 - - - id - 17406043 - - - name - 4654272 - - - declaring_type_id - 3635194 - - - type_id - 1167672 - - - unbound_id - 14310911 - - - - - id - name - - - 12 - - - 1 - 2 - 17406043 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 17406043 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 17406043 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 17406043 - - - - - - - name - id - - - 12 - - - 1 - 2 - 3332551 - - - 2 - 3 - 557181 - - - 3 - 5 - 372866 - - - 5 - 30 - 349554 - - - 30 - 24636 - 42117 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 3459439 - - - 2 - 3 - 498232 - - - 3 - 6 - 416445 - - - 6 - 15129 - 280154 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 4249739 - - - 2 - 7 - 349410 - - - 7 - 3080 - 55121 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 3392631 - - - 2 - 3 - 574052 - - - 3 - 5 - 366776 - - - 5 - 14243 - 320811 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 1267628 - - - 2 - 3 - 822006 - - - 3 - 4 - 350089 - - - 4 - 5 - 236925 - - - 5 - 6 - 207214 - - - 6 - 9 - 321099 - - - 9 - 17 - 281059 - - - 17 - 1325 - 149171 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 1315671 - - - 2 - 3 - 850771 - - - 3 - 4 - 360665 - - - 4 - 5 - 283219 - - - 5 - 6 - 241184 - - - 6 - 10 - 303857 - - - 10 - 89 - 272685 - - - 89 - 1325 - 7139 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 1738083 - - - 2 - 3 - 858651 - - - 3 - 4 - 372887 - - - 4 - 5 - 307560 - - - 5 - 10 - 283672 - - - 10 - 272 - 74338 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 1267628 - - - 2 - 3 - 822006 - - - 3 - 4 - 350089 - - - 4 - 5 - 236925 - - - 5 - 6 - 207214 - - - 6 - 9 - 321099 - - - 9 - 17 - 281059 - - - 17 - 1325 - 149171 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 670798 - - - 2 - 3 - 190219 - - - 3 - 4 - 84050 - - - 4 - 7 - 103123 - - - 7 - 25 - 88000 - - - 25 - 239280 - 31480 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 817891 - - - 2 - 3 - 156702 - - - 3 - 5 - 96827 - - - 5 - 33 - 87651 - - - 33 - 67058 - 8600 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 762399 - - - 2 - 3 - 184417 - - - 3 - 4 - 74277 - - - 4 - 9 - 91683 - - - 9 - 76756 - 54895 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 673884 - - - 2 - 3 - 191741 - - - 3 - 4 - 84523 - - - 4 - 7 - 102897 - - - 7 - 27 - 87959 - - - 27 - 209281 - 26665 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 13875865 - - - 2 - 4984 - 435045 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 14310911 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 13875865 - - - 2 - 4984 - 435045 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 14180813 - - - 2 - 1923 - 130098 - - - - - - - - - method_location - 17716731 - - - id - 17406043 - - - loc - 9012 - - - - - id - loc - - - 12 - - - 1 - 2 - 17203664 - - - 2 - 34 - 202379 - - - - - - - loc - id - - - 12 - - - 1 - 12 - 740 - - - 12 - 45 - 678 - - - 45 - 68 - 699 - - - 69 - 117 - 678 - - - 123 - 189 - 699 - - - 190 - 254 - 678 - - - 258 - 391 - 678 - - - 397 - 615 - 678 - - - 617 - 851 - 678 - - - 858 - 1319 - 678 - - - 1319 - 1995 - 678 - - - 2133 - 4934 - 678 - - - 4958 - 30306 - 678 - - - 32604 - 58862 - 82 - - - - - - - - - constructors - 5023456 - - - id - 5023456 - - - name - 2237756 - - - declaring_type_id - 3721919 - - - unbound_id - 4648902 - - - - - id - name - - - 12 - - - 1 - 2 - 5023456 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 5023456 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 5023456 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1580599 - - - 2 - 3 - 438769 - - - 3 - 7 - 180013 - - - 7 - 29898 - 38373 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 2032661 - - - 2 - 5 - 178162 - - - 5 - 14950 - 26933 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 1604961 - - - 2 - 3 - 440251 - - - 3 - 8 - 171145 - - - 8 - 29898 - 21398 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 2716154 - - - 2 - 3 - 861470 - - - 3 - 55 - 144295 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 3721919 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 2716154 - - - 2 - 3 - 861470 - - - 3 - 55 - 144295 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 4603245 - - - 2 - 1890 - 45656 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 4648902 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 4603245 - - - 2 - 1890 - 45656 - - - - - - - - - constructor_location - 5171660 - - - id - 5023456 - - - loc - 9073 - - - - - id - loc - - - 12 - - - 1 - 2 - 4954672 - - - 2 - 306 - 68783 - - - - - - - loc - id - - - 12 - - - 1 - 8 - 699 - - - 8 - 21 - 720 - - - 21 - 34 - 740 - - - 34 - 51 - 761 - - - 51 - 81 - 699 - - - 81 - 109 - 720 - - - 109 - 156 - 740 - - - 156 - 250 - 720 - - - 250 - 365 - 720 - - - 381 - 573 - 699 - - - 575 - 936 - 699 - - - 940 - 3093 - 699 - - - 3321 - 11823 - 452 - - - - - - - - - destructors - 4588 - - - id - 4588 - - - name - 4341 - - - declaring_type_id - 4588 - - - unbound_id - 4485 - - - - - id - name - - - 12 - - - 1 - 2 - 4588 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 4588 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 4588 - - - - - - - name - id - - - 12 - - - 1 - 2 - 4156 - - - 2 - 5 - 185 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 4156 - - - 2 - 5 - 185 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 4197 - - - 2 - 3 - 144 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 4588 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 4588 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 4588 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 4444 - - - 3 - 5 - 41 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 4485 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 4444 - - - 3 - 5 - 41 - - - - - - - - - destructor_location - 4650 - - - id - 4588 - - - loc - 1090 - - - - - id - loc - - - 12 - - - 1 - 2 - 4526 - - - 2 - 3 - 61 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 555 - - - 2 - 3 - 82 - - - 3 - 4 - 205 - - - 4 - 8 - 82 - - - 8 - 13 - 82 - - - 16 - 48 - 82 - - - - - - - - - overrides - 3995078 - - - id - 3990366 - - - base_id - 1238308 - - - - - id - base_id - - - 12 - - - 1 - 2 - 3985655 - - - 2 - 3 - 4711 - - - - - - - base_id - id - - - 12 - - - 1 - 2 - 835956 - - - 2 - 3 - 192256 - - - 3 - 5 - 107958 - - - 5 - 28 - 93453 - - - 28 - 5964 - 8682 - - - - - - - - - explicitly_implements - 1640844 - - - id - 1640453 - - - interface_id - 107526 - - - - - id - interface_id - - - 12 - - - 1 - 2 - 1640062 - - - 2 - 3 - 390 - - - - - - - interface_id - id - - - 12 - - - 1 - 2 - 54895 - - - 2 - 3 - 17283 - - - 3 - 4 - 6831 - - - 4 - 5 - 6110 - - - 5 - 8 - 9258 - - - 8 - 19 - 8312 - - - 19 - 11268 - 4835 - - - - - - - - - local_functions - 4768 - - - id - 4768 - - - name - 2851 - - - return_type - 605 - - - unbound_id - 4652 - - - - - id - name - - - 12 - - - 1 - 2 - 4768 - - - - - - - id - return_type - - - 12 - - - 1 - 2 - 4768 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 4768 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2385 - - - 2 - 3 - 314 - - - 3 - 437 - 152 - - - - - - - name - return_type - - - 12 - - - 1 - 2 - 2807 - - - 2 - 7 - 44 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 2410 - - - 2 - 3 - 315 - - - 3 - 420 - 126 - - - - - - - return_type - id - - - 12 - - - 1 - 2 - 399 - - - 2 - 3 - 101 - - - 3 - 5 - 50 - - - 5 - 22 - 46 - - - 22 - 2380 - 9 - - - - - - - return_type - name - - - 12 - - - 1 - 2 - 449 - - - 2 - 3 - 76 - - - 3 - 6 - 49 - - - 6 - 859 - 31 - - - - - - - return_type - unbound_id - - - 12 - - - 1 - 2 - 402 - - - 2 - 3 - 101 - - - 3 - 5 - 48 - - - 5 - 23 - 46 - - - 25 - 2319 - 8 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 4609 - - - 2 - 12 - 43 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 4652 - - - - - - - unbound_id - return_type - - - 12 - - - 1 - 2 - 4642 - - - 2 - 5 - 10 - - - - - - - - - local_function_stmts - 4652 - - - fn - 4652 - - - stmt - 4652 - - - - - fn - stmt - - - 12 - - - 1 - 2 - 4652 - - - - - - - stmt - fn - - - 12 - - - 1 - 2 - 4652 - - - - - - - - - fields - 12987441 - - - id - 12987441 - - - kind - 41 - - - name - 5002407 - - - declaring_type_id - 2950960 - - - type_id - 2616467 - - - unbound_id - 12547601 - - - - - id - kind - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - name - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 12987441 - - - - - - - kind - id - - - 12 - - - 146000 - 146001 - 20 - - - 485213 - 485214 - 20 - - - - - - - kind - name - - - 12 - - - 98049 - 98050 - 20 - - - 150560 - 150561 - 20 - - - - - - - kind - declaring_type_id - - - 12 - - - 18259 - 18260 - 20 - - - 131629 - 131630 - 20 - - - - - - - kind - type_id - - - 12 - - - 7897 - 7898 - 20 - - - 122955 - 122956 - 20 - - - - - - - kind - unbound_id - - - 12 - - - 145585 - 145586 - 20 - - - 464251 - 464252 - 20 - - - - - - - name - id - - - 12 - - - 1 - 2 - 3909731 - - - 2 - 3 - 577859 - - - 3 - 8 - 381673 - - - 8 - 15557 - 133143 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 4889592 - - - 2 - 3 - 112814 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 3910781 - - - 2 - 3 - 578394 - - - 3 - 8 - 381549 - - - 8 - 15557 - 131682 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 4380578 - - - 2 - 3 - 372619 - - - 3 - 15557 - 249208 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 3938187 - - - 2 - 3 - 578229 - - - 3 - 9 - 380706 - - - 9 - 15557 - 105284 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 806657 - - - 2 - 3 - 748305 - - - 3 - 4 - 411630 - - - 4 - 5 - 257953 - - - 5 - 6 - 174293 - - - 6 - 8 - 222934 - - - 8 - 14 - 227110 - - - 14 - 6823 - 102074 - - - - - - - declaring_type_id - kind - - - 12 - - - 1 - 2 - 2817920 - - - 2 - 3 - 133040 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 806842 - - - 2 - 3 - 748285 - - - 3 - 4 - 411610 - - - 4 - 5 - 257994 - - - 5 - 6 - 174273 - - - 6 - 8 - 223057 - - - 8 - 14 - 226966 - - - 14 - 6823 - 101930 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 1103868 - - - 2 - 3 - 812418 - - - 3 - 4 - 381241 - - - 4 - 5 - 207975 - - - 5 - 7 - 225876 - - - 7 - 612 - 219580 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 806657 - - - 2 - 3 - 748305 - - - 3 - 4 - 411630 - - - 4 - 5 - 257953 - - - 5 - 6 - 174293 - - - 6 - 8 - 222934 - - - 8 - 14 - 227110 - - - 14 - 6823 - 102074 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 1788843 - - - 2 - 3 - 320667 - - - 3 - 5 - 237522 - - - 5 - 15 - 200568 - - - 15 - 68300 - 68865 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 2540605 - - - 2 - 3 - 75861 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 1915649 - - - 2 - 3 - 308898 - - - 3 - 5 - 202111 - - - 5 - 37646 - 189807 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 1970564 - - - 2 - 3 - 313115 - - - 3 - 6 - 205506 - - - 6 - 23118 - 127279 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 1793760 - - - 2 - 3 - 322333 - - - 3 - 5 - 235793 - - - 5 - 15 - 197420 - - - 15 - 67097 - 67158 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 12475176 - - - 2 - 1890 - 72425 - - - - - - - unbound_id - kind - - - 12 - - - 1 - 2 - 12547601 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 12547601 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 12475176 - - - 2 - 1890 - 72425 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 12525051 - - - 2 - 1339 - 22550 - - - - - - - - - field_location - 13100894 - - - id - 12872178 - - - loc - 8847 - - - - - id - loc - - - 12 - - - 1 - 2 - 12723624 - - - 2 - 283 - 148554 - - - - - - - loc - id - - - 12 - - - 1 - 13 - 740 - - - 13 - 36 - 678 - - - 38 - 64 - 699 - - - 64 - 107 - 678 - - - 107 - 183 - 678 - - - 183 - 257 - 678 - - - 258 - 361 - 678 - - - 368 - 551 - 678 - - - 555 - 845 - 678 - - - 854 - 1270 - 678 - - - 1296 - 2080 - 678 - - - 2119 - 5642 - 678 - - - 5811 - 25217 - 617 - - - - - - - - - localvars - 618977 - - - id - 618977 - - - kind - 50 - - - name - 113210 - - - implicitly_typed - 50 - - - type_id - 31962 - - - parent_id - 618977 - - - - - id - kind - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - name - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - implicitly_typed - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - parent_id - - - 12 - - - 1 - 2 - 618977 - - - - - - - kind - id - - - 12 - - - 68 - 69 - 25 - - - 24410 - 24411 - 25 - - - - - - - kind - name - - - 12 - - - 29 - 30 - 25 - - - 4457 - 4458 - 25 - - - - - - - kind - implicitly_typed - - - 12 - - - 1 - 2 - 25 - - - 2 - 3 - 25 - - - - - - - kind - type_id - - - 12 - - - 7 - 8 - 25 - - - 1262 - 1263 - 25 - - - - - - - kind - parent_id - - - 12 - - - 68 - 69 - 25 - - - 24410 - 24411 - 25 - - - - - - - name - id - - - 12 - - - 1 - 2 - 71663 - - - 2 - 3 - 17852 - - - 3 - 5 - 10443 - - - 5 - 12 - 8749 - - - 12 - 3783 - 4501 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 112982 - - - 2 - 3 - 227 - - - - - - - name - implicitly_typed - - - 12 - - - 1 - 2 - 98442 - - - 2 - 3 - 14767 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 97835 - - - 2 - 3 - 8420 - - - 3 - 74 - 6953 - - - - - - - name - parent_id - - - 12 - - - 1 - 2 - 71663 - - - 2 - 3 - 17852 - - - 3 - 5 - 10443 - - - 5 - 12 - 8749 - - - 12 - 3783 - 4501 - - - - - - - implicitly_typed - id - - - 12 - - - 5418 - 5419 - 25 - - - 19060 - 19061 - 25 - - - - - - - implicitly_typed - kind - - - 12 - - - 1 - 2 - 25 - - - 2 - 3 - 25 - - - - - - - implicitly_typed - name - - - 12 - - - 2195 - 2196 - 25 - - - 2866 - 2867 - 25 - - - - - - - implicitly_typed - type_id - - - 12 - - - 649 - 650 - 25 - - - 956 - 957 - 25 - - - - - - - implicitly_typed - parent_id - - - 12 - - - 5418 - 5419 - 25 - - - 19060 - 19061 - 25 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 14312 - - - 2 - 3 - 5639 - - - 3 - 4 - 2579 - - - 4 - 6 - 2629 - - - 6 - 10 - 2478 - - - 10 - 26 - 2427 - - - 26 - 7125 - 1896 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 31836 - - - 2 - 3 - 126 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 18737 - - - 2 - 3 - 5057 - - - 3 - 4 - 2199 - - - 4 - 7 - 2781 - - - 7 - 24 - 2427 - - - 24 - 596 - 758 - - - - - - - type_id - implicitly_typed - - - 12 - - - 1 - 2 - 23339 - - - 2 - 3 - 8622 - - - - - - - type_id - parent_id - - - 12 - - - 1 - 2 - 14312 - - - 2 - 3 - 5639 - - - 3 - 4 - 2579 - - - 4 - 6 - 2629 - - - 6 - 10 - 2478 - - - 10 - 26 - 2427 - - - 26 - 7125 - 1896 - - - - - - - parent_id - id - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - kind - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - name - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - implicitly_typed - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - type_id - - - 12 - - - 1 - 2 - 618977 - - - - - - - - - localvar_location - 618977 - - - id - 618977 - - - loc - 618977 - - - - - id - loc - - - 12 - - - 1 - 2 - 618977 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 618977 - - - - - - - - - params - 31463795 - - - id - 31463795 - - - name - 1755593 - - - type_id - 2360159 - - - index - 1419 - - - mode - 123 - - - parent_id - 17474189 - - - unbound_id - 25163555 - - - - - id - name - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - index - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - mode - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - parent_id - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 31463795 - - - - - - - name - id - - - 12 - - - 1 - 2 - 778572 - - - 2 - 3 - 321778 - - - 3 - 4 - 144356 - - - 4 - 6 - 159212 - - - 6 - 10 - 135097 - - - 10 - 26 - 133266 - - - 26 - 82408 - 83309 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 1424391 - - - 2 - 3 - 172668 - - - 3 - 12 - 132525 - - - 12 - 15932 - 26007 - - - - - - - name - index - - - 12 - - - 1 - 2 - 1213617 - - - 2 - 3 - 297581 - - - 3 - 4 - 115942 - - - 4 - 23 - 128452 - - - - - - - name - mode - - - 12 - - - 1 - 2 - 1598150 - - - 2 - 3 - 132052 - - - 3 - 7 - 25390 - - - - - - - name - parent_id - - - 12 - - - 1 - 2 - 778572 - - - 2 - 3 - 321778 - - - 3 - 4 - 144356 - - - 4 - 6 - 159212 - - - 6 - 10 - 135097 - - - 10 - 26 - 133266 - - - 26 - 82408 - 83309 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 795505 - - - 2 - 3 - 328094 - - - 3 - 4 - 155508 - - - 4 - 5 - 102856 - - - 5 - 8 - 139192 - - - 8 - 19 - 135632 - - - 19 - 69269 - 98802 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 1148640 - - - 2 - 3 - 332909 - - - 3 - 4 - 201144 - - - 4 - 5 - 156002 - - - 5 - 8 - 185034 - - - 8 - 18 - 178532 - - - 18 - 107768 - 157895 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 1573110 - - - 2 - 3 - 396137 - - - 3 - 4 - 179520 - - - 4 - 12 - 180898 - - - 12 - 11414 - 30492 - - - - - - - type_id - index - - - 12 - - - 1 - 2 - 1703558 - - - 2 - 3 - 413997 - - - 3 - 5 - 179499 - - - 5 - 70 - 63104 - - - - - - - type_id - mode - - - 12 - - - 1 - 2 - 2211872 - - - 2 - 6 - 148286 - - - - - - - type_id - parent_id - - - 12 - - - 1 - 2 - 1179771 - - - 2 - 3 - 314576 - - - 3 - 4 - 201021 - - - 4 - 5 - 156619 - - - 5 - 8 - 183079 - - - 8 - 19 - 178820 - - - 19 - 87339 - 146270 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 1156767 - - - 2 - 3 - 333711 - - - 3 - 4 - 213469 - - - 4 - 5 - 154623 - - - 5 - 8 - 193778 - - - 8 - 19 - 180507 - - - 19 - 100456 - 127299 - - - - - - - index - id - - - 12 - - - 2 - 3 - 164 - - - 3 - 4 - 102 - - - 4 - 5 - 246 - - - 5 - 10 - 82 - - - 10 - 13 - 123 - - - 14 - 33 - 123 - - - 38 - 72 - 123 - - - 85 - 224 - 123 - - - 302 - 1682 - 123 - - - 2493 - 36706 - 123 - - - 70171 - 849278 - 82 - - - - - - - index - name - - - 12 - - - 1 - 2 - 164 - - - 2 - 3 - 102 - - - 3 - 4 - 246 - - - 4 - 7 - 61 - - - 8 - 9 - 82 - - - 10 - 19 - 123 - - - 22 - 39 - 123 - - - 42 - 88 - 123 - - - 109 - 327 - 123 - - - 444 - 2590 - 123 - - - 3908 - 33082 - 123 - - - 38091 - 38092 - 20 - - - - - - - index - type_id - - - 12 - - - 1 - 2 - 473 - - - 2 - 5 - 102 - - - 6 - 8 - 102 - - - 8 - 17 - 123 - - - 20 - 36 - 123 - - - 41 - 96 - 123 - - - 104 - 358 - 123 - - - 477 - 2603 - 123 - - - 4110 - 76288 - 123 - - - - - - - index - mode - - - 12 - - - 2 - 3 - 1111 - - - 3 - 5 - 82 - - - 5 - 6 - 205 - - - 6 - 7 - 20 - - - - - - - index - parent_id - - - 12 - - - 2 - 3 - 164 - - - 3 - 4 - 102 - - - 4 - 5 - 246 - - - 5 - 10 - 82 - - - 10 - 13 - 123 - - - 14 - 33 - 123 - - - 38 - 72 - 123 - - - 85 - 224 - 123 - - - 302 - 1682 - 123 - - - 2493 - 36706 - 123 - - - 70171 - 849278 - 82 - - - - - - - index - unbound_id - - - 12 - - - 2 - 3 - 164 - - - 3 - 4 - 102 - - - 4 - 5 - 246 - - - 5 - 10 - 82 - - - 10 - 13 - 123 - - - 14 - 33 - 123 - - - 38 - 72 - 123 - - - 85 - 224 - 123 - - - 298 - 1634 - 123 - - - 2398 - 32495 - 123 - - - 61752 - 666467 - 82 - - - - - - - mode - id - - - 12 - - - 3182 - 3183 - 20 - - - 4460 - 4461 - 20 - - - 14929 - 14930 - 20 - - - 22552 - 22553 - 20 - - - 26702 - 26703 - 20 - - - 1457373 - 1457374 - 20 - - - - - - - mode - name - - - 12 - - - 326 - 327 - 20 - - - 590 - 591 - 20 - - - 2415 - 2416 - 20 - - - 2510 - 2511 - 20 - - - 8449 - 8450 - 20 - - - 80401 - 80402 - 20 - - - - - - - mode - type_id - - - 12 - - - 374 - 375 - 20 - - - 735 - 736 - 20 - - - 3241 - 3242 - 20 - - - 4690 - 4691 - 20 - - - 6825 - 6826 - 20 - - - 107299 - 107300 - 20 - - - - - - - mode - index - - - 12 - - - 1 - 2 - 20 - - - 12 - 13 - 20 - - - 13 - 14 - 20 - - - 15 - 16 - 20 - - - 69 - 70 - 41 - - - - - - - mode - parent_id - - - 12 - - - 2929 - 2930 - 20 - - - 4460 - 4461 - 20 - - - 12530 - 12531 - 20 - - - 18196 - 18197 - 20 - - - 22552 - 22553 - 20 - - - 829094 - 829095 - 20 - - - - - - - mode - unbound_id - - - 12 - - - 2889 - 2890 - 20 - - - 4031 - 4032 - 20 - - - 12465 - 12466 - 20 - - - 22552 - 22553 - 20 - - - 24088 - 24089 - 20 - - - 1156970 - 1156971 - 20 - - - - - - - parent_id - id - - - 12 - - - 1 - 2 - 9861816 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312173 - - - 8 - 70 - 131620 - - - - - - - parent_id - name - - - 12 - - - 1 - 2 - 9861795 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312194 - - - 8 - 70 - 131620 - - - - - - - parent_id - type_id - - - 12 - - - 1 - 2 - 10470044 - - - 2 - 3 - 4359859 - - - 3 - 4 - 1575867 - - - 4 - 43 - 1068417 - - - - - - - parent_id - index - - - 12 - - - 1 - 2 - 9861816 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312173 - - - 8 - 70 - 131620 - - - - - - - parent_id - mode - - - 12 - - - 1 - 2 - 16675453 - - - 2 - 5 - 798735 - - - - - - - parent_id - unbound_id - - - 12 - - - 1 - 2 - 9861816 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312173 - - - 8 - 70 - 131620 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 24344223 - - - 2 - 21044 - 819331 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 25163493 - - - 2 - 3 - 61 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 24924140 - - - 2 - 11733 - 239415 - - - - - - - unbound_id - index - - - 12 - - - 1 - 2 - 25163555 - - - - - - - unbound_id - mode - - - 12 - - - 1 - 2 - 25163534 - - - 2 - 3 - 20 - - - - - - - unbound_id - parent_id - - - 12 - - - 1 - 2 - 24344223 - - - 2 - 21044 - 819331 - - - - - - - - - param_location - 32044103 - - - id - 31456264 - - - loc - 9114 - - - - - id - loc - - - 12 - - - 1 - 2 - 31081793 - - - 2 - 283 - 374471 - - - - - - - loc - id - - - 12 - - - 1 - 24 - 699 - - - 24 - 64 - 720 - - - 65 - 111 - 699 - - - 111 - 197 - 699 - - - 199 - 289 - 699 - - - 295 - 459 - 699 - - - 464 - 683 - 699 - - - 698 - 1090 - 699 - - - 1100 - 1496 - 699 - - - 1518 - 2241 - 699 - - - 2322 - 4037 - 699 - - - 4172 - 10844 - 699 - - - 11544 - 122370 - 699 - - - - - - - - - scoped_annotation - 382475 - - - id - 382475 - - - kind - 20 - - - - - id - kind - - - 12 - - - 1 - 2 - 382475 - - - - - - - kind - id - - - 12 - - - 18589 - 18590 - 20 - - - - - - - - - statements - 3047725 - - - id - 3047725 - - - kind - 54 - - - - - id - kind - - - 12 - - - 1 - 2 - 3047725 - - - - - - - kind - id - - - 12 - - - 6 - 109 - 3 - - - 145 - 245 - 3 - - - 347 - 366 - 3 - - - 469 - 613 - 3 - - - 862 - 1025 - 3 - - - 1165 - 1263 - 3 - - - 1846 - 1883 - 3 - - - 2826 - 4737 - 3 - - - 5360 - 5866 - 3 - - - 6322 - 6522 - 3 - - - 11476 - 12650 - 3 - - - 34119 - 52069 - 3 - - - 70449 - 144614 - 3 - - - 205916 - 207348 - 3 - - - 441782 - 466315 - 3 - - - - - - - - - stmt_parent - 2600410 - - - stmt - 2600410 - - - index - 6148 - - - parent - 1245017 - - - - - stmt - index - - - 12 - - - 1 - 2 - 2600410 - - - - - - - stmt - parent - - - 12 - - - 1 - 2 - 2600410 - - - - - - - index - stmt - - - 12 - - - 1 - 2 - 1544 - - - 3 - 4 - 1155 - - - 4 - 5 - 564 - - - 5 - 6 - 50 - - - 6 - 7 - 927 - - - 7 - 9 - 512 - - - 9 - 54 - 476 - - - 54 - 79 - 490 - - - 79 - 442744 - 425 - - - - - - - index - parent - - - 12 - - - 1 - 2 - 1544 - - - 3 - 4 - 1155 - - - 4 - 5 - 564 - - - 5 - 6 - 50 - - - 6 - 7 - 927 - - - 7 - 9 - 512 - - - 9 - 54 - 476 - - - 54 - 79 - 490 - - - 79 - 442744 - 425 - - - - - - - parent - stmt - - - 12 - - - 1 - 2 - 802470 - - - 2 - 3 - 236411 - - - 3 - 4 - 77802 - - - 4 - 9 - 99408 - - - 9 - 3407 - 28925 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 802470 - - - 2 - 3 - 236411 - - - 3 - 4 - 77802 - - - 4 - 9 - 99408 - - - 9 - 3407 - 28925 - - - - - - - - - stmt_parent_top_level - 447315 - - - stmt - 447315 - - - index - 1 - - - parent - 422460 - - - - - stmt - index - - - 12 - - - 1 - 2 - 447315 - - - - - - - stmt - parent - - - 12 - - - 1 - 2 - 447315 - - - - - - - index - stmt - - - 12 - - - 247851 - 247852 - 1 - - - - - - - index - parent - - - 12 - - - 234079 - 234080 - 1 - - - - - - - parent - stmt - - - 12 - - - 1 - 2 - 399519 - - - 2 - 5 - 22940 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 422460 - - - - - - - - - stmt_location - 3047718 - - - id - 3047718 - - - loc - 2947201 - - - - - id - loc - - - 12 - - - 1 - 2 - 3047718 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 2852104 - - - 2 - 5 - 95097 - - - - - - - - - catch_type - 30233 - - - catch_id - 30233 - - - type_id - 1460 - - - kind - 22 - - - - - catch_id - type_id - - - 12 - - - 1 - 2 - 30233 - - - - - - - catch_id - kind - - - 12 - - - 1 - 2 - 30233 - - - - - - - type_id - catch_id - - - 12 - - - 1 - 2 - 384 - - - 2 - 3 - 169 - - - 3 - 4 - 135 - - - 4 - 6 - 124 - - - 6 - 9 - 113 - - - 10 - 14 - 113 - - - 14 - 23 - 124 - - - 23 - 54 - 113 - - - 55 - 84 - 124 - - - 87 - 586 - 56 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 1460 - - - - - - - kind - catch_id - - - 12 - - - 69 - 70 - 11 - - - 2602 - 2603 - 11 - - - - - - - kind - type_id - - - 12 - - - 1 - 2 - 11 - - - 128 - 129 - 11 - - - - - - - - - foreach_stmt_info - 32428 - - - id - 32428 - - - kind - 11 - - - - - id - kind - - - 12 - - - 1 - 2 - 32428 - - - - - - - kind - id - - - 12 - - - 2865 - 2866 - 11 - - - - - - - - - foreach_stmt_desugar - 162110 - - - id - 32428 - - - symbol - 19966 - - - kind - 56 - - - - - id - symbol - - - 12 - - - 4 - 5 - 33 - - - 5 - 6 - 32394 - - - - - - - id - kind - - - 12 - - - 4 - 5 - 33 - - - 5 - 6 - 32394 - - - - - - - symbol - id - - - 12 - - - 1 - 2 - 8908 - - - 2 - 3 - 3429 - - - 3 - 4 - 1924 - - - 4 - 5 - 1675 - - - 5 - 8 - 1799 - - - 8 - 17 - 1539 - - - 17 - 2863 - 690 - - - - - - - symbol - kind - - - 12 - - - 1 - 2 - 19966 - - - - - - - kind - id - - - 12 - - - 2862 - 2863 - 11 - - - 2865 - 2866 - 45 - - - - - - - kind - symbol - - - 12 - - - 1 - 2 - 11 - - - 275 - 276 - 11 - - - 437 - 438 - 11 - - - 489 - 490 - 11 - - - 562 - 563 - 11 - - - - - - - - - expressions - 12065274 - - - id - 12065274 - - - kind - 282 - - - type_id - 95429 - - - - - id - kind - - - 12 - - - 1 - 2 - 12065274 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 12065274 - - - - - - - kind - id - - - 12 - - - 1 - 37 - 25 - - - 47 - 133 - 23 - - - 134 - 544 - 23 - - - 570 - 985 - 23 - - - 1041 - 1502 - 23 - - - 1512 - 1811 - 23 - - - 1901 - 3636 - 23 - - - 4438 - 6455 - 23 - - - 7058 - 14022 - 23 - - - 14452 - 28402 - 23 - - - 32648 - 169673 - 23 - - - 172052 - 1144418 - 23 - - - - - - - kind - type_id - - - 12 - - - 1 - 2 - 91 - - - 2 - 7 - 25 - - - 8 - 12 - 23 - - - 12 - 27 - 23 - - - 29 - 102 - 23 - - - 162 - 320 - 23 - - - 320 - 863 - 23 - - - 915 - 4194 - 23 - - - 4905 - 13903 - 23 - - - 16571 - 16572 - 2 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 19361 - - - 2 - 3 - 13919 - - - 3 - 4 - 5455 - - - 4 - 5 - 8090 - - - 5 - 7 - 7637 - - - 7 - 11 - 8729 - - - 11 - 17 - 7698 - - - 17 - 30 - 7273 - - - 30 - 60 - 7182 - - - 60 - 238 - 7161 - - - 238 - 919701 - 2916 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 34716 - - - 2 - 3 - 21172 - - - 3 - 4 - 11492 - - - 4 - 5 - 6989 - - - 5 - 6 - 5465 - - - 6 - 8 - 6872 - - - 8 - 13 - 7208 - - - 13 - 60 - 1512 - - - - - - - - - expr_parent - 11682627 - - - expr - 11682627 - - - index - 40690 - - - parent - 7823161 - - - - - expr - index - - - 12 - - - 1 - 2 - 11682627 - - - - - - - expr - parent - - - 12 - - - 1 - 2 - 11682627 - - - - - - - index - expr - - - 12 - - - 2 - 3 - 1 - - - 4 - 5 - 21177 - - - 5 - 6 - 6394 - - - 6 - 9 - 3219 - - - 10 - 11 - 5955 - - - 11 - 66 - 3059 - - - 66 - 3205889 - 882 - - - - - - - index - parent - - - 12 - - - 2 - 3 - 1 - - - 4 - 5 - 21177 - - - 5 - 6 - 6394 - - - 6 - 9 - 3219 - - - 10 - 11 - 5955 - - - 11 - 66 - 3059 - - - 66 - 3205889 - 882 - - - - - - - parent - expr - - - 12 - - - 1 - 2 - 5080905 - - - 2 - 3 - 2351683 - - - 3 - 22534 - 390573 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 5080905 - - - 2 - 3 - 2351683 - - - 3 - 22534 - 390573 - - - - - - - - - expr_parent_top_level - 6487352 - - - expr - 6487352 - - - index - 288 - - - parent - 4784226 - - - - - expr - index - - - 12 - - - 1 - 2 - 6487352 - - - - - - - expr - parent - - - 12 - - - 1 - 2 - 6487352 - - - - - - - index - expr - - - 12 - - - 3 - 4 - 20 - - - 311 - 312 - 20 - - - 1372 - 1373 - 20 - - - 1391 - 1392 - 20 - - - 1528 - 1529 - 20 - - - 1702 - 1703 - 20 - - - 1867 - 1868 - 20 - - - 4112 - 4113 - 20 - - - 5735 - 5736 - 20 - - - 7848 - 7849 - 20 - - - 9279 - 9280 - 20 - - - 15335 - 15336 - 20 - - - 31901 - 31902 - 20 - - - 232913 - 232914 - 20 - - - - - - - index - parent - - - 12 - - - 3 - 4 - 20 - - - 311 - 312 - 20 - - - 1372 - 1373 - 20 - - - 1391 - 1392 - 20 - - - 1528 - 1529 - 20 - - - 1702 - 1703 - 20 - - - 1867 - 1868 - 20 - - - 4112 - 4113 - 20 - - - 5735 - 5736 - 20 - - - 7848 - 7849 - 20 - - - 9279 - 9280 - 20 - - - 15335 - 15336 - 20 - - - 31901 - 31902 - 20 - - - 232522 - 232523 - 20 - - - - - - - parent - expr - - - 12 - - - 1 - 2 - 4124209 - - - 2 - 3 - 343485 - - - 3 - 15 - 316531 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 4127851 - - - 2 - 3 - 340851 - - - 3 - 15 - 315523 - - - - - - - - - implicitly_typed_array_creation - 21805 - - - id - 21805 - - - - - - explicitly_sized_array_creation - 13319 - - - id - 13319 - - - - - - stackalloc_array_creation - 2321 - - - id - 2321 - - - - - - implicitly_typed_object_creation - 14530 - - - id - 14530 - - - - - - mutator_invocation_mode - 14 - - - id - 14 - - - mode - 4 - - - - - id - mode - - - 12 - - - 1 - 2 - 14 - - - - - - - mode - id - - - 12 - - - 2 - 3 - 2 - - - 4 - 5 - 2 - - - - - - - - - expr_compiler_generated - 12064553 - - - id - 12064553 - - - - - - expr_value - 8310351 - - - id - 8310351 - - - value - 718800 - - - - - id - value - - - 12 - - - 1 - 2 - 8310351 - - - - - - - value - id - - - 12 - - - 1 - 2 - 505578 - - - 2 - 3 - 110654 - - - 3 - 4 - 55368 - - - 4 - 80631 - 47199 - - - - - - - - - expr_call - 1966123 - - - caller_id - 1966123 - - - target_id - 257171 - - - - - caller_id - target_id - - - 12 - - - 1 - 2 - 1966123 - - - - - - - target_id - caller_id - - - 12 - - - 1 - 2 - 137518 - - - 2 - 3 - 51107 - - - 3 - 4 - 19300 - - - 4 - 6 - 19323 - - - 6 - 15 - 19385 - - - 15 - 46132 - 10536 - - - - - - - - - expr_access - 4484304 - - - accesser_id - 4484304 - - - target_id - 1084863 - - - - - accesser_id - target_id - - - 12 - - - 1 - 2 - 4484304 - - - - - - - target_id - accesser_id - - - 12 - - - 1 - 2 - 361965 - - - 2 - 3 - 236660 - - - 3 - 4 - 166914 - - - 4 - 5 - 102379 - - - 5 - 7 - 99569 - - - 7 - 15 - 84375 - - - 15 - 15109 - 32998 - - - - - - - - - expr_location - 12065274 - - - id - 12065274 - - - loc - 7880074 - - - - - id - loc - - - 12 - - - 1 - 2 - 12065274 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 6971739 - - - 2 - 3 - 852056 - - - 3 - 163205 - 56279 - - - - - - - - - dynamic_member_name - 22330 - - - id - 22330 - - - name - 2023 - - - - - id - name - - - 12 - - - 1 - 2 - 22330 - - - - - - - name - id - - - 12 - - - 1 - 2 - 620 - - - 2 - 3 - 310 - - - 3 - 4 - 229 - - - 4 - 5 - 168 - - - 5 - 7 - 168 - - - 7 - 11 - 155 - - - 11 - 22 - 155 - - - 22 - 52 - 155 - - - 61 - 437 - 60 - - - - - - - - - conditional_access - 11568 - - - id - 11568 - - - - - - expr_argument - 1774394 - - - id - 1774394 - - - mode - 75 - - - - - id - mode - - - 12 - - - 1 - 2 - 1774394 - - - - - - - mode - id - - - 12 - - - 954 - 955 - 25 - - - 1083 - 1084 - 25 - - - 68133 - 68134 - 25 - - - - - - - - - expr_argument_name - 840195 - - - id - 840195 - - - name - 4732 - - - - - id - name - - - 12 - - - 1 - 2 - 840195 - - - - - - - name - id - - - 12 - - - 1 - 2 - 514 - - - 2 - 3 - 390 - - - 3 - 5 - 390 - - - 5 - 8 - 370 - - - 8 - 12 - 349 - - - 12 - 19 - 432 - - - 19 - 27 - 370 - - - 27 - 57 - 370 - - - 57 - 112 - 432 - - - 130 - 202 - 370 - - - 202 - 478 - 370 - - - 602 - 4039 - 370 - - - - - - - - - lambda_expr_return_type - 92 - - - id - 92 - - - type_id - 37 - - - - - id - type_id - - - 12 - - - 1 - 2 - 92 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 7 - - - 2 - 3 - 17 - - - 3 - 4 - 5 - - - 4 - 5 - 5 - - - 6 - 7 - 2 - - - - - - - - - xmlEncoding - 51263 - - - id - 51263 - - - encoding - 2 - - - - - id - encoding - - - 12 - - - 1 - 2 - 51263 - - - - - - - encoding - id - - - 12 - - - 20448 - 20449 - 2 - - - - - - - - - xmlDTDs - 72 - - - id - 72 - - - root - 21 - - - publicId - 5 - - - systemId - 18 - - - fileid - 72 - - - - - id - root - - - 12 - - - 1 - 2 - 72 - - - - - - - id - publicId - - - 12 - - - 1 - 2 - 72 - - - - - - - id - systemId - - - 12 - - - 1 - 2 - 72 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 72 - - - - - - - root - id - - - 12 - - - 1 - 2 - 10 - - - 2 - 3 - 3 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 20 - 21 - 1 - - - - - - - root - publicId - - - 12 - - - 1 - 2 - 21 - - - - - - - root - systemId - - - 12 - - - 1 - 2 - 19 - - - 2 - 3 - 1 - - - - - - - root - fileid - - - 12 - - - 1 - 2 - 10 - - - 2 - 3 - 3 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 20 - 21 - 1 - - - - - - - publicId - id - - - 12 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 33 - 34 - 1 - - - - - - - publicId - root - - - 12 - - - 1 - 2 - 3 - - - 10 - 11 - 1 - - - - - - - publicId - systemId - - - 12 - - - 1 - 2 - 3 - - - 8 - 9 - 1 - - - - - - - publicId - fileid - - - 12 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 33 - 34 - 1 - - - - - - - systemId - id - - - 12 - - - 1 - 2 - 9 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 20 - 21 - 1 - - - - - - - systemId - root - - - 12 - - - 1 - 2 - 16 - - - 4 - 5 - 1 - - - - - - - systemId - publicId - - - 12 - - - 1 - 2 - 18 - - - - - - - systemId - fileid - - - 12 - - - 1 - 2 - 9 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 20 - 21 - 1 - - - - - - - fileid - id - - - 12 - - - 1 - 2 - 72 - - - - - - - fileid - root - - - 12 - - - 1 - 2 - 72 - - - - - - - fileid - publicId - - - 12 - - - 1 - 2 - 72 - - - - - - - fileid - systemId - - - 12 - - - 1 - 2 - 72 - - - - - - - - - xmlElements - 67055539 - - - id - 67055539 - - - name - 5081 - - - parentid - 27349180 - - - idx - 78608 - - - fileid - 51258 - - - - - id - name - - - 12 - - - 1 - 2 - 67055539 - - - - - - - id - parentid - - - 12 - - - 1 - 2 - 67055539 - - - - - - - id - idx - - - 12 - - - 1 - 2 - 67055539 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 67055539 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2522 - - - 2 - 3 - 729 - - - 3 - 4 - 230 - - - 4 - 6 - 386 - - - 6 - 18 - 393 - - - 18 - 45 - 383 - - - 45 - 23438 - 383 - - - 29236 - 5652342 - 52 - - - - - - - name - parentid - - - 12 - - - 1 - 2 - 2890 - - - 2 - 3 - 631 - - - 3 - 5 - 411 - - - 5 - 16 - 391 - - - 16 - 48 - 383 - - - 48 - 4842281 - 373 - - - - - - - name - idx - - - 12 - - - 1 - 2 - 3407 - - - 2 - 3 - 787 - - - 3 - 5 - 396 - - - 5 - 20 - 386 - - - 20 - 31356 - 105 - - - - - - - name - fileid - - - 12 - - - 1 - 2 - 3086 - - - 2 - 3 - 579 - - - 3 - 5 - 416 - - - 5 - 17 - 393 - - - 17 - 71 - 383 - - - 75 - 18136 - 223 - - - - - - - parentid - id - - - 12 - - - 1 - 2 - 16073753 - - - 2 - 3 - 5276115 - - - 3 - 4 - 2404943 - - - 4 - 6 - 2304967 - - - 6 - 31356 - 1289399 - - - - - - - parentid - name - - - 12 - - - 1 - 2 - 19031401 - - - 2 - 3 - 4596698 - - - 3 - 4 - 2298745 - - - 4 - 121 - 1422335 - - - - - - - parentid - idx - - - 12 - - - 1 - 2 - 16073753 - - - 2 - 3 - 5276115 - - - 3 - 4 - 2404943 - - - 4 - 6 - 2304967 - - - 6 - 31356 - 1289399 - - - - - - - parentid - fileid - - - 12 - - - 1 - 2 - 27349180 - - - - - - - idx - id - - - 12 - - - 1 - 2 - 35499 - - - 2 - 4 - 6999 - - - 4 - 11 - 4863 - - - 12 - 15 - 3316 - - - 15 - 24 - 6202 - - - 25 - 42 - 5954 - - - 43 - 64 - 5914 - - - 64 - 506 - 5901 - - - 506 - 10908964 - 3956 - - - - - - - idx - name - - - 12 - - - 1 - 2 - 77665 - - - 2 - 820 - 942 - - - - - - - idx - parentid - - - 12 - - - 1 - 2 - 35499 - - - 2 - 4 - 6999 - - - 4 - 11 - 4863 - - - 12 - 15 - 3316 - - - 15 - 24 - 6202 - - - 25 - 42 - 5954 - - - 43 - 64 - 5914 - - - 64 - 506 - 5901 - - - 506 - 10908964 - 3956 - - - - - - - idx - fileid - - - 12 - - - 1 - 2 - 35499 - - - 2 - 4 - 6999 - - - 4 - 11 - 4863 - - - 12 - 15 - 3316 - - - 15 - 24 - 6202 - - - 25 - 42 - 5954 - - - 43 - 64 - 5914 - - - 64 - 506 - 5901 - - - 506 - 20447 - 3956 - - - - - - - fileid - id - - - 12 - - - 1 - 15 - 4344 - - - 15 - 54 - 3951 - - - 54 - 103 - 3991 - - - 103 - 172 - 4379 - - - 173 - 236 - 4048 - - - 237 - 351 - 4562 - - - 351 - 564 - 3885 - - - 564 - 804 - 3850 - - - 806 - 996 - 4221 - - - 997 - 1436 - 4329 - - - 1441 - 2336 - 3860 - - - 2342 - 5717 - 3848 - - - 5804 - 173229 - 1983 - - - - - - - fileid - name - - - 12 - - - 1 - 7 - 4620 - - - 7 - 11 - 4139 - - - 11 - 12 - 5811 - - - 12 - 13 - 4279 - - - 13 - 14 - 5981 - - - 14 - 15 - 7167 - - - 15 - 16 - 4580 - - - 16 - 17 - 4016 - - - 17 - 19 - 4615 - - - 19 - 24 - 4269 - - - 24 - 240 - 1777 - - - - - - - fileid - parentid - - - 12 - - - 1 - 6 - 4166 - - - 6 - 19 - 3973 - - - 19 - 48 - 3855 - - - 48 - 72 - 3928 - - - 72 - 94 - 4209 - - - 94 - 142 - 3850 - - - 142 - 208 - 3921 - - - 209 - 314 - 4374 - - - 314 - 426 - 3848 - - - 426 - 585 - 3848 - - - 592 - 903 - 3845 - - - 904 - 1647 - 3905 - - - 1647 - 45210 - 3529 - - - - - - - fileid - idx - - - 12 - - - 1 - 6 - 3921 - - - 6 - 13 - 3858 - - - 13 - 28 - 3966 - - - 28 - 41 - 3665 - - - 41 - 48 - 4149 - - - 48 - 67 - 3860 - - - 67 - 96 - 3926 - - - 96 - 152 - 3983 - - - 152 - 199 - 3850 - - - 199 - 283 - 4713 - - - 283 - 386 - 3858 - - - 386 - 762 - 4061 - - - 763 - 31356 - 3444 - - - - - - - - - xmlAttrs - 45628904 - - - id - 45628904 - - - elementid - 45269560 - - - name - 1208 - - - value - 1023272 - - - idx - 32 - - - fileid - 50822 - - - - - id - elementid - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - name - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - value - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - idx - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 45628904 - - - - - - - elementid - id - - - 12 - - - 1 - 2 - 45077900 - - - 2 - 14 - 191660 - - - - - - - elementid - name - - - 12 - - - 1 - 2 - 45077900 - - - 2 - 14 - 191660 - - - - - - - elementid - value - - - 12 - - - 1 - 2 - 45078108 - - - 2 - 13 - 191452 - - - - - - - elementid - idx - - - 12 - - - 1 - 2 - 45077900 - - - 2 - 14 - 191660 - - - - - - - elementid - fileid - - - 12 - - - 1 - 2 - 45269560 - - - - - - - name - id - - - 12 - - - 1 - 2 - 120 - - - 2 - 3 - 145 - - - 3 - 4 - 75 - - - 4 - 5 - 92 - - - 5 - 9 - 102 - - - 9 - 17 - 107 - - - 17 - 23 - 100 - - - 23 - 37 - 95 - - - 38 - 51 - 95 - - - 51 - 126 - 95 - - - 126 - 1237 - 92 - - - 1288 - 11202688 - 85 - - - - - - - name - elementid - - - 12 - - - 1 - 2 - 120 - - - 2 - 3 - 145 - - - 3 - 4 - 75 - - - 4 - 5 - 92 - - - 5 - 9 - 102 - - - 9 - 17 - 107 - - - 17 - 23 - 100 - - - 23 - 37 - 95 - - - 38 - 51 - 95 - - - 51 - 126 - 95 - - - 126 - 1237 - 92 - - - 1288 - 11202688 - 85 - - - - - - - name - value - - - 12 - - - 1 - 2 - 554 - - - 2 - 3 - 172 - - - 3 - 4 - 92 - - - 4 - 6 - 82 - - - 6 - 10 - 110 - - - 10 - 20 - 100 - - - 23 - 47718 - 92 - - - 389503 - 389504 - 2 - - - - - - - name - idx - - - 12 - - - 1 - 2 - 842 - - - 2 - 3 - 245 - - - 3 - 5 - 110 - - - 5 - 7 - 10 - - - - - - - name - fileid - - - 12 - - - 1 - 2 - 358 - - - 2 - 3 - 205 - - - 3 - 4 - 50 - - - 4 - 5 - 130 - - - 5 - 10 - 95 - - - 10 - 19 - 97 - - - 19 - 27 - 110 - - - 27 - 96 - 92 - - - 96 - 18200 - 67 - - - - - - - value - id - - - 12 - - - 1 - 2 - 172777 - - - 2 - 3 - 292834 - - - 3 - 4 - 91955 - - - 4 - 5 - 61901 - - - 5 - 6 - 46741 - - - 6 - 8 - 84359 - - - 8 - 13 - 89335 - - - 13 - 37 - 77108 - - - 37 - 165 - 77294 - - - 165 - 509314 - 28963 - - - - - - - value - elementid - - - 12 - - - 1 - 2 - 172792 - - - 2 - 3 - 292844 - - - 3 - 4 - 91950 - - - 4 - 5 - 61908 - - - 5 - 6 - 46751 - - - 6 - 8 - 84366 - - - 8 - 13 - 89315 - - - 13 - 37 - 77083 - - - 37 - 165 - 77294 - - - 165 - 509314 - 28963 - - - - - - - value - name - - - 12 - - - 1 - 2 - 914005 - - - 2 - 3 - 108644 - - - 3 - 79 - 621 - - - - - - - value - idx - - - 12 - - - 1 - 2 - 1021432 - - - 2 - 11 - 1840 - - - - - - - value - fileid - - - 12 - - - 1 - 2 - 186355 - - - 2 - 3 - 344083 - - - 3 - 4 - 95269 - - - 4 - 5 - 44923 - - - 5 - 6 - 51597 - - - 6 - 8 - 77921 - - - 8 - 15 - 82373 - - - 15 - 68 - 77986 - - - 68 - 10155 - 62761 - - - - - - - idx - id - - - 12 - - - 18 - 19 - 2 - - - 25 - 26 - 2 - - - 53 - 54 - 2 - - - 66 - 67 - 2 - - - 80 - 81 - 2 - - - 167 - 168 - 2 - - - 488 - 489 - 2 - - - 3298 - 3299 - 2 - - - 3710 - 3711 - 2 - - - 5951 - 5952 - 2 - - - 53029 - 53030 - 2 - - - 76449 - 76450 - 2 - - - 18056993 - 18056994 - 2 - - - - - - - idx - elementid - - - 12 - - - 18 - 19 - 2 - - - 25 - 26 - 2 - - - 53 - 54 - 2 - - - 66 - 67 - 2 - - - 80 - 81 - 2 - - - 167 - 168 - 2 - - - 488 - 489 - 2 - - - 3298 - 3299 - 2 - - - 3710 - 3711 - 2 - - - 5951 - 5952 - 2 - - - 53029 - 53030 - 2 - - - 76449 - 76450 - 2 - - - 18056993 - 18056994 - 2 - - - - - - - idx - name - - - 12 - - - 1 - 2 - 2 - - - 2 - 3 - 2 - - - 4 - 5 - 2 - - - 6 - 7 - 5 - - - 10 - 11 - 2 - - - 23 - 24 - 2 - - - 33 - 34 - 2 - - - 51 - 52 - 2 - - - 86 - 87 - 2 - - - 140 - 141 - 2 - - - 155 - 156 - 2 - - - 181 - 182 - 2 - - - - - - - idx - value - - - 12 - - - 2 - 3 - 2 - - - 6 - 7 - 2 - - - 10 - 11 - 2 - - - 17 - 18 - 2 - - - 19 - 20 - 2 - - - 27 - 28 - 2 - - - 35 - 36 - 2 - - - 69 - 70 - 2 - - - 117 - 118 - 2 - - - 206 - 207 - 2 - - - 733 - 734 - 2 - - - 3245 - 3246 - 2 - - - 404557 - 404558 - 2 - - - - - - - idx - fileid - - - 12 - - - 1 - 2 - 2 - - - 2 - 3 - 2 - - - 3 - 4 - 5 - - - 7 - 8 - 2 - - - 31 - 32 - 2 - - - 51 - 52 - 2 - - - 73 - 74 - 2 - - - 126 - 127 - 2 - - - 582 - 583 - 2 - - - 1889 - 1890 - 2 - - - 3098 - 3099 - 2 - - - 20272 - 20273 - 2 - - - - - - - fileid - id - - - 12 - - - 1 - 12 - 3988 - - - 12 - 34 - 4169 - - - 34 - 64 - 3853 - - - 64 - 109 - 4595 - - - 110 - 165 - 4071 - - - 165 - 228 - 3848 - - - 228 - 406 - 3805 - - - 407 - 464 - 4289 - - - 465 - 654 - 3893 - - - 656 - 873 - 3953 - - - 873 - 1602 - 3833 - - - 1605 - 3016 - 3845 - - - 3021 - 96503 - 2675 - - - - - - - fileid - elementid - - - 12 - - - 1 - 10 - 3850 - - - 10 - 30 - 3915 - - - 30 - 61 - 3835 - - - 61 - 105 - 3923 - - - 105 - 146 - 4083 - - - 146 - 221 - 3820 - - - 222 - 343 - 3820 - - - 343 - 446 - 3815 - - - 446 - 623 - 3823 - - - 623 - 788 - 4570 - - - 789 - 1329 - 4384 - - - 1334 - 2799 - 3878 - - - 2814 - 96503 - 3098 - - - - - - - fileid - name - - - 12 - - - 1 - 2 - 3123 - - - 2 - 3 - 19559 - - - 3 - 4 - 13086 - - - 4 - 5 - 6159 - - - 5 - 6 - 4693 - - - 6 - 11 - 3873 - - - 11 - 71 - 325 - - - - - - - fileid - value - - - 12 - - - 1 - 10 - 3838 - - - 10 - 27 - 4078 - - - 27 - 43 - 4199 - - - 43 - 61 - 4266 - - - 61 - 79 - 4354 - - - 79 - 116 - 4322 - - - 116 - 180 - 3895 - - - 181 - 237 - 4154 - - - 237 - 315 - 4031 - - - 316 - 419 - 3858 - - - 422 - 600 - 3833 - - - 601 - 1116 - 3865 - - - 1117 - 31691 - 2123 - - - - - - - fileid - idx - - - 12 - - - 1 - 2 - 43055 - - - 2 - 3 - 3031 - - - 3 - 5 - 4419 - - - 5 - 14 - 315 - - - - - - - - - xmlNs - 7710 - - - id - 429 - - - prefixName - 209 - - - URI - 429 - - - fileid - 5340 - - - - - id - prefixName - - - 12 - - - 1 - 2 - 369 - - - 2 - 3 - 43 - - - 3 - 5 - 16 - - - - - - - id - URI - - - 12 - - - 1 - 2 - 429 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 39 - - - 3 - 4 - 30 - - - 4 - 6 - 30 - - - 6 - 10 - 32 - - - 10 - 23 - 32 - - - 26 - 53 - 32 - - - 60 - 1917 - 14 - - - - - - - prefixName - id - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 19 - - - 3 - 7 - 16 - - - 7 - 113 - 5 - - - - - - - prefixName - URI - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 19 - - - 3 - 7 - 16 - - - 7 - 113 - 5 - - - - - - - prefixName - fileid - - - 12 - - - 1 - 2 - 99 - - - 2 - 3 - 23 - - - 3 - 4 - 18 - - - 4 - 8 - 16 - - - 8 - 23 - 18 - - - 26 - 27 - 18 - - - 27 - 2848 - 16 - - - - - - - URI - id - - - 12 - - - 1 - 2 - 429 - - - - - - - URI - prefixName - - - 12 - - - 1 - 2 - 369 - - - 2 - 3 - 43 - - - 3 - 5 - 16 - - - - - - - URI - fileid - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 39 - - - 3 - 4 - 30 - - - 4 - 6 - 30 - - - 6 - 10 - 32 - - - 10 - 23 - 32 - - - 26 - 53 - 32 - - - 60 - 1917 - 14 - - - - - - - fileid - id - - - 12 - - - 1 - 2 - 4589 - - - 2 - 4 - 420 - - - 4 - 21 - 330 - - - - - - - fileid - prefixName - - - 12 - - - 1 - 2 - 4620 - - - 2 - 3 - 323 - - - 3 - 21 - 397 - - - - - - - fileid - URI - - - 12 - - - 1 - 2 - 4589 - - - 2 - 4 - 420 - - - 4 - 21 - 330 - - - - - - - - - xmlHasNs - 357558 - - - elementId - 357558 - - - nsId - 61 - - - fileid - 1851 - - - - - elementId - nsId - - - 12 - - - 1 - 2 - 357558 - - - - - - - elementId - fileid - - - 12 - - - 1 - 2 - 357558 - - - - - - - nsId - elementId - - - 12 - - - 280 - 281 - 20 - - - 306 - 307 - 20 - - - 16792 - 16793 - 20 - - - - - - - nsId - fileid - - - 12 - - - 3 - 4 - 20 - - - 12 - 13 - 20 - - - 75 - 76 - 20 - - - - - - - fileid - elementId - - - 12 - - - 3 - 4 - 20 - - - 4 - 5 - 205 - - - 7 - 9 - 144 - - - 9 - 14 - 144 - - - 18 - 25 - 144 - - - 35 - 52 - 144 - - - 52 - 73 - 164 - - - 74 - 90 - 144 - - - 95 - 121 - 164 - - - 128 - 155 - 144 - - - 156 - 227 - 144 - - - 233 - 429 - 144 - - - 577 - 6115 - 144 - - - - - - - fileid - nsId - - - 12 - - - 1 - 2 - 1851 - - - - - - - - - xmlComments - 12809 - - - id - 12809 - - - text - 4879 - - - parentid - 9500 - - - fileid - 7255 - - - - - id - text - - - 12 - - - 1 - 2 - 12809 - - - - - - - id - parentid - - - 12 - - - 1 - 2 - 12809 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 12809 - - - - - - - text - id - - - 12 - - - 1 - 2 - 3642 - - - 2 - 3 - 774 - - - 3 - 9 - 371 - - - 10 - 567 - 91 - - - - - - - text - parentid - - - 12 - - - 1 - 2 - 3654 - - - 2 - 3 - 784 - - - 3 - 13 - 373 - - - 13 - 567 - 67 - - - - - - - text - fileid - - - 12 - - - 1 - 2 - 3687 - - - 2 - 3 - 791 - - - 3 - 20 - 366 - - - 24 - 567 - 35 - - - - - - - parentid - id - - - 12 - - - 1 - 2 - 7992 - - - 2 - 3 - 949 - - - 3 - 104 - 557 - - - - - - - parentid - text - - - 12 - - - 1 - 2 - 7997 - - - 2 - 3 - 954 - - - 3 - 99 - 548 - - - - - - - parentid - fileid - - - 12 - - - 1 - 2 - 9500 - - - - - - - fileid - id - - - 12 - - - 1 - 2 - 5210 - - - 2 - 3 - 1360 - - - 3 - 8 - 574 - - - 8 - 197 - 109 - - - - - - - fileid - text - - - 12 - - - 1 - 2 - 5581 - - - 2 - 3 - 998 - - - 3 - 8 - 569 - - - 8 - 162 - 105 - - - - - - - fileid - parentid - - - 12 - - - 1 - 2 - 5906 - - - 2 - 3 - 1059 - - - 3 - 69 - 289 - - - - - - - - - xmlChars - 50180784 - - - id - 50180784 - - - text - 1818216 - - - parentid - 31634472 - - - idx - 150 - - - isCDATA - 5 - - - fileid - 49067 - - - - - id - text - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - parentid - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - idx - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - isCDATA - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 50180784 - - - - - - - text - id - - - 12 - - - 1 - 2 - 190086 - - - 2 - 3 - 423589 - - - 3 - 4 - 100439 - - - 4 - 5 - 177322 - - - 5 - 6 - 53806 - - - 6 - 8 - 152869 - - - 8 - 10 - 147478 - - - 10 - 12 - 103307 - - - 12 - 15 - 93299 - - - 15 - 21 - 150863 - - - 21 - 67 - 136894 - - - 67 - 1003068 - 88260 - - - - - - - text - parentid - - - 12 - - - 1 - 2 - 190221 - - - 2 - 3 - 423619 - - - 3 - 4 - 100462 - - - 4 - 5 - 177362 - - - 5 - 6 - 53816 - - - 6 - 8 - 152846 - - - 8 - 10 - 147494 - - - 10 - 12 - 103325 - - - 12 - 15 - 93372 - - - 15 - 21 - 150996 - - - 21 - 67 - 136666 - - - 67 - 1000575 - 88034 - - - - - - - text - idx - - - 12 - - - 1 - 2 - 1784454 - - - 2 - 33 - 33762 - - - - - - - text - isCDATA - - - 12 - - - 1 - 2 - 1818213 - - - 2 - 3 - 2 - - - - - - - text - fileid - - - 12 - - - 1 - 2 - 256810 - - - 2 - 3 - 492750 - - - 3 - 4 - 134141 - - - 4 - 5 - 137247 - - - 5 - 6 - 63550 - - - 6 - 8 - 148887 - - - 8 - 10 - 138656 - - - 10 - 12 - 119803 - - - 12 - 15 - 79127 - - - 15 - 20 - 138215 - - - 20 - 15105 - 109023 - - - - - - - parentid - id - - - 12 - - - 1 - 2 - 19072554 - - - 2 - 3 - 9102321 - - - 3 - 5 - 2902114 - - - 5 - 61 - 557482 - - - - - - - parentid - text - - - 12 - - - 1 - 2 - 19074795 - - - 2 - 3 - 9111041 - - - 3 - 4 - 2305313 - - - 4 - 47 - 1143321 - - - - - - - parentid - idx - - - 12 - - - 1 - 2 - 19072554 - - - 2 - 3 - 9102321 - - - 3 - 5 - 2902114 - - - 5 - 61 - 557482 - - - - - - - parentid - isCDATA - - - 12 - - - 1 - 2 - 31633875 - - - 2 - 3 - 596 - - - - - - - parentid - fileid - - - 12 - - - 1 - 2 - 31634472 - - - - - - - idx - id - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 12 - 12 - - - 143 - 179 - 12 - - - 179 - 671 - 12 - - - 672 - 1026 - 12 - - - 1033 - 2152 - 12 - - - 3032 - 10769 - 12 - - - 16820 - 119828 - 12 - - - 222367 - 12618269 - 12 - - - - - - - idx - text - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 9 - 12 - - - 11 - 20 - 12 - - - 23 - 48 - 12 - - - 48 - 72 - 10 - - - 76 - 119 - 12 - - - 164 - 395 - 12 - - - 487 - 2261 - 12 - - - 3391 - 137772 - 12 - - - 546508 - 546509 - 2 - - - - - - - idx - parentid - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 12 - 12 - - - 143 - 179 - 12 - - - 179 - 671 - 12 - - - 672 - 1026 - 12 - - - 1033 - 2152 - 12 - - - 3032 - 10769 - 12 - - - 16820 - 119828 - 12 - - - 222367 - 12618269 - 12 - - - - - - - idx - isCDATA - - - 12 - - - 1 - 2 - 137 - - - 2 - 3 - 12 - - - - - - - idx - fileid - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 9 - 12 - - - 130 - 161 - 12 - - - 161 - 306 - 7 - - - 309 - 310 - 10 - - - 318 - 485 - 12 - - - 574 - 902 - 12 - - - 1021 - 2926 - 12 - - - 3636 - 14031 - 12 - - - 16349 - 19573 - 7 - - - - - - - isCDATA - id - - - 12 - - - 8497 - 8498 - 2 - - - 20007471 - 20007472 - 2 - - - - - - - isCDATA - text - - - 12 - - - 578 - 579 - 2 - - - 724668 - 724669 - 2 - - - - - - - isCDATA - parentid - - - 12 - - - 8442 - 8443 - 2 - - - 12610064 - 12610065 - 2 - - - - - - - isCDATA - idx - - - 12 - - - 5 - 6 - 2 - - - 60 - 61 - 2 - - - - - - - isCDATA - fileid - - - 12 - - - 91 - 92 - 2 - - - 19572 - 19573 - 2 - - - - - - - fileid - id - - - 12 - - - 1 - 9 - 3773 - - - 9 - 38 - 4083 - - - 38 - 85 - 4011 - - - 88 - 131 - 3783 - - - 133 - 179 - 3765 - - - 179 - 265 - 3986 - - - 266 - 408 - 3753 - - - 409 - 578 - 3828 - - - 578 - 710 - 3895 - - - 712 - 1057 - 3690 - - - 1057 - 1658 - 3680 - - - 1664 - 3328 - 3690 - - - 3346 - 98239 - 3126 - - - - - - - fileid - text - - - 12 - - - 1 - 8 - 3883 - - - 8 - 27 - 3858 - - - 27 - 53 - 3702 - - - 53 - 70 - 4144 - - - 70 - 95 - 3941 - - - 95 - 144 - 4389 - - - 145 - 208 - 4016 - - - 208 - 310 - 4424 - - - 311 - 416 - 4287 - - - 417 - 564 - 3717 - - - 564 - 900 - 4144 - - - 901 - 2855 - 3710 - - - 2857 - 30223 - 847 - - - - - - - fileid - parentid - - - 12 - - - 1 - 9 - 3800 - - - 9 - 31 - 3690 - - - 31 - 56 - 3825 - - - 56 - 84 - 3855 - - - 84 - 111 - 3890 - - - 111 - 166 - 3938 - - - 166 - 273 - 3725 - - - 273 - 394 - 3908 - - - 395 - 509 - 4477 - - - 510 - 699 - 3750 - - - 700 - 1079 - 3697 - - - 1083 - 1973 - 3732 - - - 1984 - 61987 - 2772 - - - - - - - fileid - idx - - - 12 - - - 1 - 2 - 5663 - - - 2 - 3 - 2416 - - - 3 - 4 - 5813 - - - 4 - 5 - 10697 - - - 5 - 6 - 7972 - - - 6 - 7 - 5264 - - - 7 - 9 - 3905 - - - 9 - 12 - 4294 - - - 12 - 61 - 3038 - - - - - - - fileid - isCDATA - - - 12 - - - 1 - 2 - 48839 - - - 2 - 3 - 228 - - - - - - - - - xmllocations - 162926731 - - - xmlElement - 162922041 - - - location - 142828357 - - - - - xmlElement - location - - - 12 - - - 1 - 2 - 162921993 - - - 2 - 1057 - 47 - - - - - - - location - xmlElement - - - 12 - - - 1 - 2 - 123073773 - - - 2 - 3 - 19573590 - - - 3 - 15 - 180993 - - - - - - - - - commentline - 1860741 - - - id - 1860741 - - - kind - 33 - - - text - 694930 - - - rawtext - 701268 - - - - - id - kind - - - 12 - - - 1 - 2 - 1860741 - - - - - - - id - text - - - 12 - - - 1 - 2 - 1860741 - - - - - - - id - rawtext - - - 12 - - - 1 - 2 - 1860741 - - - - - - - kind - id - - - 12 - - - 2462 - 2463 - 11 - - - 31123 - 31124 - 11 - - - 130806 - 130807 - 11 - - - - - - - kind - text - - - 12 - - - 1003 - 1004 - 11 - - - 22421 - 22422 - 11 - - - 38180 - 38181 - 11 - - - - - - - kind - rawtext - - - 12 - - - 1088 - 1089 - 11 - - - 22533 - 22534 - 11 - - - 38334 - 38335 - 11 - - - - - - - text - id - - - 12 - - - 1 - 2 - 581264 - - - 2 - 3 - 64405 - - - 3 - 21238 - 49260 - - - - - - - text - kind - - - 12 - - - 1 - 2 - 692688 - - - 2 - 4 - 2241 - - - - - - - text - rawtext - - - 12 - - - 1 - 2 - 690719 - - - 2 - 40 - 4210 - - - - - - - rawtext - id - - - 12 - - - 1 - 2 - 588146 - - - 2 - 3 - 63714 - - - 3 - 21237 - 49407 - - - - - - - rawtext - kind - - - 12 - - - 1 - 2 - 701268 - - - - - - - rawtext - text - - - 12 - - - 1 - 2 - 701268 - - - - - - - - - commentline_location - 1860741 - - - id - 1860741 - - - loc - 1860741 - - - - - id - loc - - - 12 - - - 1 - 2 - 1860741 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 1860741 - - - - - - - - - commentblock - 452748 - - - id - 452748 - - - - - - commentblock_location - 452748 - - - id - 452748 - - - loc - 452748 - - - - - id - loc - - - 12 - - - 1 - 2 - 452748 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 452748 - - - - - - - - - commentblock_binding - 1636184 - - - id - 452748 - - - entity - 706226 - - - bindtype - 45 - - - - - id - entity - - - 12 - - - 1 - 2 - 28772 - - - 2 - 3 - 104417 - - - 3 - 4 - 319558 - - - - - - - id - bindtype - - - 12 - - - 1 - 3 - 29089 - - - 3 - 4 - 104100 - - - 4 - 5 - 319558 - - - - - - - entity - id - - - 12 - - - 1 - 2 - 498273 - - - 2 - 3 - 169535 - - - 3 - 526 - 38416 - - - - - - - entity - bindtype - - - 12 - - - 1 - 2 - 267400 - - - 2 - 3 - 275934 - - - 3 - 4 - 151312 - - - 4 - 5 - 11579 - - - - - - - bindtype - id - - - 12 - - - 29783 - 29784 - 11 - - - 36938 - 36939 - 11 - - - 38861 - 38862 - 11 - - - 38970 - 38971 - 11 - - - - - - - bindtype - entity - - - 12 - - - 12587 - 12588 - 11 - - - 29493 - 29494 - 11 - - - 36905 - 36906 - 11 - - - 37591 - 37592 - 11 - - - - - - - - - commentblock_child - 2293999 - - - id - 452748 - - - commentline - 1859983 - - - index - 3656 - - - - - id - commentline - - - 12 - - - 1 - 2 - 140797 - - - 2 - 3 - 43747 - - - 3 - 4 - 103829 - - - 4 - 5 - 35303 - - - 5 - 6 - 58462 - - - 6 - 10 - 39525 - - - 10 - 323 - 31081 - - - - - - - id - index - - - 12 - - - 1 - 2 - 4629 - - - 2 - 3 - 137322 - - - 3 - 4 - 49735 - - - 4 - 5 - 98656 - - - 5 - 6 - 34092 - - - 6 - 7 - 58213 - - - 7 - 11 - 39254 - - - 11 - 324 - 30844 - - - - - - - commentline - id - - - 12 - - - 1 - 2 - 1859983 - - - - - - - commentline - index - - - 12 - - - 1 - 2 - 1425967 - - - 2 - 3 - 434015 - - - - - - - index - id - - - 12 - - - 1 - 2 - 1822 - - - 2 - 3 - 373 - - - 3 - 9 - 271 - - - 11 - 19 - 282 - - - 19 - 46 - 282 - - - 51 - 418 - 282 - - - 445 - 11337 - 282 - - - 14348 - 40000 - 56 - - - - - - - index - commentline - - - 12 - - - 1 - 2 - 1822 - - - 2 - 3 - 373 - - - 3 - 9 - 271 - - - 11 - 19 - 282 - - - 19 - 46 - 282 - - - 51 - 418 - 282 - - - 445 - 11337 - 282 - - - 14348 - 40000 - 56 - - - - - - - - - asp_elements - 184013 - - - id - 184013 - - - kind - 16 - - - loc - 184013 - - - - - id - kind - - - 12 - - - 1 - 2 - 184013 - - - - - - - id - loc - - - 12 - - - 1 - 2 - 184013 - - - - - - - kind - id - - - 12 - - - 161 - 162 - 1 - - - 325 - 326 - 1 - - - 760 - 761 - 1 - - - 848 - 849 - 1 - - - 1845 - 1846 - 1 - - - 13496 - 13497 - 1 - - - 18618 - 18619 - 1 - - - 32419 - 32420 - 1 - - - 33487 - 33488 - 1 - - - - - - - kind - loc - - - 12 - - - 161 - 162 - 1 - - - 325 - 326 - 1 - - - 760 - 761 - 1 - - - 848 - 849 - 1 - - - 1845 - 1846 - 1 - - - 13496 - 13497 - 1 - - - 18618 - 18619 - 1 - - - 32419 - 32420 - 1 - - - 33487 - 33488 - 1 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 184013 - - - - - - - loc - kind - - - 12 - - - 1 - 2 - 184013 - - - - - - - - - asp_comment_server - 21 - - - comment - 21 - - - - - - asp_code_inline - 893 - - - code - 893 - - - - - - asp_directive_attribute - 9235 - - - directive - 3328 - - - index - 12 - - - name - 75 - - - value - 9235 - - - - - directive - index - - - 12 - - - 1 - 2 - 832 - - - 2 - 3 - 258 - - - 3 - 4 - 1113 - - - 4 - 5 - 1081 - - - 5 - 8 - 43 - - - - - - - directive - name - - - 12 - - - 1 - 2 - 832 - - - 2 - 3 - 258 - - - 3 - 4 - 1113 - - - 4 - 5 - 1081 - - - 5 - 8 - 43 - - - - - - - directive - value - - - 12 - - - 1 - 2 - 832 - - - 2 - 3 - 258 - - - 3 - 4 - 1113 - - - 4 - 5 - 1081 - - - 5 - 8 - 43 - - - - - - - index - directive - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - 24 - 25 - 1 - - - 623 - 624 - 1 - - - 1240 - 1241 - 1 - - - 1383 - 1384 - 1 - - - 1844 - 1845 - 1 - - - - - - - index - name - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - 7 - 8 - 3 - - - 19 - 20 - 3 - - - 26 - 27 - 1 - - - - - - - index - value - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - 24 - 25 - 1 - - - 623 - 624 - 1 - - - 1240 - 1241 - 1 - - - 1383 - 1384 - 1 - - - 1844 - 1845 - 1 - - - - - - - name - directive - - - 12 - - - 1 - 2 - 18 - - - 2 - 3 - 3 - - - 3 - 4 - 5 - - - 4 - 5 - 7 - - - 5 - 6 - 3 - - - 6 - 7 - 3 - - - 7 - 8 - 5 - - - 9 - 22 - 5 - - - 22 - 24 - 5 - - - 35 - 165 - 5 - - - 496 - 527 - 5 - - - 692 - 713 - 5 - - - 1049 - 1050 - 1 - - - - - - - name - index - - - 12 - - - 1 - 2 - 39 - - - 2 - 3 - 14 - - - 3 - 4 - 14 - - - 4 - 6 - 5 - - - 6 - 7 - 1 - - - - - - - name - value - - - 12 - - - 1 - 2 - 18 - - - 2 - 3 - 3 - - - 3 - 4 - 5 - - - 4 - 5 - 7 - - - 5 - 6 - 3 - - - 6 - 7 - 3 - - - 7 - 8 - 5 - - - 9 - 22 - 5 - - - 22 - 24 - 5 - - - 35 - 165 - 5 - - - 496 - 527 - 5 - - - 692 - 713 - 5 - - - 1049 - 1050 - 1 - - - - - - - value - directive - - - 12 - - - 1 - 2 - 9235 - - - - - - - value - index - - - 12 - - - 1 - 2 - 9235 - - - - - - - value - name - - - 12 - - - 1 - 2 - 9235 - - - - - - - - - asp_directive_name - 3329 - - - directive - 3329 - - - name - 16 - - - - - directive - name - - - 12 - - - 1 - 2 - 3329 - - - - - - - name - directive - - - 12 - - - 2 - 3 - 3 - - - 6 - 7 - 5 - - - 83 - 84 - 1 - - - 195 - 196 - 1 - - - 530 - 531 - 1 - - - 1015 - 1016 - 1 - - - - - - - - - asp_element_body - 147082 - - - element - 147082 - - - body - 12449 - - - - - element - body - - - 12 - - - 1 - 2 - 147082 - - - - - - - body - element - - - 12 - - - 1 - 2 - 8191 - - - 2 - 3 - 1436 - - - 3 - 5 - 922 - - - 5 - 10 - 947 - - - 10 - 1007 - 934 - - - 1095 - 5694 - 16 - - - - - - - - - asp_tag_attribute - 49274 - - - tag - 20204 - - - index - 37 - - - name - 716 - - - attribute - 49274 - - - - - tag - index - - - 12 - - - 1 - 2 - 5724 - - - 2 - 3 - 7269 - - - 3 - 4 - 3266 - - - 4 - 5 - 2008 - - - 5 - 7 - 1586 - - - 7 - 22 - 348 - - - - - - - tag - name - - - 12 - - - 1 - 2 - 5724 - - - 2 - 3 - 7269 - - - 3 - 4 - 3266 - - - 4 - 5 - 2008 - - - 5 - 7 - 1586 - - - 7 - 22 - 348 - - - - - - - tag - attribute - - - 12 - - - 1 - 2 - 5724 - - - 2 - 3 - 7269 - - - 3 - 4 - 3266 - - - 4 - 5 - 2008 - - - 5 - 7 - 1586 - - - 7 - 22 - 348 - - - - - - - index - tag - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 3 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 8 - 9 - 1 - - - 9 - 10 - 1 - - - 15 - 16 - 1 - - - 26 - 27 - 1 - - - 47 - 48 - 1 - - - 83 - 84 - 1 - - - 137 - 138 - 1 - - - 193 - 194 - 1 - - - 296 - 297 - 1 - - - 1072 - 1073 - 1 - - - 2185 - 2186 - 1 - - - 3995 - 3996 - 1 - - - 8023 - 8024 - 1 - - - 11195 - 11196 - 1 - - - - - - - index - name - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 3 - - - 3 - 4 - 1 - - - 4 - 5 - 3 - - - 7 - 8 - 3 - - - 9 - 10 - 1 - - - 18 - 19 - 1 - - - 22 - 23 - 1 - - - 33 - 34 - 1 - - - 47 - 48 - 1 - - - 58 - 59 - 1 - - - 73 - 74 - 1 - - - 106 - 107 - 1 - - - 107 - 108 - 1 - - - 140 - 141 - 1 - - - 159 - 160 - 1 - - - 195 - 196 - 1 - - - - - - - index - attribute - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 3 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 8 - 9 - 1 - - - 9 - 10 - 1 - - - 15 - 16 - 1 - - - 26 - 27 - 1 - - - 47 - 48 - 1 - - - 83 - 84 - 1 - - - 137 - 138 - 1 - - - 193 - 194 - 1 - - - 296 - 297 - 1 - - - 1072 - 1073 - 1 - - - 2185 - 2186 - 1 - - - 3995 - 3996 - 1 - - - 8023 - 8024 - 1 - - - 11195 - 11196 - 1 - - - - - - - name - tag - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 77 - - - 3 - 4 - 39 - - - 4 - 5 - 45 - - - 5 - 8 - 61 - - - 8 - 12 - 55 - - - 12 - 18 - 59 - - - 18 - 35 - 54 - - - 35 - 109 - 54 - - - 110 - 5718 - 52 - - - - - - - name - index - - - 12 - - - 1 - 2 - 335 - - - 2 - 3 - 164 - - - 3 - 4 - 75 - - - 4 - 5 - 34 - - - 5 - 7 - 54 - - - 7 - 13 - 52 - - - - - - - name - attribute - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 77 - - - 3 - 4 - 39 - - - 4 - 5 - 45 - - - 5 - 8 - 61 - - - 8 - 12 - 55 - - - 12 - 18 - 59 - - - 18 - 35 - 54 - - - 35 - 109 - 54 - - - 110 - 5718 - 52 - - - - - - - attribute - tag - - - 12 - - - 1 - 2 - 49274 - - - - - - - attribute - index - - - 12 - - - 1 - 2 - 49274 - - - - - - - attribute - name - - - 12 - - - 1 - 2 - 49274 - - - - - - - - - asp_tag_name - 33601 - - - tag - 33601 - - - name - 545 - - - - - tag - name - - - 12 - - - 1 - 2 - 33601 - - - - - - - name - tag - - - 12 - - - 1 - 2 - 138 - - - 2 - 3 - 57 - - - 3 - 5 - 41 - - - 5 - 8 - 48 - - - 8 - 12 - 43 - - - 12 - 19 - 41 - - - 19 - 31 - 45 - - - 32 - 53 - 41 - - - 53 - 161 - 41 - - - 170 - 996 - 41 - - - 1223 - 1970 - 3 - - - - - - - - - asp_tag_isempty - 4203 - - - tag - 4203 - - - - - - cil_instruction - 0 - - - id - 0 - - - opcode - 0 - - - index - 0 - - - impl - 0 - - - - - id - opcode - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - impl - - - 12 - - - 1 - 2 - 2 - - - - - - - opcode - id - - - 12 - - - - - - opcode - index - - - 12 - - - - - - opcode - impl - - - 12 - - - - - - index - id - - - 12 - - - - - - index - opcode - - - 12 - - - - - - index - impl - - - 12 - - - - - - impl - id - - - 12 - - - - - - impl - opcode - - - 12 - - - - - - impl - index - - - 12 - - - - - - - - cil_jump - 0 - - - instruction - 0 - - - target - 0 - - - - - instruction - target - - - 12 - - - 1 - 2 - 2 - - - - - - - target - instruction - - - 12 - - - - - - - - cil_access - 0 - - - instruction - 0 - - - target - 0 - - - - - instruction - target - - - 12 - - - 1 - 2 - 2 - - - - - - - target - instruction - - - 12 - - - - - - - - cil_value - 0 - - - instruction - 0 - - - value - 0 - - - - - instruction - value - - - 12 - - - 1 - 2 - 2 - - - - - - - value - instruction - - - 12 - - - - - - - - cil_switch - 0 - - - instruction - 0 - - - index - 0 - - - target - 0 - - - - - instruction - index - - - 12 - - - - - - instruction - target - - - 12 - - - - - - index - instruction - - - 12 - - - - - - index - target - - - 12 - - - - - - target - instruction - - - 12 - - - - - - target - index - - - 12 - - - - - - - - cil_instruction_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - 1 - 2 - 2 - - - - - - - loc - id - - - 12 - - - - - - - - cil_type_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - - - - loc - id - - - 12 - - - - - - - - cil_method_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - - - - loc - id - - - 12 - - - - - - - - cil_type - 0 - - - id - 0 - - - name - 0 - - - kind - 0 - - - parent - 0 - - - sourceDecl - 0 - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - kind - - - 12 - - - 1 - 2 - 2 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - sourceDecl - - - 12 - - - 1 - 2 - 2 - - - - - - - name - id - - - 12 - - - - - - name - kind - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - sourceDecl - - - 12 - - - - - - kind - id - - - 12 - - - - - - kind - name - - - 12 - - - - - - kind - parent - - - 12 - - - - - - kind - sourceDecl - - - 12 - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - kind - - - 12 - - - - - - parent - sourceDecl - - - 12 - - - - - - sourceDecl - id - - - 12 - - - - - - sourceDecl - name - - - 12 - - - - - - sourceDecl - kind - - - 12 - - - - - - sourceDecl - parent - - - 12 - - - - - - - - cil_pointer_type - 0 - - - id - 0 - - - pointee - 0 - - - - - id - pointee - - - 12 - - - 1 - 2 - 2 - - - - - - - pointee - id - - - 12 - - - - - - - - cil_array_type - 0 - - - id - 0 - - - element_type - 0 - - - rank - 0 - - - - - id - element_type - - - 12 - - - 1 - 2 - 2 - - - - - - - id - rank - - - 12 - - - 1 - 2 - 2 - - - - - - - element_type - id - - - 12 - - - - - - element_type - rank - - - 12 - - - - - - rank - id - - - 12 - - - - - - rank - element_type - - - 12 - - - - - - - - cil_function_pointer_return_type - 0 - - - id - 0 - - - return_type - 0 - - - - - id - return_type - - - 12 - - - 1 - 2 - 2 - - - - - - - return_type - id - - - 12 - - - - - - - - cil_method - 0 - - - id - 0 - - - name - 0 - - - parent - 0 - - - return_type - 0 - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - return_type - - - 12 - - - 1 - 2 - 2 - - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - return_type - - - 12 - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - return_type - - - 12 - - - - - - return_type - id - - - 12 - - - - - - return_type - name - - - 12 - - - - - - return_type - parent - - - 12 - - - - - - - - cil_method_source_declaration - 0 - - - method - 0 - - - source - 0 - - - - - method - source - - - 12 - - - 1 - 2 - 2 - - - - - - - source - method - - - 12 - - - - - - - - cil_method_implementation - 0 - - - id - 0 - - - method - 0 - - - location - 0 - - - - - id - method - - - 12 - - - 1 - 2 - 2 - - - - - - - id - location - - - 12 - - - 1 - 2 - 2 - - - - - - - method - id - - - 12 - - - - - - method - location - - - 12 - - - - - - location - id - - - 12 - - - - - - location - method - - - 12 - - - - - - - - cil_implements - 0 - - - id - 0 - - - decl - 0 - - - - - id - decl - - - 12 - - - - - - decl - id - - - 12 - - - - - - - - cil_field - 0 - - - id - 0 - - - parent - 0 - - - name - 0 - - - field_type - 0 - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - field_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - field_type - - - 12 - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - field_type - - - 12 - - - - - - field_type - id - - - 12 - - - - - - field_type - parent - - - 12 - - - - - - field_type - name - - - 12 - - - - - - - - cil_parameter - 0 - - - id - 0 - - - parameterizable - 0 - - - index - 0 - - - param_type - 0 - - - - - id - parameterizable - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - param_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parameterizable - id - - - 12 - - - - - - parameterizable - index - - - 12 - - - - - - parameterizable - param_type - - - 12 - - - - - - index - id - - - 12 - - - - - - index - parameterizable - - - 12 - - - - - - index - param_type - - - 12 - - - - - - param_type - id - - - 12 - - - - - - param_type - parameterizable - - - 12 - - - - - - param_type - index - - - 12 - - - - - - - - cil_parameter_in - 0 - - - id - 0 - - - - - - cil_parameter_out - 0 - - - id - 0 - - - - - - cil_setter - 0 - - - prop - 0 - - - method - 0 - - - - - prop - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - prop - - - 12 - - - - - - - - cil_custom_modifiers - 0 - - - id - 0 - - - modifier - 0 - - - kind - 0 - - - - - id - modifier - - - 12 - - - - - - id - kind - - - 12 - - - - - - modifier - id - - - 12 - - - - - - modifier - kind - - - 12 - - - - - - kind - id - - - 12 - - - - - - kind - modifier - - - 12 - - - - - - - - cil_type_annotation - 0 - - - id - 0 - - - annotation - 0 - - - - - id - annotation - - - 12 - - - - - - annotation - id - - - 12 - - - - - - - - cil_getter - 0 - - - prop - 0 - - - method - 0 - - - - - prop - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - prop - - - 12 - - - - - - - - cil_adder - 0 - - - event - 0 - - - method - 0 - - - - - event - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - event - - - 12 - - - - - - - - cil_remover - 0 - - - event - 0 - - - method - 0 - - - - - event - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - event - - - 12 - - - - - - - - cil_raiser - 0 - - - event - 0 - - - method - 0 - - - - - event - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - event - - - 12 - - - - - - - - cil_property - 0 - - - id - 0 - - - parent - 0 - - - name - 0 - - - property_type - 0 - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - property_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - property_type - - - 12 - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - property_type - - - 12 - - - - - - property_type - id - - - 12 - - - - - - property_type - parent - - - 12 - - - - - - property_type - name - - - 12 - - - - - - - - cil_event - 0 - - - id - 0 - - - parent - 0 - - - name - 0 - - - event_type - 0 - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - event_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - event_type - - - 12 - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - event_type - - - 12 - - - - - - event_type - id - - - 12 - - - - - - event_type - parent - - - 12 - - - - - - event_type - name - - - 12 - - - - - - - - cil_local_variable - 0 - - - id - 0 - - - impl - 0 - - - index - 0 - - - var_type - 0 - - - - - id - impl - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - var_type - - - 12 - - - 1 - 2 - 2 - - - - - - - impl - id - - - 12 - - - - - - impl - index - - - 12 - - - - - - impl - var_type - - - 12 - - - - - - index - id - - - 12 - - - - - - index - impl - - - 12 - - - - - - index - var_type - - - 12 - - - - - - var_type - id - - - 12 - - - - - - var_type - impl - - - 12 - - - - - - var_type - index - - - 12 - - - - - - - - cil_function_pointer_calling_conventions - 0 - - - id - 0 - - - kind - 0 - - - - - id - kind - - - 12 - - - - - - kind - id - - - 12 - - - - - - - - cil_handler - 0 - - - id - 0 - - - impl - 0 - - - index - 0 - - - kind - 0 - - - try_start - 0 - - - try_end - 0 - - - handler_start - 0 - - - - - id - impl - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - kind - - - 12 - - - 1 - 2 - 2 - - - - - - - id - try_start - - - 12 - - - 1 - 2 - 2 - - - - - - - id - try_end - - - 12 - - - 1 - 2 - 2 - - - - - - - id - handler_start - - - 12 - - - 1 - 2 - 2 - - - - - - - impl - id - - - 12 - - - - - - impl - index - - - 12 - - - - - - impl - kind - - - 12 - - - - - - impl - try_start - - - 12 - - - - - - impl - try_end - - - 12 - - - - - - impl - handler_start - - - 12 - - - - - - index - id - - - 12 - - - - - - index - impl - - - 12 - - - - - - index - kind - - - 12 - - - - - - index - try_start - - - 12 - - - - - - index - try_end - - - 12 - - - - - - index - handler_start - - - 12 - - - - - - kind - id - - - 12 - - - - - - kind - impl - - - 12 - - - - - - kind - index - - - 12 - - - - - - kind - try_start - - - 12 - - - - - - kind - try_end - - - 12 - - - - - - kind - handler_start - - - 12 - - - - - - try_start - id - - - 12 - - - - - - try_start - impl - - - 12 - - - - - - try_start - index - - - 12 - - - - - - try_start - kind - - - 12 - - - - - - try_start - try_end - - - 12 - - - - - - try_start - handler_start - - - 12 - - - - - - try_end - id - - - 12 - - - - - - try_end - impl - - - 12 - - - - - - try_end - index - - - 12 - - - - - - try_end - kind - - - 12 - - - - - - try_end - try_start - - - 12 - - - - - - try_end - handler_start - - - 12 - - - - - - handler_start - id - - - 12 - - - - - - handler_start - impl - - - 12 - - - - - - handler_start - index - - - 12 - - - - - - handler_start - kind - - - 12 - - - - - - handler_start - try_start - - - 12 - - - - - - handler_start - try_end - - - 12 - - - - - - - - cil_handler_filter - 0 - - - id - 0 - - - filter_start - 0 - - - - - id - filter_start - - - 12 - - - 1 - 2 - 2 - - - - - - - filter_start - id - - - 12 - - - - - - - - cil_handler_type - 0 - - - id - 0 - - - catch_type - 0 - - - - - id - catch_type - - - 12 - - - 1 - 2 - 2 - - - - - - - catch_type - id - - - 12 - - - - - - - - cil_method_stack_size - 0 - - - method - 0 - - - size - 0 - - - - - method - size - - - 12 - - - 1 - 2 - 2 - - - - - - - size - method - - - 12 - - - - - - - - cil_public - 0 - - - id - 0 - - - - - - cil_private - 0 - - - id - 0 - - - - - - cil_protected - 0 - - - id - 0 - - - - - - cil_internal - 0 - - - id - 0 - - - - - - cil_static - 0 - - - id - 0 - - - - - - cil_sealed - 0 - - - id - 0 - - - - - - cil_virtual - 0 - - - id - 0 - - - - - - cil_abstract - 0 - - - id - 0 - - - - - - cil_class - 0 - - - id - 0 - - - - - - cil_interface - 0 - - - id - 0 - - - - - - cil_security - 0 - - - id - 0 - - - - - - cil_requiresecobject - 0 - - - id - 0 - - - - - - cil_specialname - 0 - - - id - 0 - - - - - - cil_newslot - 0 - - - id - 0 - - - - - - cil_base_class - 0 - - - id - 0 - - - base - 0 - - - - - id - base - - - 12 - - - 1 - 2 - 2 - - - - - - - base - id - - - 12 - - - - - - - - cil_base_interface - 0 - - - id - 0 - - - base - 0 - - - - - id - base - - - 12 - - - - - - base - id - - - 12 - - - - - - - - cil_enum_underlying_type - 0 - - - id - 0 - - - underlying - 0 - - - - - id - underlying - - - 12 - - - 1 - 2 - 2 - - - - - - - underlying - id - - - 12 - - - - - - - - cil_type_parameter - 0 - - - unbound - 0 - - - index - 0 - - - param - 0 - - - - - unbound - index - - - 12 - - - - - - unbound - param - - - 12 - - - - - - index - unbound - - - 12 - - - - - - index - param - - - 12 - - - - - - param - unbound - - - 12 - - - - - - param - index - - - 12 - - - - - - - - cil_type_argument - 0 - - - bound - 0 - - - index - 0 - - - t - 0 - - - - - bound - index - - - 12 - - - - - - bound - t - - - 12 - - - - - - index - bound - - - 12 - - - - - - index - t - - - 12 - - - - - - t - bound - - - 12 - - - - - - t - index - - - 12 - - - - - - - - cil_typeparam_covariant - 0 - - - tp - 0 - - - - - - cil_typeparam_contravariant - 0 - - - tp - 0 - - - - - - cil_typeparam_class - 0 - - - tp - 0 - - - - - - cil_typeparam_struct - 0 - - - tp - 0 - - - - - - cil_typeparam_new - 0 - - - tp - 0 - - - - - - cil_typeparam_constraint - 0 - - - tp - 0 - - - supertype - 0 - - - - - tp - supertype - - - 12 - - - - - - supertype - tp - - - 12 - - - - - - - - cil_attribute - 0 - - - attributeid - 0 - - - element - 0 - - - constructor - 0 - - - - - attributeid - element - - - 12 - - - 1 - 2 - 2 - - - - - - - attributeid - constructor - - - 12 - - - 1 - 2 - 2 - - - - - - - element - attributeid - - - 12 - - - - - - element - constructor - - - 12 - - - - - - constructor - attributeid - - - 12 - - - - - - constructor - element - - - 12 - - - - - - - - cil_attribute_named_argument - 0 - - - attribute_id - 0 - - - param - 0 - - - value - 0 - - - - - attribute_id - param - - - 12 - - - - - - attribute_id - value - - - 12 - - - - - - param - attribute_id - - - 12 - - - - - - param - value - - - 12 - - - - - - value - attribute_id - - - 12 - - - - - - value - param - - - 12 - - - - - - - - cil_attribute_positional_argument - 0 - - - attribute_id - 0 - - - index - 0 - - - value - 0 - - - - - attribute_id - index - - - 12 - - - - - - attribute_id - value - - - 12 - - - - - - index - attribute_id - - - 12 - - - - - - index - value - - - 12 - - - - - - value - attribute_id - - - 12 - - - - - - value - index - - - 12 - - - - - - - - metadata_handle - 47748481 - - - entity - 46753394 - - - location - 11316 - - - handle - 2013773 - - - - - entity - location - - - 12 - - - 1 - 2 - 46105352 - - - 2 - 551 - 648041 - - - - - - - entity - handle - - - 12 - - - 1 - 2 - 46140083 - - - 2 - 124 - 613310 - - - - - - - location - entity - - - 12 - - - 1 - 2 - 2201 - - - 2 - 77 - 864 - - - 78 - 189 - 864 - - - 194 - 346 - 864 - - - 356 - 558 - 864 - - - 566 - 910 - 864 - - - 917 - 1459 - 864 - - - 1476 - 2465 - 864 - - - 2493 - 3983 - 864 - - - 4037 - 7491 - 864 - - - 7549 - 28482 - 864 - - - 29128 - 92959 - 473 - - - - - - - location - handle - - - 12 - - - 1 - 2 - 2201 - - - 2 - 77 - 864 - - - 78 - 189 - 864 - - - 194 - 346 - 864 - - - 356 - 558 - 864 - - - 566 - 910 - 864 - - - 917 - 1459 - 864 - - - 1476 - 2465 - 864 - - - 2493 - 3983 - 864 - - - 4037 - 7491 - 864 - - - 7549 - 28482 - 864 - - - 29128 - 92959 - 473 - - - - - - - handle - entity - - - 12 - - - 1 - 2 - 285400 - - - 2 - 3 - 118205 - - - 3 - 5 - 172524 - - - 5 - 7 - 143574 - - - 7 - 9 - 149438 - - - 9 - 11 - 99132 - - - 11 - 14 - 182256 - - - 14 - 19 - 159479 - - - 19 - 25 - 178635 - - - 25 - 35 - 152628 - - - 35 - 48 - 152586 - - - 48 - 120 - 151743 - - - 120 - 401 - 68166 - - - - - - - handle - location - - - 12 - - - 1 - 2 - 285380 - - - 2 - 3 - 118205 - - - 3 - 5 - 172524 - - - 5 - 7 - 143574 - - - 7 - 9 - 149438 - - - 9 - 11 - 99132 - - - 11 - 14 - 182256 - - - 14 - 19 - 159479 - - - 19 - 25 - 178635 - - - 25 - 35 - 152628 - - - 35 - 48 - 152586 - - - 48 - 120 - 151722 - - - 120 - 551 - 68207 - - - - - - - - + + diff --git a/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme b/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme new file mode 100644 index 00000000000..21ede72308c --- /dev/null +++ b/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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); + +/** 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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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_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); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..fd04e45710e --- /dev/null +++ b/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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); + +/** 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, params/array = 3, this = 4, in = 5, ref readonly = 6 */ + 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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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_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); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties b/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties new file mode 100644 index 00000000000..51773d6cc81 --- /dev/null +++ b/csharp/ql/lib/upgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties @@ -0,0 +1,2 @@ +description: Extract `ref readonly` parameters as having `mode` 6 in the params table. +compatibility: backwards diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/compiler_generated.ql b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/compiler_generated.ql new file mode 100644 index 00000000000..d732cac6730 --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/compiler_generated.ql @@ -0,0 +1,7 @@ +class Element extends @element { + Element() { expr_compiler_generated(this) or compiler_generated(this) } + + string toString() { none() } +} + +select any(Element e) diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/old.dbscheme b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/old.dbscheme new file mode 100644 index 00000000000..c9ee11bd1ee --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/old.dbscheme @@ -0,0 +1,2100 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..21ede72308c --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/semmlecode.csharp.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 +| 34 = @inline_array_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 | @void_type | @inline_array_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); + +/** 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 +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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_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); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/upgrade.properties b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/upgrade.properties new file mode 100644 index 00000000000..1efc867850c --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/upgrade.properties @@ -0,0 +1,4 @@ +description: Merge `expr_compiler_generated` into `compiler_generated` and add support for compiler generated statements. +compatibility: backwards +compiler_generated.rel: run compiler_generated.qlo +expr_compiler_generated.rel: delete diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 9fe1609363f..46c939e5cee 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.8.10 + +### Minor Analysis Improvements + +* Most data flow queries that track flow from *remote* flow sources now use the current *threat model* configuration instead. This doesn't lead to any changes in the produced alerts (as the default configuration is *remote* flow sources) unless the threat model configuration is changed. The changed queries are `cs/code-injection`, `cs/command-line-injection`, `cs/user-controlled-bypass`, `cs/count-untrusted-data-external-api`, `cs/untrusted-data-to-external-api`, `cs/ldap-injection`, `cs/log-forging`, `cs/xml/missing-validation`, `cs/redos`, `cs/regex-injection`, `cs/resource-injection`, `cs/sql-injection`, `cs/path-injection`, `cs/unsafe-deserialization-untrusted-input`, `cs/web/unvalidated-url-redirection`, `cs/xml/insecure-dtd-handling`, `cs/xml/xpath-injection`, `cs/web/xss`, and `cs/uncontrolled-format-string`. + ## 0.8.9 ### Minor Analysis Improvements diff --git a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql index 4612091743f..2c9ff02349f 100644 --- a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql +++ b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql @@ -91,6 +91,8 @@ class RelevantDefinition extends AssignableDefinition { this = any(Ssa::ExplicitDefinition ssaDef).getADefinition() or mayEscape(v) + or + v.isCaptured() ) } diff --git a/csharp/ql/src/Security Features/CWE-089/SqlInjection.ql b/csharp/ql/src/Security Features/CWE-089/SqlInjection.ql index e3fa7f80bd7..d4d1287561f 100644 --- a/csharp/ql/src/Security Features/CWE-089/SqlInjection.ql +++ b/csharp/ql/src/Security Features/CWE-089/SqlInjection.ql @@ -14,14 +14,9 @@ import csharp import semmle.code.csharp.security.dataflow.SqlInjectionQuery import SqlInjection::PathGraph -import semmle.code.csharp.security.dataflow.flowsources.Remote -import semmle.code.csharp.security.dataflow.flowsources.Local +import semmle.code.csharp.security.dataflow.flowsources.FlowSources -string getSourceType(DataFlow::Node node) { - result = node.(RemoteFlowSource).getSourceType() - or - result = node.(LocalFlowSource).getSourceType() -} +string getSourceType(DataFlow::Node node) { result = node.(SourceNode).getSourceType() } from SqlInjection::PathNode source, SqlInjection::PathNode sink where SqlInjection::flowPath(source, sink) diff --git a/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql b/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql index 7402a45edde..042e2aa9f17 100644 --- a/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql +++ b/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql @@ -12,7 +12,7 @@ */ import csharp -import semmle.code.csharp.security.dataflow.flowsources.Remote +import semmle.code.csharp.security.dataflow.flowsources.FlowSources import semmle.code.csharp.frameworks.system.Xml import XmlInjection::PathGraph @@ -20,7 +20,7 @@ import XmlInjection::PathGraph * A taint-tracking configuration for untrusted user input used in XML. */ module XmlInjectionConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource } predicate isSink(DataFlow::Node sink) { exists(MethodCall mc | diff --git a/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql b/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql index daaaba7517d..a6150b53798 100644 --- a/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql +++ b/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.ql @@ -13,7 +13,7 @@ */ import csharp -import semmle.code.csharp.security.dataflow.flowsources.Remote +import semmle.code.csharp.security.dataflow.flowsources.FlowSources import semmle.code.csharp.commons.Util import AssemblyPathInjection::PathGraph @@ -22,7 +22,7 @@ import AssemblyPathInjection::PathGraph */ module AssemblyPathInjectionConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { - source instanceof RemoteFlowSource or + source instanceof ThreatModelFlowSource or source.asExpr() = any(MainMethod main).getParameter(0).getAnAccess() } diff --git a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql index e8b9aa0a53f..657fdd0e183 100644 --- a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql +++ b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql @@ -12,16 +12,13 @@ */ import csharp -import semmle.code.csharp.security.dataflow.flowsources.Remote -import semmle.code.csharp.security.dataflow.flowsources.Local +import semmle.code.csharp.security.dataflow.flowsources.FlowSources import semmle.code.csharp.frameworks.Format import FormatString::PathGraph module FormatStringConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { - source instanceof RemoteFlowSource - or - source instanceof LocalFlowSource + source instanceof ThreatModelFlowSource or source instanceof LocalFlowSource } predicate isSink(DataFlow::Node sink) { @@ -31,11 +28,7 @@ module FormatStringConfig implements DataFlow::ConfigSig { module FormatString = TaintTracking::Global; -string getSourceType(DataFlow::Node node) { - result = node.(RemoteFlowSource).getSourceType() - or - result = node.(LocalFlowSource).getSourceType() -} +string getSourceType(DataFlow::Node node) { result = node.(SourceNode).getSourceType() } from FormatString::PathNode source, FormatString::PathNode sink where FormatString::flowPath(source, sink) diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql index c7a5579cf33..ad5c0a71227 100644 --- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql +++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql @@ -15,6 +15,12 @@ import csharp import semmle.code.csharp.security.dataflow.UnsafeDeserializationQuery import Flow::PathGraph +bindingset[e1, e2] +pragma[inline_late] +private predicate sameParent(DataFlow::Node e1, DataFlow::Node e2) { + e1.asExpr().getParent() = e2.asExpr().getParent() +} + module Flow = DataFlow::MergePathGraph3; -/** A source of remote user input. */ -class RemoteSource extends Source instanceof RemoteFlowSource { } +/** + * DEPRECATED: Use `ThreatModelSource` instead. + * + * A source of remote user input. + */ +deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } + +/** A source supported by the current threat model. */ +class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * A path argument to a `WebClient` method call that has an address argument. diff --git a/csharp/ql/src/experimental/CWE-918/RequestForgery.qll b/csharp/ql/src/experimental/CWE-918/RequestForgery.qll index 29d4fa9094b..e1c6875d952 100644 --- a/csharp/ql/src/experimental/CWE-918/RequestForgery.qll +++ b/csharp/ql/src/experimental/CWE-918/RequestForgery.qll @@ -5,7 +5,7 @@ module RequestForgery { import semmle.code.csharp.frameworks.System import semmle.code.csharp.frameworks.system.Web import semmle.code.csharp.frameworks.Format - import semmle.code.csharp.security.dataflow.flowsources.Remote + import semmle.code.csharp.security.dataflow.flowsources.FlowSources /** * A data flow source for server side request forgery vulnerabilities. @@ -91,10 +91,9 @@ module RequestForgery { module RequestForgeryFlow = DataFlow::Global; /** - * A remote data flow source taken as a source - * for Server Side Request Forgery(SSRF) Vulnerabilities. + * A dataflow source for Server Side Request Forgery(SSRF) Vulnerabilities. */ - private class RemoteFlowSourceAsSource extends Source instanceof RemoteFlowSource { } + private class ThreatModelSource extends Source instanceof ThreatModelFlowSource { } /** * An url argument to a `HttpRequestMessage` constructor call diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 1d03699a20f..46384094b19 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.8.9 +version: 0.8.10 groups: - csharp - queries diff --git a/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected b/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected index f3c1a8ed6c5..2886fe7af7d 100644 --- a/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected +++ b/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected @@ -1,17 +1,23 @@ edges -| HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | HashWithoutSalt.cs:20:49:20:56 | access to local variable passBuff | provenance | | +| HashWithoutSalt.cs:18:17:18:24 | access to local variable passBuff : IBuffer | HashWithoutSalt.cs:20:49:20:56 | access to local variable passBuff | provenance | | +| HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | HashWithoutSalt.cs:18:17:18:24 | access to local variable passBuff : IBuffer | provenance | | | HashWithoutSalt.cs:18:70:18:77 | access to parameter password : String | HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | provenance | | -| HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:39:51:39:59 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:38:16:38:24 | access to local variable passBytes : Byte[] | HashWithoutSalt.cs:39:51:39:59 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:38:16:38:24 | access to local variable passBytes : Byte[] | provenance | | | HashWithoutSalt.cs:38:64:38:71 | access to parameter password : String | HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | provenance | | -| HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:71:48:71:56 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:70:16:70:24 | access to local variable passBytes : Byte[] | HashWithoutSalt.cs:71:48:71:56 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:70:16:70:24 | access to local variable passBytes : Byte[] | provenance | | | HashWithoutSalt.cs:70:64:70:71 | access to parameter password : String | HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | provenance | | nodes +| HashWithoutSalt.cs:18:17:18:24 | access to local variable passBuff : IBuffer | semmle.label | access to local variable passBuff : IBuffer | | HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | semmle.label | call to method ConvertStringToBinary : IBuffer | | HashWithoutSalt.cs:18:70:18:77 | access to parameter password : String | semmle.label | access to parameter password : String | | HashWithoutSalt.cs:20:49:20:56 | access to local variable passBuff | semmle.label | access to local variable passBuff | +| HashWithoutSalt.cs:38:16:38:24 | access to local variable passBytes : Byte[] | semmle.label | access to local variable passBytes : Byte[] | | HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | | HashWithoutSalt.cs:38:64:38:71 | access to parameter password : String | semmle.label | access to parameter password : String | | HashWithoutSalt.cs:39:51:39:59 | access to local variable passBytes | semmle.label | access to local variable passBytes | +| HashWithoutSalt.cs:70:16:70:24 | access to local variable passBytes : Byte[] | semmle.label | access to local variable passBytes : Byte[] | | HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | | HashWithoutSalt.cs:70:64:70:71 | access to parameter password : String | semmle.label | access to parameter password : String | | HashWithoutSalt.cs:71:48:71:56 | access to local variable passBytes | semmle.label | access to local variable passBytes | diff --git a/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected b/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected index 812e1751048..3a2f86910fe 100644 --- a/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected +++ b/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected @@ -1,4 +1,5 @@ nodes +| test.cs:69:18:69:30 | access to local variable lastWriteTime : DateTime | semmle.label | access to local variable lastWriteTime : DateTime | | test.cs:69:34:69:76 | call to method GetLastWriteTime : DateTime | semmle.label | call to method GetLastWriteTime : DateTime | | test.cs:71:13:71:71 | call to method CompareTo | semmle.label | call to method CompareTo | | test.cs:71:13:71:71 | call to method CompareTo : Int32 | semmle.label | call to method CompareTo : Int32 | @@ -7,7 +8,8 @@ nodes | test.cs:71:36:71:70 | call to method AddHours | semmle.label | call to method AddHours | subpaths edges -| test.cs:69:34:69:76 | call to method GetLastWriteTime : DateTime | test.cs:71:36:71:48 | access to local variable lastWriteTime | provenance | | +| test.cs:69:18:69:30 | access to local variable lastWriteTime : DateTime | test.cs:71:36:71:48 | access to local variable lastWriteTime | provenance | | +| test.cs:69:34:69:76 | call to method GetLastWriteTime : DateTime | test.cs:69:18:69:30 | access to local variable lastWriteTime : DateTime | provenance | | | test.cs:71:13:71:71 | call to method CompareTo : Int32 | test.cs:71:13:71:76 | ... >= ... | provenance | | | test.cs:71:36:71:48 | access to local variable lastWriteTime | test.cs:71:13:71:71 | call to method CompareTo | provenance | | | test.cs:71:36:71:48 | access to local variable lastWriteTime | test.cs:71:13:71:71 | call to method CompareTo : Int32 | provenance | | diff --git a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected index dc7bc9330d9..aef0c30408b 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected @@ -23,89 +23,91 @@ arguments | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 3 | Assembly1.dll:0:0:0:0 | (...) ... | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 4 | Assembly1.dll:0:0:0:0 | array creation of type Int32[] | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 5 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | -| attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:10:26:10:45 | "C# attributes test" | -| attributes.cs:11:12:11:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:11:32:11:56 | "A test of C# attributes" | -| attributes.cs:12:12:12:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:12:34:12:35 | "" | -| attributes.cs:13:12:13:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:13:28:13:39 | "Semmle Plc" | -| attributes.cs:14:12:14:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:14:28:14:34 | "Odasa" | -| attributes.cs:15:12:15:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:15:30:15:54 | "Copyright \u00a9 Semmle 2018" | -| attributes.cs:16:12:16:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:16:30:16:31 | "" | -| attributes.cs:17:12:17:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:17:28:17:29 | "" | -| attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:22:23:22:27 | false | -| attributes.cs:25:12:25:15 | [assembly: Guid(...)] | 0 | attributes.cs:25:17:25:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | -| attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:37:28:37:36 | "1.0.0.0" | -| attributes.cs:38:12:38:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:38:32:38:40 | "1.0.0.0" | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 0 | attributes.cs:40:17:40:17 | 0 | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 1 | attributes.cs:40:20:40:46 | array creation of type Object[] | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 2 | attributes.cs:40:49:40:69 | typeof(...) | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 3 | attributes.cs:40:72:40:76 | (...) ... | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 4 | attributes.cs:40:79:40:82 | null | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 5 | attributes.cs:40:92:40:122 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 0 | attributes.cs:41:15:41:15 | 0 | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 1 | attributes.cs:41:18:41:44 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 2 | attributes.cs:41:47:41:67 | typeof(...) | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 3 | attributes.cs:41:70:41:74 | (...) ... | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 4 | attributes.cs:41:77:41:80 | null | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 5 | attributes.cs:41:90:41:120 | array creation of type Object[] | -| attributes.cs:43:2:43:22 | [AttributeUsage(...)] | 0 | attributes.cs:43:24:43:50 | access to constant All | -| attributes.cs:46:6:46:16 | [Conditional(...)] | 0 | attributes.cs:46:18:46:25 | "DEBUG2" | -| attributes.cs:54:6:54:16 | [My(...)] | 0 | attributes.cs:54:18:54:22 | false | -| attributes.cs:57:6:57:16 | [My(...)] | 0 | attributes.cs:57:18:57:21 | true | -| attributes.cs:57:6:57:16 | [My(...)] | 1 | attributes.cs:57:28:57:29 | "" | -| attributes.cs:57:6:57:16 | [My(...)] | 2 | attributes.cs:57:36:57:36 | 0 | -| attributes.cs:58:6:58:8 | [My2(...)] | 0 | attributes.cs:58:28:58:32 | false | -| attributes.cs:58:6:58:8 | [My2(...)] | 1 | attributes.cs:58:13:58:16 | true | -| attributes.cs:58:6:58:8 | [My2(...)] | 2 | attributes.cs:58:6:58:8 | 12 | -| attributes.cs:58:6:58:8 | [My2(...)] | 3 | attributes.cs:58:22:58:22 | 1 | -| attributes.cs:58:6:58:8 | [My2(...)] | 4 | attributes.cs:58:39:58:40 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | 0 | attributes.cs:77:7:77:8 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | 1 | attributes.cs:77:11:77:14 | null | -| attributes.cs:77:2:77:5 | [Args(...)] | 2 | attributes.cs:77:17:77:25 | typeof(...) | -| attributes.cs:77:2:77:5 | [Args(...)] | 3 | attributes.cs:77:28:77:30 | access to constant A | -| attributes.cs:77:2:77:5 | [Args(...)] | 4 | attributes.cs:77:33:77:53 | array creation of type Int32[] | -| attributes.cs:77:2:77:5 | [Args(...)] | 5 | attributes.cs:77:63:77:93 | array creation of type Object[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 0 | attributes.cs:80:11:80:16 | ... + ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 1 | attributes.cs:80:19:80:39 | array creation of type Int32[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 2 | attributes.cs:80:42:80:45 | null | -| attributes.cs:80:6:80:9 | [Args(...)] | 3 | attributes.cs:80:48:80:52 | (...) ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 4 | attributes.cs:80:55:80:58 | null | -| attributes.cs:80:6:80:9 | [Args(...)] | 5 | attributes.cs:80:68:80:98 | array creation of type Object[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 0 | attributes.cs:81:19:81:24 | ... + ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 1 | attributes.cs:81:27:81:47 | array creation of type Int32[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 2 | attributes.cs:81:50:81:53 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 3 | attributes.cs:81:56:81:60 | (...) ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 4 | attributes.cs:81:63:81:66 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 5 | attributes.cs:81:76:81:106 | array creation of type Object[] | -| attributes.cs:96:2:96:13 | [My3(...)] | 0 | attributes.cs:96:15:96:15 | 1 | -| attributes.cs:97:10:97:21 | [return: My3(...)] | 0 | attributes.cs:97:23:97:23 | 2 | -| attributes.cs:100:10:100:21 | [return: My3(...)] | 0 | attributes.cs:100:23:100:23 | 3 | -| attributes.cs:101:8:101:19 | [My3(...)] | 0 | attributes.cs:101:21:101:21 | 4 | -| attributes.cs:106:6:106:17 | [My3(...)] | 0 | attributes.cs:106:19:106:19 | 5 | -| attributes.cs:107:14:107:25 | [return: My3(...)] | 0 | attributes.cs:107:27:107:27 | 6 | -| attributes.cs:112:10:112:21 | [My3(...)] | 0 | attributes.cs:112:23:112:23 | 7 | -| attributes.cs:113:18:113:29 | [return: My3(...)] | 0 | attributes.cs:113:31:113:31 | 8 | -| attributes.cs:116:18:116:29 | [My3(...)] | 0 | attributes.cs:116:31:116:31 | 9 | -| attributes.cs:117:17:117:28 | [My3(...)] | 0 | attributes.cs:117:30:117:31 | 10 | -| attributes.cs:124:18:124:29 | [My3(...)] | 0 | attributes.cs:124:31:124:32 | 11 | -| attributes.cs:125:18:125:29 | [return: My3(...)] | 0 | attributes.cs:125:31:125:32 | 12 | -| attributes.cs:128:10:128:21 | [My3(...)] | 0 | attributes.cs:128:23:128:24 | 13 | -| attributes.cs:129:17:129:28 | [My3(...)] | 0 | attributes.cs:129:30:129:31 | 14 | -| attributes.cs:141:6:141:11 | [Params(...)] | 0 | attributes.cs:141:13:141:15 | "a" | -| attributes.cs:141:6:141:11 | [Params(...)] | 1 | attributes.cs:141:18:141:20 | "b" | -| attributes.cs:141:6:141:11 | [Params(...)] | 2 | attributes.cs:141:23:141:23 | 1 | -| attributes.cs:141:6:141:11 | [Params(...)] | 3 | attributes.cs:141:26:141:26 | 2 | -| attributes.cs:141:6:141:11 | [Params(...)] | 4 | attributes.cs:141:29:141:29 | 3 | -| attributes.cs:144:6:144:11 | [Params(...)] | 0 | attributes.cs:144:17:144:19 | "a" | -| attributes.cs:144:6:144:11 | [Params(...)] | 1 | attributes.cs:144:26:144:28 | "b" | -| attributes.cs:144:6:144:11 | [Params(...)] | 2 | attributes.cs:144:31:144:31 | 1 | -| attributes.cs:144:6:144:11 | [Params(...)] | 3 | attributes.cs:144:34:144:34 | 2 | -| attributes.cs:144:6:144:11 | [Params(...)] | 4 | attributes.cs:144:37:144:37 | 3 | -| attributes.cs:147:6:147:11 | [Params(...)] | 0 | attributes.cs:147:35:147:37 | "a" | -| attributes.cs:147:6:147:11 | [Params(...)] | 1 | attributes.cs:147:26:147:28 | "b" | -| attributes.cs:147:6:147:11 | [Params(...)] | 2 | attributes.cs:147:19:147:19 | 1 | -| attributes.cs:150:6:150:11 | [Params(...)] | 0 | attributes.cs:150:45:150:47 | "a" | -| attributes.cs:150:6:150:11 | [Params(...)] | 1 | attributes.cs:150:36:150:38 | "b" | -| attributes.cs:150:6:150:11 | [Params(...)] | 2 | attributes.cs:150:19:150:29 | array creation of type Int32[] | +| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:11:26:11:45 | "C# attributes test" | +| attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:12:32:12:56 | "A test of C# attributes" | +| attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:13:34:13:35 | "" | +| attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:14:28:14:39 | "Semmle Plc" | +| attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:15:28:15:34 | "Odasa" | +| attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:16:30:16:54 | "Copyright \u00a9 Semmle 2018" | +| attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:17:30:17:31 | "" | +| attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:18:28:18:29 | "" | +| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:23:23:23:27 | false | +| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | 0 | attributes.cs:26:17:26:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | +| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:38:28:38:36 | "1.0.0.0" | +| attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:39:32:39:40 | "1.0.0.0" | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 0 | attributes.cs:41:17:41:17 | 0 | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 1 | attributes.cs:41:20:41:46 | array creation of type Object[] | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 2 | attributes.cs:41:49:41:69 | typeof(...) | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 3 | attributes.cs:41:72:41:76 | (...) ... | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 4 | attributes.cs:41:79:41:82 | null | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 5 | attributes.cs:41:92:41:122 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 0 | attributes.cs:42:15:42:15 | 0 | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 1 | attributes.cs:42:18:42:44 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 2 | attributes.cs:42:47:42:67 | typeof(...) | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 3 | attributes.cs:42:70:42:74 | (...) ... | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 4 | attributes.cs:42:77:42:80 | null | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 5 | attributes.cs:42:90:42:120 | array creation of type Object[] | +| attributes.cs:44:2:44:22 | [AttributeUsage(...)] | 0 | attributes.cs:44:24:44:50 | access to constant All | +| attributes.cs:47:6:47:16 | [Conditional(...)] | 0 | attributes.cs:47:18:47:25 | "DEBUG2" | +| attributes.cs:55:6:55:16 | [My(...)] | 0 | attributes.cs:55:18:55:22 | false | +| attributes.cs:58:6:58:16 | [My(...)] | 0 | attributes.cs:58:18:58:21 | true | +| attributes.cs:58:6:58:16 | [My(...)] | 1 | attributes.cs:58:28:58:29 | "" | +| attributes.cs:58:6:58:16 | [My(...)] | 2 | attributes.cs:58:36:58:36 | 0 | +| attributes.cs:59:6:59:8 | [My2(...)] | 0 | attributes.cs:59:28:59:32 | false | +| attributes.cs:59:6:59:8 | [My2(...)] | 1 | attributes.cs:59:13:59:16 | true | +| attributes.cs:59:6:59:8 | [My2(...)] | 2 | attributes.cs:59:6:59:8 | 12 | +| attributes.cs:59:6:59:8 | [My2(...)] | 3 | attributes.cs:59:22:59:22 | 1 | +| attributes.cs:59:6:59:8 | [My2(...)] | 4 | attributes.cs:59:39:59:40 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | 0 | attributes.cs:78:7:78:8 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | 1 | attributes.cs:78:11:78:14 | null | +| attributes.cs:78:2:78:5 | [Args(...)] | 2 | attributes.cs:78:17:78:25 | typeof(...) | +| attributes.cs:78:2:78:5 | [Args(...)] | 3 | attributes.cs:78:28:78:30 | access to constant A | +| attributes.cs:78:2:78:5 | [Args(...)] | 4 | attributes.cs:78:33:78:53 | array creation of type Int32[] | +| attributes.cs:78:2:78:5 | [Args(...)] | 5 | attributes.cs:78:63:78:93 | array creation of type Object[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 0 | attributes.cs:81:11:81:16 | ... + ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 1 | attributes.cs:81:19:81:39 | array creation of type Int32[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 2 | attributes.cs:81:42:81:45 | null | +| attributes.cs:81:6:81:9 | [Args(...)] | 3 | attributes.cs:81:48:81:52 | (...) ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 4 | attributes.cs:81:55:81:58 | null | +| attributes.cs:81:6:81:9 | [Args(...)] | 5 | attributes.cs:81:68:81:98 | array creation of type Object[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 0 | attributes.cs:82:19:82:24 | ... + ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 1 | attributes.cs:82:27:82:47 | array creation of type Int32[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 2 | attributes.cs:82:50:82:53 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 3 | attributes.cs:82:56:82:60 | (...) ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 4 | attributes.cs:82:63:82:66 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 5 | attributes.cs:82:76:82:106 | array creation of type Object[] | +| attributes.cs:97:2:97:13 | [My3(...)] | 0 | attributes.cs:97:15:97:15 | 1 | +| attributes.cs:98:10:98:21 | [return: My3(...)] | 0 | attributes.cs:98:23:98:23 | 2 | +| attributes.cs:101:10:101:21 | [return: My3(...)] | 0 | attributes.cs:101:23:101:23 | 3 | +| attributes.cs:102:8:102:19 | [My3(...)] | 0 | attributes.cs:102:21:102:21 | 4 | +| attributes.cs:107:6:107:17 | [My3(...)] | 0 | attributes.cs:107:19:107:19 | 5 | +| attributes.cs:108:14:108:25 | [return: My3(...)] | 0 | attributes.cs:108:27:108:27 | 6 | +| attributes.cs:113:10:113:21 | [My3(...)] | 0 | attributes.cs:113:23:113:23 | 7 | +| attributes.cs:114:18:114:29 | [return: My3(...)] | 0 | attributes.cs:114:31:114:31 | 8 | +| attributes.cs:117:18:117:29 | [My3(...)] | 0 | attributes.cs:117:31:117:31 | 9 | +| attributes.cs:118:17:118:28 | [My3(...)] | 0 | attributes.cs:118:30:118:31 | 10 | +| attributes.cs:125:18:125:29 | [My3(...)] | 0 | attributes.cs:125:31:125:32 | 11 | +| attributes.cs:126:18:126:29 | [return: My3(...)] | 0 | attributes.cs:126:31:126:32 | 12 | +| attributes.cs:129:10:129:21 | [My3(...)] | 0 | attributes.cs:129:23:129:24 | 13 | +| attributes.cs:130:17:130:28 | [My3(...)] | 0 | attributes.cs:130:30:130:31 | 14 | +| attributes.cs:142:6:142:11 | [Params(...)] | 0 | attributes.cs:142:13:142:15 | "a" | +| attributes.cs:142:6:142:11 | [Params(...)] | 1 | attributes.cs:142:18:142:20 | "b" | +| attributes.cs:142:6:142:11 | [Params(...)] | 2 | attributes.cs:142:23:142:23 | 1 | +| attributes.cs:142:6:142:11 | [Params(...)] | 3 | attributes.cs:142:26:142:26 | 2 | +| attributes.cs:142:6:142:11 | [Params(...)] | 4 | attributes.cs:142:29:142:29 | 3 | +| attributes.cs:145:6:145:11 | [Params(...)] | 0 | attributes.cs:145:17:145:19 | "a" | +| attributes.cs:145:6:145:11 | [Params(...)] | 1 | attributes.cs:145:26:145:28 | "b" | +| attributes.cs:145:6:145:11 | [Params(...)] | 2 | attributes.cs:145:31:145:31 | 1 | +| attributes.cs:145:6:145:11 | [Params(...)] | 3 | attributes.cs:145:34:145:34 | 2 | +| attributes.cs:145:6:145:11 | [Params(...)] | 4 | attributes.cs:145:37:145:37 | 3 | +| attributes.cs:148:6:148:11 | [Params(...)] | 0 | attributes.cs:148:35:148:37 | "a" | +| attributes.cs:148:6:148:11 | [Params(...)] | 1 | attributes.cs:148:26:148:28 | "b" | +| attributes.cs:148:6:148:11 | [Params(...)] | 2 | attributes.cs:148:19:148:19 | 1 | +| attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | +| attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | +| attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | +| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:37 | "MyExperimentalClassId" | +| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:42 | "MyExperimentalMethodId" | constructorArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 1 | | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 3 | @@ -127,91 +129,93 @@ constructorArguments | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 2 | Assembly1.dll:0:0:0:0 | null | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 3 | Assembly1.dll:0:0:0:0 | (...) ... | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 4 | Assembly1.dll:0:0:0:0 | array creation of type Int32[] | -| attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:10:26:10:45 | "C# attributes test" | -| attributes.cs:11:12:11:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:11:32:11:56 | "A test of C# attributes" | -| attributes.cs:12:12:12:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:12:34:12:35 | "" | -| attributes.cs:13:12:13:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:13:28:13:39 | "Semmle Plc" | -| attributes.cs:14:12:14:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:14:28:14:34 | "Odasa" | -| attributes.cs:15:12:15:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:15:30:15:54 | "Copyright \u00a9 Semmle 2018" | -| attributes.cs:16:12:16:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:16:30:16:31 | "" | -| attributes.cs:17:12:17:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:17:28:17:29 | "" | -| attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:22:23:22:27 | false | -| attributes.cs:25:12:25:15 | [assembly: Guid(...)] | 0 | attributes.cs:25:17:25:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | -| attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:37:28:37:36 | "1.0.0.0" | -| attributes.cs:38:12:38:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:38:32:38:40 | "1.0.0.0" | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 0 | attributes.cs:40:17:40:17 | 0 | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 1 | attributes.cs:40:20:40:46 | array creation of type Object[] | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 2 | attributes.cs:40:49:40:69 | typeof(...) | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 3 | attributes.cs:40:72:40:76 | (...) ... | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 4 | attributes.cs:40:79:40:82 | null | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 0 | attributes.cs:41:15:41:15 | 0 | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 1 | attributes.cs:41:18:41:44 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 2 | attributes.cs:41:47:41:67 | typeof(...) | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 3 | attributes.cs:41:70:41:74 | (...) ... | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 4 | attributes.cs:41:77:41:80 | null | -| attributes.cs:43:2:43:22 | [AttributeUsage(...)] | 0 | attributes.cs:43:24:43:50 | access to constant All | -| attributes.cs:46:6:46:16 | [Conditional(...)] | 0 | attributes.cs:46:18:46:25 | "DEBUG2" | -| attributes.cs:54:6:54:16 | [My(...)] | 0 | attributes.cs:54:18:54:22 | false | -| attributes.cs:57:6:57:16 | [My(...)] | 0 | attributes.cs:57:18:57:21 | true | -| attributes.cs:58:6:58:8 | [My2(...)] | 0 | attributes.cs:58:28:58:32 | false | -| attributes.cs:58:6:58:8 | [My2(...)] | 1 | attributes.cs:58:13:58:16 | true | -| attributes.cs:58:6:58:8 | [My2(...)] | 2 | attributes.cs:58:6:58:8 | 12 | -| attributes.cs:58:6:58:8 | [My2(...)] | 3 | attributes.cs:58:22:58:22 | 1 | -| attributes.cs:77:2:77:5 | [Args(...)] | 0 | attributes.cs:77:7:77:8 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | 1 | attributes.cs:77:11:77:14 | null | -| attributes.cs:77:2:77:5 | [Args(...)] | 2 | attributes.cs:77:17:77:25 | typeof(...) | -| attributes.cs:77:2:77:5 | [Args(...)] | 3 | attributes.cs:77:28:77:30 | access to constant A | -| attributes.cs:77:2:77:5 | [Args(...)] | 4 | attributes.cs:77:33:77:53 | array creation of type Int32[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 0 | attributes.cs:80:11:80:16 | ... + ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 1 | attributes.cs:80:19:80:39 | array creation of type Int32[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 2 | attributes.cs:80:42:80:45 | null | -| attributes.cs:80:6:80:9 | [Args(...)] | 3 | attributes.cs:80:48:80:52 | (...) ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 4 | attributes.cs:80:55:80:58 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 0 | attributes.cs:81:19:81:24 | ... + ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 1 | attributes.cs:81:27:81:47 | array creation of type Int32[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 2 | attributes.cs:81:50:81:53 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 3 | attributes.cs:81:56:81:60 | (...) ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 4 | attributes.cs:81:63:81:66 | null | -| attributes.cs:96:2:96:13 | [My3(...)] | 0 | attributes.cs:96:15:96:15 | 1 | -| attributes.cs:97:10:97:21 | [return: My3(...)] | 0 | attributes.cs:97:23:97:23 | 2 | -| attributes.cs:100:10:100:21 | [return: My3(...)] | 0 | attributes.cs:100:23:100:23 | 3 | -| attributes.cs:101:8:101:19 | [My3(...)] | 0 | attributes.cs:101:21:101:21 | 4 | -| attributes.cs:106:6:106:17 | [My3(...)] | 0 | attributes.cs:106:19:106:19 | 5 | -| attributes.cs:107:14:107:25 | [return: My3(...)] | 0 | attributes.cs:107:27:107:27 | 6 | -| attributes.cs:112:10:112:21 | [My3(...)] | 0 | attributes.cs:112:23:112:23 | 7 | -| attributes.cs:113:18:113:29 | [return: My3(...)] | 0 | attributes.cs:113:31:113:31 | 8 | -| attributes.cs:116:18:116:29 | [My3(...)] | 0 | attributes.cs:116:31:116:31 | 9 | -| attributes.cs:117:17:117:28 | [My3(...)] | 0 | attributes.cs:117:30:117:31 | 10 | -| attributes.cs:124:18:124:29 | [My3(...)] | 0 | attributes.cs:124:31:124:32 | 11 | -| attributes.cs:125:18:125:29 | [return: My3(...)] | 0 | attributes.cs:125:31:125:32 | 12 | -| attributes.cs:128:10:128:21 | [My3(...)] | 0 | attributes.cs:128:23:128:24 | 13 | -| attributes.cs:129:17:129:28 | [My3(...)] | 0 | attributes.cs:129:30:129:31 | 14 | -| attributes.cs:141:6:141:11 | [Params(...)] | 0 | attributes.cs:141:13:141:15 | "a" | -| attributes.cs:141:6:141:11 | [Params(...)] | 1 | attributes.cs:141:18:141:20 | "b" | -| attributes.cs:141:6:141:11 | [Params(...)] | 2 | attributes.cs:141:23:141:23 | 1 | -| attributes.cs:141:6:141:11 | [Params(...)] | 3 | attributes.cs:141:26:141:26 | 2 | -| attributes.cs:141:6:141:11 | [Params(...)] | 4 | attributes.cs:141:29:141:29 | 3 | -| attributes.cs:144:6:144:11 | [Params(...)] | 0 | attributes.cs:144:17:144:19 | "a" | -| attributes.cs:144:6:144:11 | [Params(...)] | 1 | attributes.cs:144:26:144:28 | "b" | -| attributes.cs:144:6:144:11 | [Params(...)] | 2 | attributes.cs:144:31:144:31 | 1 | -| attributes.cs:144:6:144:11 | [Params(...)] | 3 | attributes.cs:144:34:144:34 | 2 | -| attributes.cs:144:6:144:11 | [Params(...)] | 4 | attributes.cs:144:37:144:37 | 3 | -| attributes.cs:147:6:147:11 | [Params(...)] | 0 | attributes.cs:147:35:147:37 | "a" | -| attributes.cs:147:6:147:11 | [Params(...)] | 1 | attributes.cs:147:26:147:28 | "b" | -| attributes.cs:147:6:147:11 | [Params(...)] | 2 | attributes.cs:147:19:147:19 | 1 | -| attributes.cs:150:6:150:11 | [Params(...)] | 0 | attributes.cs:150:45:150:47 | "a" | -| attributes.cs:150:6:150:11 | [Params(...)] | 1 | attributes.cs:150:36:150:38 | "b" | -| attributes.cs:150:6:150:11 | [Params(...)] | 2 | attributes.cs:150:19:150:29 | array creation of type Int32[] | +| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:11:26:11:45 | "C# attributes test" | +| attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:12:32:12:56 | "A test of C# attributes" | +| attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:13:34:13:35 | "" | +| attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:14:28:14:39 | "Semmle Plc" | +| attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:15:28:15:34 | "Odasa" | +| attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:16:30:16:54 | "Copyright \u00a9 Semmle 2018" | +| attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:17:30:17:31 | "" | +| attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:18:28:18:29 | "" | +| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:23:23:23:27 | false | +| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | 0 | attributes.cs:26:17:26:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | +| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:38:28:38:36 | "1.0.0.0" | +| attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:39:32:39:40 | "1.0.0.0" | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 0 | attributes.cs:41:17:41:17 | 0 | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 1 | attributes.cs:41:20:41:46 | array creation of type Object[] | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 2 | attributes.cs:41:49:41:69 | typeof(...) | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 3 | attributes.cs:41:72:41:76 | (...) ... | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 4 | attributes.cs:41:79:41:82 | null | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 0 | attributes.cs:42:15:42:15 | 0 | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 1 | attributes.cs:42:18:42:44 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 2 | attributes.cs:42:47:42:67 | typeof(...) | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 3 | attributes.cs:42:70:42:74 | (...) ... | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 4 | attributes.cs:42:77:42:80 | null | +| attributes.cs:44:2:44:22 | [AttributeUsage(...)] | 0 | attributes.cs:44:24:44:50 | access to constant All | +| attributes.cs:47:6:47:16 | [Conditional(...)] | 0 | attributes.cs:47:18:47:25 | "DEBUG2" | +| attributes.cs:55:6:55:16 | [My(...)] | 0 | attributes.cs:55:18:55:22 | false | +| attributes.cs:58:6:58:16 | [My(...)] | 0 | attributes.cs:58:18:58:21 | true | +| attributes.cs:59:6:59:8 | [My2(...)] | 0 | attributes.cs:59:28:59:32 | false | +| attributes.cs:59:6:59:8 | [My2(...)] | 1 | attributes.cs:59:13:59:16 | true | +| attributes.cs:59:6:59:8 | [My2(...)] | 2 | attributes.cs:59:6:59:8 | 12 | +| attributes.cs:59:6:59:8 | [My2(...)] | 3 | attributes.cs:59:22:59:22 | 1 | +| attributes.cs:78:2:78:5 | [Args(...)] | 0 | attributes.cs:78:7:78:8 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | 1 | attributes.cs:78:11:78:14 | null | +| attributes.cs:78:2:78:5 | [Args(...)] | 2 | attributes.cs:78:17:78:25 | typeof(...) | +| attributes.cs:78:2:78:5 | [Args(...)] | 3 | attributes.cs:78:28:78:30 | access to constant A | +| attributes.cs:78:2:78:5 | [Args(...)] | 4 | attributes.cs:78:33:78:53 | array creation of type Int32[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 0 | attributes.cs:81:11:81:16 | ... + ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 1 | attributes.cs:81:19:81:39 | array creation of type Int32[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 2 | attributes.cs:81:42:81:45 | null | +| attributes.cs:81:6:81:9 | [Args(...)] | 3 | attributes.cs:81:48:81:52 | (...) ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 4 | attributes.cs:81:55:81:58 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 0 | attributes.cs:82:19:82:24 | ... + ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 1 | attributes.cs:82:27:82:47 | array creation of type Int32[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 2 | attributes.cs:82:50:82:53 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 3 | attributes.cs:82:56:82:60 | (...) ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 4 | attributes.cs:82:63:82:66 | null | +| attributes.cs:97:2:97:13 | [My3(...)] | 0 | attributes.cs:97:15:97:15 | 1 | +| attributes.cs:98:10:98:21 | [return: My3(...)] | 0 | attributes.cs:98:23:98:23 | 2 | +| attributes.cs:101:10:101:21 | [return: My3(...)] | 0 | attributes.cs:101:23:101:23 | 3 | +| attributes.cs:102:8:102:19 | [My3(...)] | 0 | attributes.cs:102:21:102:21 | 4 | +| attributes.cs:107:6:107:17 | [My3(...)] | 0 | attributes.cs:107:19:107:19 | 5 | +| attributes.cs:108:14:108:25 | [return: My3(...)] | 0 | attributes.cs:108:27:108:27 | 6 | +| attributes.cs:113:10:113:21 | [My3(...)] | 0 | attributes.cs:113:23:113:23 | 7 | +| attributes.cs:114:18:114:29 | [return: My3(...)] | 0 | attributes.cs:114:31:114:31 | 8 | +| attributes.cs:117:18:117:29 | [My3(...)] | 0 | attributes.cs:117:31:117:31 | 9 | +| attributes.cs:118:17:118:28 | [My3(...)] | 0 | attributes.cs:118:30:118:31 | 10 | +| attributes.cs:125:18:125:29 | [My3(...)] | 0 | attributes.cs:125:31:125:32 | 11 | +| attributes.cs:126:18:126:29 | [return: My3(...)] | 0 | attributes.cs:126:31:126:32 | 12 | +| attributes.cs:129:10:129:21 | [My3(...)] | 0 | attributes.cs:129:23:129:24 | 13 | +| attributes.cs:130:17:130:28 | [My3(...)] | 0 | attributes.cs:130:30:130:31 | 14 | +| attributes.cs:142:6:142:11 | [Params(...)] | 0 | attributes.cs:142:13:142:15 | "a" | +| attributes.cs:142:6:142:11 | [Params(...)] | 1 | attributes.cs:142:18:142:20 | "b" | +| attributes.cs:142:6:142:11 | [Params(...)] | 2 | attributes.cs:142:23:142:23 | 1 | +| attributes.cs:142:6:142:11 | [Params(...)] | 3 | attributes.cs:142:26:142:26 | 2 | +| attributes.cs:142:6:142:11 | [Params(...)] | 4 | attributes.cs:142:29:142:29 | 3 | +| attributes.cs:145:6:145:11 | [Params(...)] | 0 | attributes.cs:145:17:145:19 | "a" | +| attributes.cs:145:6:145:11 | [Params(...)] | 1 | attributes.cs:145:26:145:28 | "b" | +| attributes.cs:145:6:145:11 | [Params(...)] | 2 | attributes.cs:145:31:145:31 | 1 | +| attributes.cs:145:6:145:11 | [Params(...)] | 3 | attributes.cs:145:34:145:34 | 2 | +| attributes.cs:145:6:145:11 | [Params(...)] | 4 | attributes.cs:145:37:145:37 | 3 | +| attributes.cs:148:6:148:11 | [Params(...)] | 0 | attributes.cs:148:35:148:37 | "a" | +| attributes.cs:148:6:148:11 | [Params(...)] | 1 | attributes.cs:148:26:148:28 | "b" | +| attributes.cs:148:6:148:11 | [Params(...)] | 2 | attributes.cs:148:19:148:19 | 1 | +| attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | +| attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | +| attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | +| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:37 | "MyExperimentalClassId" | +| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:42 | "MyExperimentalMethodId" | namedArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | Prop | attributes.cs:40:92:40:122 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | Prop | attributes.cs:41:90:41:120 | array creation of type Object[] | -| attributes.cs:57:6:57:16 | [My(...)] | x | attributes.cs:57:36:57:36 | 0 | -| attributes.cs:57:6:57:16 | [My(...)] | y | attributes.cs:57:28:57:29 | "" | -| attributes.cs:58:6:58:8 | [My2(...)] | X | attributes.cs:58:39:58:40 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | Prop | attributes.cs:77:63:77:93 | array creation of type Object[] | -| attributes.cs:80:6:80:9 | [Args(...)] | Prop | attributes.cs:80:68:80:98 | array creation of type Object[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | Prop | attributes.cs:81:76:81:106 | array creation of type Object[] | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | Prop | attributes.cs:41:92:41:122 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | Prop | attributes.cs:42:90:42:120 | array creation of type Object[] | +| attributes.cs:58:6:58:16 | [My(...)] | x | attributes.cs:58:36:58:36 | 0 | +| attributes.cs:58:6:58:16 | [My(...)] | y | attributes.cs:58:28:58:29 | "" | +| attributes.cs:59:6:59:8 | [My2(...)] | X | attributes.cs:59:39:59:40 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | Prop | attributes.cs:78:63:78:93 | array creation of type Object[] | +| attributes.cs:81:6:81:9 | [Args(...)] | Prop | attributes.cs:81:68:81:98 | array creation of type Object[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | Prop | attributes.cs:82:76:82:106 | array creation of type Object[] | diff --git a/csharp/ql/test/library-tests/attributes/AttributeComments.expected b/csharp/ql/test/library-tests/attributes/AttributeComments.expected index 55c71024afe..e1c01d720fd 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeComments.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeComments.expected @@ -1,4 +1,4 @@ -| attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | attributes.cs:7:1:9:31 | // ... | -| attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | attributes.cs:19:1:21:58 | // ... | -| attributes.cs:25:12:25:15 | [assembly: Guid(...)] | attributes.cs:24:1:24:84 | // ... | -| attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | attributes.cs:27:1:36:39 | // ... | +| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | attributes.cs:8:1:10:31 | // ... | +| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | attributes.cs:20:1:22:58 | // ... | +| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | attributes.cs:25:1:25:84 | // ... | +| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | attributes.cs:28:1:37:39 | // ... | diff --git a/csharp/ql/test/library-tests/attributes/AttributeElements.expected b/csharp/ql/test/library-tests/attributes/AttributeElements.expected index 11291a73338..358877e20cf 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeElements.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeElements.expected @@ -9,44 +9,46 @@ | Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [Debuggable(...)] | System.Diagnostics.DebuggableAttribute | | Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [RuntimeCompatibility(...)] | System.Runtime.CompilerServices.RuntimeCompatibilityAttribute | | Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [TargetFramework(...)] | System.Runtime.Versioning.TargetFrameworkAttribute | -| attributes.cs:44:7:44:9 | Foo | attributes.cs:43:2:43:22 | [AttributeUsage(...)] | System.AttributeUsageAttribute | -| attributes.cs:47:17:47:19 | foo | attributes.cs:46:6:46:16 | [Conditional(...)] | System.Diagnostics.ConditionalAttribute | -| attributes.cs:52:23:52:23 | x | attributes.cs:52:14:52:16 | [Foo(...)] | Foo | -| attributes.cs:55:10:55:11 | M1 | attributes.cs:54:6:54:16 | [My(...)] | MyAttribute | -| attributes.cs:59:10:59:11 | M2 | attributes.cs:57:6:57:16 | [My(...)] | MyAttribute | -| attributes.cs:59:10:59:11 | M2 | attributes.cs:58:6:58:8 | [My2(...)] | My2Attribute | -| attributes.cs:78:14:78:14 | X | attributes.cs:77:2:77:5 | [Args(...)] | ArgsAttribute | -| attributes.cs:82:9:82:18 | SomeMethod | attributes.cs:80:6:80:9 | [Args(...)] | ArgsAttribute | -| attributes.cs:82:9:82:18 | SomeMethod | attributes.cs:81:14:81:17 | [return: Args(...)] | ArgsAttribute | -| attributes.cs:98:14:98:24 | Invoke | attributes.cs:97:10:97:21 | [return: My3(...)] | My3Attribute | -| attributes.cs:98:14:98:24 | My1Delegate | attributes.cs:96:2:96:13 | [My3(...)] | My3Attribute | -| attributes.cs:102:17:102:27 | Invoke | attributes.cs:100:10:100:21 | [return: My3(...)] | My3Attribute | -| attributes.cs:102:17:102:27 | My2Delegate | attributes.cs:101:8:101:19 | [My3(...)] | My3Attribute | -| attributes.cs:108:32:108:32 | + | attributes.cs:106:6:106:17 | [My3(...)] | My3Attribute | -| attributes.cs:108:32:108:32 | + | attributes.cs:107:14:107:25 | [return: My3(...)] | My3Attribute | -| attributes.cs:114:9:114:11 | get_Item | attributes.cs:112:10:112:21 | [My3(...)] | My3Attribute | -| attributes.cs:114:9:114:11 | get_Item | attributes.cs:113:18:113:29 | [return: My3(...)] | My3Attribute | -| attributes.cs:118:9:118:11 | set_Item | attributes.cs:116:18:116:29 | [My3(...)] | My3Attribute | -| attributes.cs:118:9:118:11 | value | attributes.cs:117:17:117:28 | [My3(...)] | My3Attribute | -| attributes.cs:126:9:126:11 | get_Prop1 | attributes.cs:124:18:124:29 | [My3(...)] | My3Attribute | -| attributes.cs:126:9:126:11 | get_Prop1 | attributes.cs:125:18:125:29 | [return: My3(...)] | My3Attribute | -| attributes.cs:130:9:130:11 | set_Prop1 | attributes.cs:128:10:128:21 | [My3(...)] | My3Attribute | -| attributes.cs:130:9:130:11 | value | attributes.cs:129:17:129:28 | [My3(...)] | My3Attribute | -| attributes.cs:142:17:142:18 | M1 | attributes.cs:141:6:141:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.cs:145:17:145:18 | M2 | attributes.cs:144:6:144:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.cs:148:17:148:18 | M3 | attributes.cs:147:6:147:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.cs:151:17:151:18 | M4 | attributes.cs:150:6:150:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | System.Reflection.AssemblyTitleAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:11:12:11:30 | [assembly: AssemblyDescription(...)] | System.Reflection.AssemblyDescriptionAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:12:12:12:32 | [assembly: AssemblyConfiguration(...)] | System.Reflection.AssemblyConfigurationAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:13:12:13:26 | [assembly: AssemblyCompany(...)] | System.Reflection.AssemblyCompanyAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:14:12:14:26 | [assembly: AssemblyProduct(...)] | System.Reflection.AssemblyProductAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:15:12:15:28 | [assembly: AssemblyCopyright(...)] | System.Reflection.AssemblyCopyrightAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:16:12:16:28 | [assembly: AssemblyTrademark(...)] | System.Reflection.AssemblyTrademarkAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:17:12:17:26 | [assembly: AssemblyCulture(...)] | System.Reflection.AssemblyCultureAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | System.Runtime.InteropServices.ComVisibleAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:25:12:25:15 | [assembly: Guid(...)] | System.Runtime.InteropServices.GuidAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | System.Reflection.AssemblyVersionAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:38:12:38:30 | [assembly: AssemblyFileVersion(...)] | System.Reflection.AssemblyFileVersionAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:40:12:40:15 | [assembly: Args(...)] | ArgsAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:41:10:41:13 | [module: Args(...)] | ArgsAttribute | +| attributes.cs:45:7:45:9 | Foo | attributes.cs:44:2:44:22 | [AttributeUsage(...)] | System.AttributeUsageAttribute | +| attributes.cs:48:17:48:19 | foo | attributes.cs:47:6:47:16 | [Conditional(...)] | System.Diagnostics.ConditionalAttribute | +| attributes.cs:53:23:53:23 | x | attributes.cs:53:14:53:16 | [Foo(...)] | Foo | +| attributes.cs:56:10:56:11 | M1 | attributes.cs:55:6:55:16 | [My(...)] | MyAttribute | +| attributes.cs:60:10:60:11 | M2 | attributes.cs:58:6:58:16 | [My(...)] | MyAttribute | +| attributes.cs:60:10:60:11 | M2 | attributes.cs:59:6:59:8 | [My2(...)] | My2Attribute | +| attributes.cs:79:14:79:14 | X | attributes.cs:78:2:78:5 | [Args(...)] | ArgsAttribute | +| attributes.cs:83:9:83:18 | SomeMethod | attributes.cs:81:6:81:9 | [Args(...)] | ArgsAttribute | +| attributes.cs:83:9:83:18 | SomeMethod | attributes.cs:82:14:82:17 | [return: Args(...)] | ArgsAttribute | +| attributes.cs:99:14:99:24 | Invoke | attributes.cs:98:10:98:21 | [return: My3(...)] | My3Attribute | +| attributes.cs:99:14:99:24 | My1Delegate | attributes.cs:97:2:97:13 | [My3(...)] | My3Attribute | +| attributes.cs:103:17:103:27 | Invoke | attributes.cs:101:10:101:21 | [return: My3(...)] | My3Attribute | +| attributes.cs:103:17:103:27 | My2Delegate | attributes.cs:102:8:102:19 | [My3(...)] | My3Attribute | +| attributes.cs:109:32:109:32 | + | attributes.cs:107:6:107:17 | [My3(...)] | My3Attribute | +| attributes.cs:109:32:109:32 | + | attributes.cs:108:14:108:25 | [return: My3(...)] | My3Attribute | +| attributes.cs:115:9:115:11 | get_Item | attributes.cs:113:10:113:21 | [My3(...)] | My3Attribute | +| attributes.cs:115:9:115:11 | get_Item | attributes.cs:114:18:114:29 | [return: My3(...)] | My3Attribute | +| attributes.cs:119:9:119:11 | set_Item | attributes.cs:117:18:117:29 | [My3(...)] | My3Attribute | +| attributes.cs:119:9:119:11 | value | attributes.cs:118:17:118:28 | [My3(...)] | My3Attribute | +| attributes.cs:127:9:127:11 | get_Prop1 | attributes.cs:125:18:125:29 | [My3(...)] | My3Attribute | +| attributes.cs:127:9:127:11 | get_Prop1 | attributes.cs:126:18:126:29 | [return: My3(...)] | My3Attribute | +| attributes.cs:131:9:131:11 | set_Prop1 | attributes.cs:129:10:129:21 | [My3(...)] | My3Attribute | +| attributes.cs:131:9:131:11 | value | attributes.cs:130:17:130:28 | [My3(...)] | My3Attribute | +| attributes.cs:143:17:143:18 | M1 | attributes.cs:142:6:142:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:146:17:146:18 | M2 | attributes.cs:145:6:145:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:149:17:149:18 | M3 | attributes.cs:148:6:148:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:152:17:152:18 | M4 | attributes.cs:151:6:151:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:156:14:156:32 | MyExperimentalClass | attributes.cs:155:2:155:13 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute | +| attributes.cs:159:17:159:36 | MyExperimentalMethod | attributes.cs:158:6:158:17 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | System.Reflection.AssemblyTitleAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | System.Reflection.AssemblyDescriptionAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | System.Reflection.AssemblyConfigurationAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | System.Reflection.AssemblyCompanyAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | System.Reflection.AssemblyProductAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | System.Reflection.AssemblyCopyrightAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | System.Reflection.AssemblyTrademarkAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | System.Reflection.AssemblyCultureAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | System.Runtime.InteropServices.ComVisibleAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:26:12:26:15 | [assembly: Guid(...)] | System.Runtime.InteropServices.GuidAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | System.Reflection.AssemblyVersionAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | System.Reflection.AssemblyFileVersionAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:41:12:41:15 | [assembly: Args(...)] | ArgsAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:42:10:42:13 | [module: Args(...)] | ArgsAttribute | diff --git a/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.expected b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.expected new file mode 100644 index 00000000000..dba8c9d047f --- /dev/null +++ b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.expected @@ -0,0 +1,2 @@ +| attributes.cs:156:14:156:32 | MyExperimentalClass | attributes.cs:155:2:155:13 | [Experimental(...)] | MyExperimentalClassId | +| attributes.cs:159:17:159:36 | MyExperimentalMethod | attributes.cs:158:6:158:17 | [Experimental(...)] | MyExperimentalMethodId | diff --git a/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.ql b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.ql new file mode 100644 index 00000000000..5cb058f7e9f --- /dev/null +++ b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.ql @@ -0,0 +1,6 @@ +import csharp +import semmle.code.csharp.frameworks.system.diagnostics.CodeAnalysis + +from Attributable element, ExperimentalAttribute attribute +where attribute = element.getAnAttribute() and attribute.fromSource() +select element, attribute, attribute.getId() diff --git a/csharp/ql/test/library-tests/attributes/PrintAst.expected b/csharp/ql/test/library-tests/attributes/PrintAst.expected index 77be3f7461d..62106d43664 100644 --- a/csharp/ql/test/library-tests/attributes/PrintAst.expected +++ b/csharp/ql/test/library-tests/attributes/PrintAst.expected @@ -1,70 +1,41 @@ attributes.cs: -# 10| [AssemblyAttribute] [assembly: AssemblyTitle(...)] -# 10| -1: [TypeMention] AssemblyTitleAttribute -# 10| 0: [StringLiteralUtf16] "C# attributes test" -# 11| [AssemblyAttribute] [assembly: AssemblyDescription(...)] -# 11| -1: [TypeMention] AssemblyDescriptionAttribute -# 11| 0: [StringLiteralUtf16] "A test of C# attributes" -# 12| [AssemblyAttribute] [assembly: AssemblyConfiguration(...)] -# 12| -1: [TypeMention] AssemblyConfigurationAttribute -# 12| 0: [StringLiteralUtf16] "" -# 13| [AssemblyAttribute] [assembly: AssemblyCompany(...)] -# 13| -1: [TypeMention] AssemblyCompanyAttribute -# 13| 0: [StringLiteralUtf16] "Semmle Plc" -# 14| [AssemblyAttribute] [assembly: AssemblyProduct(...)] -# 14| -1: [TypeMention] AssemblyProductAttribute -# 14| 0: [StringLiteralUtf16] "Odasa" -# 15| [AssemblyAttribute] [assembly: AssemblyCopyright(...)] -# 15| -1: [TypeMention] AssemblyCopyrightAttribute -# 15| 0: [StringLiteralUtf16] "Copyright © Semmle 2018" -# 16| [AssemblyAttribute] [assembly: AssemblyTrademark(...)] -# 16| -1: [TypeMention] AssemblyTrademarkAttribute -# 16| 0: [StringLiteralUtf16] "" -# 17| [AssemblyAttribute] [assembly: AssemblyCulture(...)] -# 17| -1: [TypeMention] AssemblyCultureAttribute +# 11| [AssemblyAttribute] [assembly: AssemblyTitle(...)] +# 11| -1: [TypeMention] AssemblyTitleAttribute +# 11| 0: [StringLiteralUtf16] "C# attributes test" +# 12| [AssemblyAttribute] [assembly: AssemblyDescription(...)] +# 12| -1: [TypeMention] AssemblyDescriptionAttribute +# 12| 0: [StringLiteralUtf16] "A test of C# attributes" +# 13| [AssemblyAttribute] [assembly: AssemblyConfiguration(...)] +# 13| -1: [TypeMention] AssemblyConfigurationAttribute +# 13| 0: [StringLiteralUtf16] "" +# 14| [AssemblyAttribute] [assembly: AssemblyCompany(...)] +# 14| -1: [TypeMention] AssemblyCompanyAttribute +# 14| 0: [StringLiteralUtf16] "Semmle Plc" +# 15| [AssemblyAttribute] [assembly: AssemblyProduct(...)] +# 15| -1: [TypeMention] AssemblyProductAttribute +# 15| 0: [StringLiteralUtf16] "Odasa" +# 16| [AssemblyAttribute] [assembly: AssemblyCopyright(...)] +# 16| -1: [TypeMention] AssemblyCopyrightAttribute +# 16| 0: [StringLiteralUtf16] "Copyright © Semmle 2018" +# 17| [AssemblyAttribute] [assembly: AssemblyTrademark(...)] +# 17| -1: [TypeMention] AssemblyTrademarkAttribute # 17| 0: [StringLiteralUtf16] "" -# 22| [AssemblyAttribute] [assembly: ComVisible(...)] -# 22| -1: [TypeMention] ComVisibleAttribute -# 22| 0: [BoolLiteral] false -# 25| [AssemblyAttribute] [assembly: Guid(...)] -# 25| -1: [TypeMention] GuidAttribute -# 25| 0: [StringLiteralUtf16] "2f70fdd6-14aa-4850-b053-d547adb1f476" -# 37| [AssemblyAttribute] [assembly: AssemblyVersion(...)] -# 37| -1: [TypeMention] AssemblyVersionAttribute -# 37| 0: [StringLiteralUtf16] "1.0.0.0" -# 38| [AssemblyAttribute] [assembly: AssemblyFileVersion(...)] -# 38| -1: [TypeMention] AssemblyFileVersionAttribute +# 18| [AssemblyAttribute] [assembly: AssemblyCulture(...)] +# 18| -1: [TypeMention] AssemblyCultureAttribute +# 18| 0: [StringLiteralUtf16] "" +# 23| [AssemblyAttribute] [assembly: ComVisible(...)] +# 23| -1: [TypeMention] ComVisibleAttribute +# 23| 0: [BoolLiteral] false +# 26| [AssemblyAttribute] [assembly: Guid(...)] +# 26| -1: [TypeMention] GuidAttribute +# 26| 0: [StringLiteralUtf16] "2f70fdd6-14aa-4850-b053-d547adb1f476" +# 38| [AssemblyAttribute] [assembly: AssemblyVersion(...)] +# 38| -1: [TypeMention] AssemblyVersionAttribute # 38| 0: [StringLiteralUtf16] "1.0.0.0" -# 40| [AssemblyAttribute] [assembly: Args(...)] -# 40| -1: [TypeMention] ArgsAttribute -# 40| 0: [IntLiteral] 0 -# 40| 1: [ArrayCreation] array creation of type Object[] -# 40| -2: [TypeMention] Object[] -# 40| 1: [TypeMention] object -# 40| -1: [ArrayInitializer] { ..., ... } -# 40| 0: [CastExpr] (...) ... -# 40| 1: [IntLiteral] 1 -# 40| 1: [CastExpr] (...) ... -# 40| 1: [IntLiteral] 2 -# 40| 2: [NullLiteral] null -# 40| 2: [TypeofExpr] typeof(...) -# 40| 0: [TypeAccess] access to type ArgsAttribute -# 40| 0: [TypeMention] ArgsAttribute -# 40| 3: [CastExpr] (...) ... -# 40| 0: [TypeAccess] access to type E -# 40| 0: [TypeMention] E -# 40| 1: [IntLiteral] 12 -# 40| 4: [NullLiteral] null -# 40| 5: [ArrayCreation] array creation of type Object[] -# 40| -2: [TypeMention] Object[] -# 40| 1: [TypeMention] object -# 40| -1: [ArrayInitializer] { ..., ... } -# 40| 0: [CastExpr] (...) ... -# 40| 1: [IntLiteral] 1 -# 40| 1: [TypeofExpr] typeof(...) -# 40| 0: [TypeAccess] access to type Int32 -# 40| 0: [TypeMention] int -# 41| [ModuleAttribute] [module: Args(...)] +# 39| [AssemblyAttribute] [assembly: AssemblyFileVersion(...)] +# 39| -1: [TypeMention] AssemblyFileVersionAttribute +# 39| 0: [StringLiteralUtf16] "1.0.0.0" +# 41| [AssemblyAttribute] [assembly: Args(...)] # 41| -1: [TypeMention] ArgsAttribute # 41| 0: [IntLiteral] 0 # 41| 1: [ArrayCreation] array creation of type Object[] @@ -93,162 +64,164 @@ attributes.cs: # 41| 1: [TypeofExpr] typeof(...) # 41| 0: [TypeAccess] access to type Int32 # 41| 0: [TypeMention] int -# 44| [Class] Foo +# 42| [ModuleAttribute] [module: Args(...)] +# 42| -1: [TypeMention] ArgsAttribute +# 42| 0: [IntLiteral] 0 +# 42| 1: [ArrayCreation] array creation of type Object[] +# 42| -2: [TypeMention] Object[] +# 42| 1: [TypeMention] object +# 42| -1: [ArrayInitializer] { ..., ... } +# 42| 0: [CastExpr] (...) ... +# 42| 1: [IntLiteral] 1 +# 42| 1: [CastExpr] (...) ... +# 42| 1: [IntLiteral] 2 +# 42| 2: [NullLiteral] null +# 42| 2: [TypeofExpr] typeof(...) +# 42| 0: [TypeAccess] access to type ArgsAttribute +# 42| 0: [TypeMention] ArgsAttribute +# 42| 3: [CastExpr] (...) ... +# 42| 0: [TypeAccess] access to type E +# 42| 0: [TypeMention] E +# 42| 1: [IntLiteral] 12 +# 42| 4: [NullLiteral] null +# 42| 5: [ArrayCreation] array creation of type Object[] +# 42| -2: [TypeMention] Object[] +# 42| 1: [TypeMention] object +# 42| -1: [ArrayInitializer] { ..., ... } +# 42| 0: [CastExpr] (...) ... +# 42| 1: [IntLiteral] 1 +# 42| 1: [TypeofExpr] typeof(...) +# 42| 0: [TypeAccess] access to type Int32 +# 42| 0: [TypeMention] int +# 45| [Class] Foo #-----| 0: (Attributes) -# 43| 1: [DefaultAttribute] [AttributeUsage(...)] -# 43| -1: [TypeMention] AttributeUsageAttribute -# 43| 0: [MemberConstantAccess] access to constant All -# 43| -1: [TypeAccess] access to type AttributeTargets -# 43| 0: [TypeMention] AttributeTargets +# 44| 1: [DefaultAttribute] [AttributeUsage(...)] +# 44| -1: [TypeMention] AttributeUsageAttribute +# 44| 0: [MemberConstantAccess] access to constant All +# 44| -1: [TypeAccess] access to type AttributeTargets +# 44| 0: [TypeMention] AttributeTargets #-----| 3: (Base types) -# 44| 0: [TypeMention] Attribute -# 47| 5: [Method] foo -# 47| -1: [TypeMention] Void +# 45| 0: [TypeMention] Attribute +# 48| 5: [Method] foo +# 48| -1: [TypeMention] Void #-----| 0: (Attributes) -# 46| 1: [DefaultAttribute] [Conditional(...)] -# 46| -1: [TypeMention] ConditionalAttribute -# 46| 0: [StringLiteralUtf16] "DEBUG2" -# 47| 4: [BlockStmt] {...} -# 50| [Class] Bar -# 52| 5: [Method] inc -# 52| -1: [TypeMention] int +# 47| 1: [DefaultAttribute] [Conditional(...)] +# 47| -1: [TypeMention] ConditionalAttribute +# 47| 0: [StringLiteralUtf16] "DEBUG2" +# 48| 4: [BlockStmt] {...} +# 51| [Class] Bar +# 53| 5: [Method] inc +# 53| -1: [TypeMention] int #-----| 2: (Parameters) -# 52| 0: [Parameter] x -# 52| -1: [TypeMention] int +# 53| 0: [Parameter] x +# 53| -1: [TypeMention] int #-----| 0: (Attributes) -# 52| 1: [DefaultAttribute] [Foo(...)] -# 52| 0: [TypeMention] Foo -# 52| 4: [BlockStmt] {...} -# 52| 0: [ReturnStmt] return ...; -# 52| 0: [AddExpr] ... + ... -# 52| 0: [ParameterAccess] access to parameter x -# 52| 1: [IntLiteral] 1 -# 55| 6: [Method] M1 -# 55| -1: [TypeMention] Void +# 53| 1: [DefaultAttribute] [Foo(...)] +# 53| 0: [TypeMention] Foo +# 53| 4: [BlockStmt] {...} +# 53| 0: [ReturnStmt] return ...; +# 53| 0: [AddExpr] ... + ... +# 53| 0: [ParameterAccess] access to parameter x +# 53| 1: [IntLiteral] 1 +# 56| 6: [Method] M1 +# 56| -1: [TypeMention] Void #-----| 0: (Attributes) -# 54| 1: [DefaultAttribute] [My(...)] -# 54| -1: [TypeMention] MyAttribute -# 54| 0: [BoolLiteral] false -# 55| 4: [BlockStmt] {...} -# 59| 7: [Method] M2 -# 59| -1: [TypeMention] Void +# 55| 1: [DefaultAttribute] [My(...)] +# 55| -1: [TypeMention] MyAttribute +# 55| 0: [BoolLiteral] false +# 56| 4: [BlockStmt] {...} +# 60| 7: [Method] M2 +# 60| -1: [TypeMention] Void #-----| 0: (Attributes) -# 57| 1: [DefaultAttribute] [My(...)] -# 57| -1: [TypeMention] MyAttribute -# 57| 0: [BoolLiteral] true -# 57| 1: [StringLiteralUtf16] "" -# 57| 2: [IntLiteral] 0 -# 58| 2: [DefaultAttribute] [My2(...)] -# 58| -1: [TypeMention] My2Attribute -# 58| 0: [BoolLiteral] false -# 58| 1: [BoolLiteral] true -# 58| 3: [IntLiteral] 1 -# 58| 4: [IntLiteral] 42 -# 59| 4: [BlockStmt] {...} -# 62| [Class] MyAttribute +# 58| 1: [DefaultAttribute] [My(...)] +# 58| -1: [TypeMention] MyAttribute +# 58| 0: [BoolLiteral] true +# 58| 1: [StringLiteralUtf16] "" +# 58| 2: [IntLiteral] 0 +# 59| 2: [DefaultAttribute] [My2(...)] +# 59| -1: [TypeMention] My2Attribute +# 59| 0: [BoolLiteral] false +# 59| 1: [BoolLiteral] true +# 59| 3: [IntLiteral] 1 +# 59| 4: [IntLiteral] 42 +# 60| 4: [BlockStmt] {...} +# 63| [Class] MyAttribute #-----| 3: (Base types) -# 62| 0: [TypeMention] Attribute -# 64| 4: [Field] x -# 64| -1: [TypeMention] int -# 65| 5: [Property] y -# 65| -1: [TypeMention] string -# 65| 3: [Getter] get_y -# 65| 4: [Setter] set_y +# 63| 0: [TypeMention] Attribute +# 65| 4: [Field] x +# 65| -1: [TypeMention] int +# 66| 5: [Property] y +# 66| -1: [TypeMention] string +# 66| 3: [Getter] get_y +# 66| 4: [Setter] set_y #-----| 2: (Parameters) -# 65| 0: [Parameter] value -# 66| 6: [InstanceConstructor] MyAttribute +# 66| 0: [Parameter] value +# 67| 6: [InstanceConstructor] MyAttribute #-----| 2: (Parameters) -# 66| 0: [Parameter] b -# 66| -1: [TypeMention] bool -# 66| 4: [BlockStmt] {...} -# 69| [Enum] E -# 69| 5: [Field] A -# 69| 1: [AssignExpr] ... = ... -# 69| 0: [MemberConstantAccess] access to constant A -# 69| 1: [IntLiteral] 42 -# 71| [Class] ArgsAttribute +# 67| 0: [Parameter] b +# 67| -1: [TypeMention] bool +# 67| 4: [BlockStmt] {...} +# 70| [Enum] E +# 70| 5: [Field] A +# 70| 1: [AssignExpr] ... = ... +# 70| 0: [MemberConstantAccess] access to constant A +# 70| 1: [IntLiteral] 42 +# 72| [Class] ArgsAttribute #-----| 3: (Base types) -# 71| 0: [TypeMention] Attribute -# 73| 4: [Property] Prop -# 73| -1: [TypeMention] Object[] -# 73| 1: [TypeMention] object -# 73| 3: [Getter] get_Prop -# 73| 4: [Setter] set_Prop +# 72| 0: [TypeMention] Attribute +# 74| 4: [Property] Prop +# 74| -1: [TypeMention] Object[] +# 74| 1: [TypeMention] object +# 74| 3: [Getter] get_Prop +# 74| 4: [Setter] set_Prop #-----| 2: (Parameters) -# 73| 0: [Parameter] value -# 74| 5: [InstanceConstructor] ArgsAttribute +# 74| 0: [Parameter] value +# 75| 5: [InstanceConstructor] ArgsAttribute #-----| 2: (Parameters) -# 74| 0: [Parameter] i -# 74| -1: [TypeMention] int -# 74| 1: [Parameter] o -# 74| -1: [TypeMention] object -# 74| 2: [Parameter] t -# 74| -1: [TypeMention] Type -# 74| 3: [Parameter] e -# 74| -1: [TypeMention] E -# 74| 4: [Parameter] arr -# 74| -1: [TypeMention] Int32[] -# 74| 1: [TypeMention] int -# 74| 4: [BlockStmt] {...} -# 78| [Class] X +# 75| 0: [Parameter] i +# 75| -1: [TypeMention] int +# 75| 1: [Parameter] o +# 75| -1: [TypeMention] object +# 75| 2: [Parameter] t +# 75| -1: [TypeMention] Type +# 75| 3: [Parameter] e +# 75| -1: [TypeMention] E +# 75| 4: [Parameter] arr +# 75| -1: [TypeMention] Int32[] +# 75| 1: [TypeMention] int +# 75| 4: [BlockStmt] {...} +# 79| [Class] X #-----| 0: (Attributes) -# 77| 1: [DefaultAttribute] [Args(...)] -# 77| -1: [TypeMention] ArgsAttribute -# 77| 0: [IntLiteral] 42 -# 77| 1: [NullLiteral] null -# 77| 2: [TypeofExpr] typeof(...) -# 77| 0: [TypeAccess] access to type X -# 77| 0: [TypeMention] X -# 77| 3: [MemberConstantAccess] access to constant A -# 77| -1: [TypeAccess] access to type E -# 77| 0: [TypeMention] E -# 77| 4: [ArrayCreation] array creation of type Int32[] -# 77| -2: [TypeMention] Int32[] -# 77| 1: [TypeMention] int -# 77| -1: [ArrayInitializer] { ..., ... } -# 77| 0: [IntLiteral] 1 -# 77| 1: [IntLiteral] 2 -# 77| 2: [IntLiteral] 3 -# 77| 5: [ArrayCreation] array creation of type Object[] -# 77| -2: [TypeMention] Object[] -# 77| 1: [TypeMention] object -# 77| -1: [ArrayInitializer] { ..., ... } -# 77| 0: [CastExpr] (...) ... -# 77| 1: [IntLiteral] 1 -# 77| 1: [TypeofExpr] typeof(...) -# 77| 0: [TypeAccess] access to type Int32 -# 77| 0: [TypeMention] int -# 82| 5: [Method] SomeMethod -# 82| -1: [TypeMention] int +# 78| 1: [DefaultAttribute] [Args(...)] +# 78| -1: [TypeMention] ArgsAttribute +# 78| 0: [IntLiteral] 42 +# 78| 1: [NullLiteral] null +# 78| 2: [TypeofExpr] typeof(...) +# 78| 0: [TypeAccess] access to type X +# 78| 0: [TypeMention] X +# 78| 3: [MemberConstantAccess] access to constant A +# 78| -1: [TypeAccess] access to type E +# 78| 0: [TypeMention] E +# 78| 4: [ArrayCreation] array creation of type Int32[] +# 78| -2: [TypeMention] Int32[] +# 78| 1: [TypeMention] int +# 78| -1: [ArrayInitializer] { ..., ... } +# 78| 0: [IntLiteral] 1 +# 78| 1: [IntLiteral] 2 +# 78| 2: [IntLiteral] 3 +# 78| 5: [ArrayCreation] array creation of type Object[] +# 78| -2: [TypeMention] Object[] +# 78| 1: [TypeMention] object +# 78| -1: [ArrayInitializer] { ..., ... } +# 78| 0: [CastExpr] (...) ... +# 78| 1: [IntLiteral] 1 +# 78| 1: [TypeofExpr] typeof(...) +# 78| 0: [TypeAccess] access to type Int32 +# 78| 0: [TypeMention] int +# 83| 5: [Method] SomeMethod +# 83| -1: [TypeMention] int #-----| 0: (Attributes) -# 80| 1: [DefaultAttribute] [Args(...)] -# 80| -1: [TypeMention] ArgsAttribute -# 80| 0: [AddExpr] ... + ... -# 80| 0: [IntLiteral] 42 -# 80| 1: [IntLiteral] 0 -# 80| 1: [ArrayCreation] array creation of type Int32[] -# 80| -2: [TypeMention] Int32[] -# 80| 1: [TypeMention] int -# 80| -1: [ArrayInitializer] { ..., ... } -# 80| 0: [IntLiteral] 1 -# 80| 1: [IntLiteral] 2 -# 80| 2: [IntLiteral] 3 -# 80| 2: [NullLiteral] null -# 80| 3: [CastExpr] (...) ... -# 80| 0: [TypeAccess] access to type E -# 80| 0: [TypeMention] E -# 80| 1: [IntLiteral] 12 -# 80| 4: [NullLiteral] null -# 80| 5: [ArrayCreation] array creation of type Object[] -# 80| -2: [TypeMention] Object[] -# 80| 1: [TypeMention] object -# 80| -1: [ArrayInitializer] { ..., ... } -# 80| 0: [CastExpr] (...) ... -# 80| 1: [IntLiteral] 1 -# 80| 1: [TypeofExpr] typeof(...) -# 80| 0: [TypeAccess] access to type Int32 -# 80| 0: [TypeMention] int -# 81| 2: [ReturnAttribute] [return: Args(...)] +# 81| 1: [DefaultAttribute] [Args(...)] # 81| -1: [TypeMention] ArgsAttribute # 81| 0: [AddExpr] ... + ... # 81| 0: [IntLiteral] 42 @@ -275,189 +248,228 @@ attributes.cs: # 81| 1: [TypeofExpr] typeof(...) # 81| 0: [TypeAccess] access to type Int32 # 81| 0: [TypeMention] int -# 82| 4: [BlockStmt] {...} -# 82| 0: [ReturnStmt] return ...; -# 82| 0: [IntLiteral] 1 -# 85| [Class] My2Attribute +# 82| 2: [ReturnAttribute] [return: Args(...)] +# 82| -1: [TypeMention] ArgsAttribute +# 82| 0: [AddExpr] ... + ... +# 82| 0: [IntLiteral] 42 +# 82| 1: [IntLiteral] 0 +# 82| 1: [ArrayCreation] array creation of type Int32[] +# 82| -2: [TypeMention] Int32[] +# 82| 1: [TypeMention] int +# 82| -1: [ArrayInitializer] { ..., ... } +# 82| 0: [IntLiteral] 1 +# 82| 1: [IntLiteral] 2 +# 82| 2: [IntLiteral] 3 +# 82| 2: [NullLiteral] null +# 82| 3: [CastExpr] (...) ... +# 82| 0: [TypeAccess] access to type E +# 82| 0: [TypeMention] E +# 82| 1: [IntLiteral] 12 +# 82| 4: [NullLiteral] null +# 82| 5: [ArrayCreation] array creation of type Object[] +# 82| -2: [TypeMention] Object[] +# 82| 1: [TypeMention] object +# 82| -1: [ArrayInitializer] { ..., ... } +# 82| 0: [CastExpr] (...) ... +# 82| 1: [IntLiteral] 1 +# 82| 1: [TypeofExpr] typeof(...) +# 82| 0: [TypeAccess] access to type Int32 +# 82| 0: [TypeMention] int +# 83| 4: [BlockStmt] {...} +# 83| 0: [ReturnStmt] return ...; +# 83| 0: [IntLiteral] 1 +# 86| [Class] My2Attribute #-----| 3: (Base types) -# 85| 0: [TypeMention] Attribute -# 87| 4: [Property] X -# 87| -1: [TypeMention] int -# 87| 3: [Getter] get_X -# 87| 4: [Setter] set_X +# 86| 0: [TypeMention] Attribute +# 88| 4: [Property] X +# 88| -1: [TypeMention] int +# 88| 3: [Getter] get_X +# 88| 4: [Setter] set_X #-----| 2: (Parameters) -# 87| 0: [Parameter] value -# 88| 5: [InstanceConstructor] My2Attribute +# 88| 0: [Parameter] value +# 89| 5: [InstanceConstructor] My2Attribute #-----| 2: (Parameters) -# 88| 0: [Parameter] a -# 88| -1: [TypeMention] bool -# 88| 1: [Parameter] b -# 88| -1: [TypeMention] bool -# 88| 2: [Parameter] i -# 88| -1: [TypeMention] int -# 88| 1: [IntLiteral] 12 -# 88| 3: [Parameter] j -# 88| -1: [TypeMention] int -# 88| 1: [IntLiteral] 13 -# 88| 4: [BlockStmt] {...} -# 91| [Class] My3Attribute +# 89| 0: [Parameter] a +# 89| -1: [TypeMention] bool +# 89| 1: [Parameter] b +# 89| -1: [TypeMention] bool +# 89| 2: [Parameter] i +# 89| -1: [TypeMention] int +# 89| 1: [IntLiteral] 12 +# 89| 3: [Parameter] j +# 89| -1: [TypeMention] int +# 89| 1: [IntLiteral] 13 +# 89| 4: [BlockStmt] {...} +# 92| [Class] My3Attribute #-----| 3: (Base types) -# 91| 0: [TypeMention] Attribute -# 93| 4: [InstanceConstructor] My3Attribute +# 92| 0: [TypeMention] Attribute +# 94| 4: [InstanceConstructor] My3Attribute #-----| 2: (Parameters) -# 93| 0: [Parameter] x -# 93| -1: [TypeMention] int -# 93| 4: [BlockStmt] {...} -# 98| [DelegateType] My1Delegate +# 94| 0: [Parameter] x +# 94| -1: [TypeMention] int +# 94| 4: [BlockStmt] {...} +# 99| [DelegateType] My1Delegate #-----| 0: (Attributes) -# 96| 1: [DefaultAttribute] [My3(...)] -# 96| -1: [TypeMention] My3Attribute -# 96| 0: [IntLiteral] 1 +# 97| 1: [DefaultAttribute] [My3(...)] +# 97| -1: [TypeMention] My3Attribute +# 97| 0: [IntLiteral] 1 #-----| 2: (Parameters) -# 98| 0: [Parameter] message -# 98| -1: [TypeMention] string -# 102| [DelegateType] My2Delegate +# 99| 0: [Parameter] message +# 99| -1: [TypeMention] string +# 103| [DelegateType] My2Delegate #-----| 0: (Attributes) -# 101| 1: [DefaultAttribute] [My3(...)] -# 101| -1: [TypeMention] My3Attribute -# 101| 0: [IntLiteral] 4 +# 102| 1: [DefaultAttribute] [My3(...)] +# 102| -1: [TypeMention] My3Attribute +# 102| 0: [IntLiteral] 4 #-----| 2: (Parameters) -# 102| 0: [Parameter] message -# 102| -1: [TypeMention] string -# 104| [Class] MyAttributeUsage -# 108| 5: [AddOperator] + -# 108| -1: [TypeMention] int +# 103| 0: [Parameter] message +# 103| -1: [TypeMention] string +# 105| [Class] MyAttributeUsage +# 109| 5: [AddOperator] + +# 109| -1: [TypeMention] int #-----| 0: (Attributes) -# 106| 1: [DefaultAttribute] [My3(...)] -# 106| -1: [TypeMention] My3Attribute -# 106| 0: [IntLiteral] 5 -# 107| 2: [ReturnAttribute] [return: My3(...)] +# 107| 1: [DefaultAttribute] [My3(...)] # 107| -1: [TypeMention] My3Attribute -# 107| 0: [IntLiteral] 6 +# 107| 0: [IntLiteral] 5 +# 108| 2: [ReturnAttribute] [return: My3(...)] +# 108| -1: [TypeMention] My3Attribute +# 108| 0: [IntLiteral] 6 #-----| 2: (Parameters) -# 108| 0: [Parameter] a -# 108| -1: [TypeMention] MyAttributeUsage -# 108| 1: [Parameter] b -# 108| -1: [TypeMention] MyAttributeUsage -# 108| 4: [IntLiteral] 0 -# 110| 6: [Indexer] Item -# 110| -1: [TypeMention] int +# 109| 0: [Parameter] a +# 109| -1: [TypeMention] MyAttributeUsage +# 109| 1: [Parameter] b +# 109| -1: [TypeMention] MyAttributeUsage +# 109| 4: [IntLiteral] 0 +# 111| 6: [Indexer] Item +# 111| -1: [TypeMention] int #-----| 1: (Parameters) -# 110| 0: [Parameter] x -# 110| -1: [TypeMention] int -# 114| 3: [Getter] get_Item +# 111| 0: [Parameter] x +# 111| -1: [TypeMention] int +# 115| 3: [Getter] get_Item #-----| 0: (Attributes) -# 112| 1: [DefaultAttribute] [My3(...)] -# 112| -1: [TypeMention] My3Attribute -# 112| 0: [IntLiteral] 7 -# 113| 2: [ReturnAttribute] [return: My3(...)] +# 113| 1: [DefaultAttribute] [My3(...)] # 113| -1: [TypeMention] My3Attribute -# 113| 0: [IntLiteral] 8 +# 113| 0: [IntLiteral] 7 +# 114| 2: [ReturnAttribute] [return: My3(...)] +# 114| -1: [TypeMention] My3Attribute +# 114| 0: [IntLiteral] 8 #-----| 2: (Parameters) -# 110| 0: [Parameter] x -# 114| 4: [BlockStmt] {...} -# 114| 0: [ReturnStmt] return ...; -# 114| 0: [AddExpr] ... + ... -# 114| 0: [ParameterAccess] access to parameter x -# 114| 1: [IntLiteral] 1 -# 118| 4: [Setter] set_Item +# 111| 0: [Parameter] x +# 115| 4: [BlockStmt] {...} +# 115| 0: [ReturnStmt] return ...; +# 115| 0: [AddExpr] ... + ... +# 115| 0: [ParameterAccess] access to parameter x +# 115| 1: [IntLiteral] 1 +# 119| 4: [Setter] set_Item #-----| 0: (Attributes) -# 116| 1: [DefaultAttribute] [My3(...)] -# 116| -1: [TypeMention] My3Attribute -# 116| 0: [IntLiteral] 9 +# 117| 1: [DefaultAttribute] [My3(...)] +# 117| -1: [TypeMention] My3Attribute +# 117| 0: [IntLiteral] 9 #-----| 2: (Parameters) -# 110| 0: [Parameter] x -# 118| 1: [Parameter] value +# 111| 0: [Parameter] x +# 119| 1: [Parameter] value #-----| 0: (Attributes) -# 117| 1: [DefaultAttribute] [My3(...)] -# 117| -1: [TypeMention] My3Attribute -# 117| 0: [IntLiteral] 10 -# 118| 4: [BlockStmt] {...} -# 118| 0: [ReturnStmt] return ...; -# 121| 7: [Field] p -# 121| -1: [TypeMention] int -# 122| 8: [Property] Prop1 +# 118| 1: [DefaultAttribute] [My3(...)] +# 118| -1: [TypeMention] My3Attribute +# 118| 0: [IntLiteral] 10 +# 119| 4: [BlockStmt] {...} +# 119| 0: [ReturnStmt] return ...; +# 122| 7: [Field] p # 122| -1: [TypeMention] int -# 126| 3: [Getter] get_Prop1 +# 123| 8: [Property] Prop1 +# 123| -1: [TypeMention] int +# 127| 3: [Getter] get_Prop1 #-----| 0: (Attributes) -# 124| 1: [DefaultAttribute] [My3(...)] -# 124| -1: [TypeMention] My3Attribute -# 124| 0: [IntLiteral] 11 -# 125| 2: [ReturnAttribute] [return: My3(...)] +# 125| 1: [DefaultAttribute] [My3(...)] # 125| -1: [TypeMention] My3Attribute -# 125| 0: [IntLiteral] 12 -# 126| 4: [BlockStmt] {...} -# 126| 0: [ReturnStmt] return ...; -# 126| 0: [FieldAccess] access to field p -# 130| 4: [Setter] set_Prop1 +# 125| 0: [IntLiteral] 11 +# 126| 2: [ReturnAttribute] [return: My3(...)] +# 126| -1: [TypeMention] My3Attribute +# 126| 0: [IntLiteral] 12 +# 127| 4: [BlockStmt] {...} +# 127| 0: [ReturnStmt] return ...; +# 127| 0: [FieldAccess] access to field p +# 131| 4: [Setter] set_Prop1 #-----| 0: (Attributes) -# 128| 1: [DefaultAttribute] [My3(...)] -# 128| -1: [TypeMention] My3Attribute -# 128| 0: [IntLiteral] 13 +# 129| 1: [DefaultAttribute] [My3(...)] +# 129| -1: [TypeMention] My3Attribute +# 129| 0: [IntLiteral] 13 #-----| 2: (Parameters) -# 130| 0: [Parameter] value +# 131| 0: [Parameter] value #-----| 0: (Attributes) -# 129| 1: [DefaultAttribute] [My3(...)] -# 129| -1: [TypeMention] My3Attribute -# 129| 0: [IntLiteral] 14 -# 130| 4: [BlockStmt] {...} -# 130| 0: [ExprStmt] ...; -# 130| 0: [AssignExpr] ... = ... -# 130| 0: [FieldAccess] access to field p -# 130| 1: [ParameterAccess] access to parameter value -# 134| [Class] Class1 -# 136| 5: [Class] ParamsAttribute +# 130| 1: [DefaultAttribute] [My3(...)] +# 130| -1: [TypeMention] My3Attribute +# 130| 0: [IntLiteral] 14 +# 131| 4: [BlockStmt] {...} +# 131| 0: [ExprStmt] ...; +# 131| 0: [AssignExpr] ... = ... +# 131| 0: [FieldAccess] access to field p +# 131| 1: [ParameterAccess] access to parameter value +# 135| [Class] Class1 +# 137| 5: [Class] ParamsAttribute #-----| 3: (Base types) -# 136| 0: [TypeMention] Attribute -# 138| 4: [InstanceConstructor] ParamsAttribute +# 137| 0: [TypeMention] Attribute +# 139| 4: [InstanceConstructor] ParamsAttribute #-----| 2: (Parameters) -# 138| 0: [Parameter] s1 -# 138| -1: [TypeMention] string -# 138| 1: [Parameter] s2 -# 138| -1: [TypeMention] string -# 138| 2: [Parameter] args -# 138| -1: [TypeMention] Int32[] -# 138| 1: [TypeMention] int -# 138| 4: [BlockStmt] {...} -# 142| 6: [Method] M1 -# 142| -1: [TypeMention] Void +# 139| 0: [Parameter] s1 +# 139| -1: [TypeMention] string +# 139| 1: [Parameter] s2 +# 139| -1: [TypeMention] string +# 139| 2: [Parameter] args +# 139| -1: [TypeMention] Int32[] +# 139| 1: [TypeMention] int +# 139| 4: [BlockStmt] {...} +# 143| 6: [Method] M1 +# 143| -1: [TypeMention] Void #-----| 0: (Attributes) -# 141| 1: [DefaultAttribute] [Params(...)] -# 141| -1: [TypeMention] ParamsAttribute -# 141| 0: [StringLiteralUtf16] "a" -# 141| 1: [StringLiteralUtf16] "b" -# 141| 2: [IntLiteral] 1 -# 141| 3: [IntLiteral] 2 -# 141| 4: [IntLiteral] 3 -# 142| 4: [BlockStmt] {...} -# 145| 7: [Method] M2 -# 145| -1: [TypeMention] Void +# 142| 1: [DefaultAttribute] [Params(...)] +# 142| -1: [TypeMention] ParamsAttribute +# 142| 0: [StringLiteralUtf16] "a" +# 142| 1: [StringLiteralUtf16] "b" +# 142| 2: [IntLiteral] 1 +# 142| 3: [IntLiteral] 2 +# 142| 4: [IntLiteral] 3 +# 143| 4: [BlockStmt] {...} +# 146| 7: [Method] M2 +# 146| -1: [TypeMention] Void #-----| 0: (Attributes) -# 144| 1: [DefaultAttribute] [Params(...)] -# 144| -1: [TypeMention] ParamsAttribute -# 144| 0: [StringLiteralUtf16] "a" -# 144| 1: [StringLiteralUtf16] "b" -# 144| 2: [IntLiteral] 1 -# 144| 3: [IntLiteral] 2 -# 144| 4: [IntLiteral] 3 -# 145| 4: [BlockStmt] {...} -# 148| 8: [Method] M3 -# 148| -1: [TypeMention] Void +# 145| 1: [DefaultAttribute] [Params(...)] +# 145| -1: [TypeMention] ParamsAttribute +# 145| 0: [StringLiteralUtf16] "a" +# 145| 1: [StringLiteralUtf16] "b" +# 145| 2: [IntLiteral] 1 +# 145| 3: [IntLiteral] 2 +# 145| 4: [IntLiteral] 3 +# 146| 4: [BlockStmt] {...} +# 149| 8: [Method] M3 +# 149| -1: [TypeMention] Void #-----| 0: (Attributes) -# 147| 1: [DefaultAttribute] [Params(...)] -# 147| -1: [TypeMention] ParamsAttribute -# 147| 0: [StringLiteralUtf16] "a" -# 147| 1: [StringLiteralUtf16] "b" -# 147| 2: [IntLiteral] 1 -# 148| 4: [BlockStmt] {...} -# 151| 9: [Method] M4 -# 151| -1: [TypeMention] Void +# 148| 1: [DefaultAttribute] [Params(...)] +# 148| -1: [TypeMention] ParamsAttribute +# 148| 0: [StringLiteralUtf16] "a" +# 148| 1: [StringLiteralUtf16] "b" +# 148| 2: [IntLiteral] 1 +# 149| 4: [BlockStmt] {...} +# 152| 9: [Method] M4 +# 152| -1: [TypeMention] Void #-----| 0: (Attributes) -# 150| 1: [DefaultAttribute] [Params(...)] -# 150| -1: [TypeMention] ParamsAttribute -# 150| 0: [StringLiteralUtf16] "a" -# 150| 1: [StringLiteralUtf16] "b" -# 150| 2: [ArrayCreation] array creation of type Int32[] -# 150| -1: [ArrayInitializer] { ..., ... } -# 150| 0: [IntLiteral] 1 -# 151| 4: [BlockStmt] {...} +# 151| 1: [DefaultAttribute] [Params(...)] +# 151| -1: [TypeMention] ParamsAttribute +# 151| 0: [StringLiteralUtf16] "a" +# 151| 1: [StringLiteralUtf16] "b" +# 151| 2: [ArrayCreation] array creation of type Int32[] +# 151| -1: [ArrayInitializer] { ..., ... } +# 151| 0: [IntLiteral] 1 +# 152| 4: [BlockStmt] {...} +# 156| [Class] MyExperimentalClass +#-----| 0: (Attributes) +# 155| 1: [DefaultAttribute] [Experimental(...)] +# 155| -1: [TypeMention] ExperimentalAttribute +# 155| 0: [StringLiteralUtf16] "MyExperimentalClassId" +# 159| 5: [Method] MyExperimentalMethod +# 159| -1: [TypeMention] Void +#-----| 0: (Attributes) +# 158| 1: [DefaultAttribute] [Experimental(...)] +# 158| -1: [TypeMention] ExperimentalAttribute +# 158| 0: [StringLiteralUtf16] "MyExperimentalMethodId" +# 159| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/attributes/attributes.cs b/csharp/ql/test/library-tests/attributes/attributes.cs index 3f1018c9416..25cbf258ab1 100644 --- a/csharp/ql/test/library-tests/attributes/attributes.cs +++ b/csharp/ql/test/library-tests/attributes/attributes.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -149,4 +150,11 @@ class Class1 [Params(args: new[] { 1 }, s2: "b", s1: "a")] public void M4() { } -} \ No newline at end of file +} + +[Experimental("MyExperimentalClassId")] +public class MyExperimentalClass +{ + [Experimental("MyExperimentalMethodId")] + public void MyExperimentalMethod() { } +} diff --git a/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected b/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected index e4c2f9af9ed..944815673cd 100644 --- a/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected +++ b/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected @@ -45,8 +45,10 @@ edges | dataflow.cs:100:30:100:33 | null : null | dataflow.cs:72:39:72:52 | call to method IndirectNull : null | provenance | | | dataflow.cs:100:30:100:33 | null : null | dataflow.cs:106:20:106:33 | call to method IndirectNull | provenance | | | dataflow.cs:100:30:100:33 | null : null | dataflow.cs:106:20:106:33 | call to method IndirectNull : null | provenance | | -| dataflow.cs:106:20:106:33 | call to method IndirectNull : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | -| dataflow.cs:107:23:107:26 | null : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | +| dataflow.cs:106:16:106:16 | access to local variable x : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | +| dataflow.cs:106:20:106:33 | call to method IndirectNull : null | dataflow.cs:106:16:106:16 | access to local variable x : null | provenance | | +| dataflow.cs:107:19:107:19 | access to local variable x : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | +| dataflow.cs:107:23:107:26 | null : null | dataflow.cs:107:19:107:19 | access to local variable x : null | provenance | | | dataflow.cs:108:16:108:16 | access to local variable x : null | dataflow.cs:72:21:72:34 | call to method NullFunction : null | provenance | | | dataflow.cs:108:16:108:16 | access to local variable x : null | dataflow.cs:87:31:87:44 | call to method NullFunction : null | provenance | | nodes @@ -104,8 +106,10 @@ nodes | dataflow.cs:87:24:87:51 | ... ? ... : ... | semmle.label | ... ? ... : ... | | dataflow.cs:87:31:87:44 | call to method NullFunction : null | semmle.label | call to method NullFunction : null | | dataflow.cs:100:30:100:33 | null : null | semmle.label | null : null | +| dataflow.cs:106:16:106:16 | access to local variable x : null | semmle.label | access to local variable x : null | | dataflow.cs:106:20:106:33 | call to method IndirectNull | semmle.label | call to method IndirectNull | | dataflow.cs:106:20:106:33 | call to method IndirectNull : null | semmle.label | call to method IndirectNull : null | +| dataflow.cs:107:19:107:19 | access to local variable x : null | semmle.label | access to local variable x : null | | dataflow.cs:107:23:107:26 | null : null | semmle.label | null : null | | dataflow.cs:108:16:108:16 | access to local variable x : null | semmle.label | access to local variable x : null | subpaths diff --git a/csharp/ql/test/library-tests/constructors/PrintAst.expected b/csharp/ql/test/library-tests/constructors/PrintAst.expected index c917d5c7fa1..fc5c19ac2df 100644 --- a/csharp/ql/test/library-tests/constructors/PrintAst.expected +++ b/csharp/ql/test/library-tests/constructors/PrintAst.expected @@ -25,7 +25,6 @@ constructors.cs: # 23| -1: [TypeMention] object # 23| 1: [Parameter] s # 23| -1: [TypeMention] string -# 23| 4: [BlockStmt] {...} # 25| 5: [InstanceConstructor] C1 #-----| 2: (Parameters) # 25| 0: [Parameter] o @@ -48,4 +47,3 @@ constructors.cs: # 28| 3: [ConstructorInitializer] call to constructor C1 # 28| 0: [ParameterAccess] access to parameter o # 28| 1: [ParameterAccess] access to parameter s -# 28| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 7eaeb6e690e..b2d49beeee3 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -1,3 +1,4 @@ +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | 5 | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | exit get_Item | 4 | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | exit set_Item | 4 | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | exit add_Event | 4 | @@ -11,10 +12,12 @@ | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | exit M7 | 24 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | exit M8 | 30 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | exit M9 | 58 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | 5 | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | exit M1 | 5 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | exit M2 | 6 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | exit M3 | 8 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | exit M4 | 13 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | exit AssertTests | 5 | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:9:20:9:20 | access to parameter b | 4 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | exit M1 | 1 | | Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:10:22:10:30 | ... != ... | 6 | @@ -188,9 +191,11 @@ | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | 2 | | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | 2 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | exit M13 (normal) | 4 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | exit Assignments | 5 | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | exit M | 34 | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | exit (...) => ... | 4 | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | exit + | 6 | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | exit BreakInTry | 5 | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:7:33:7:36 | access to parameter args | 5 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | 2 | | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | 1 | @@ -227,11 +232,14 @@ | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | 6 | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:68:21:68:26 | [finally: return] break; | 1 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | 1 | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | 5 | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | exit Default | 6 | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | exit Sizeof | 6 | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | exit Typeof | 6 | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | exit Nameof | 6 | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | 5 | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | exit M | 15 | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | 5 | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | 2 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | 2 | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:28:3:38 | call to method ToString | 1 | @@ -268,6 +276,7 @@ | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | exit M8 | 2 | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:35:14:35:24 | call to method Out | 1 | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith | 8 | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | exit Conditions | 5 | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:5:13:5:15 | access to parameter inc | 4 | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | 2 | | Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:7:14:7:16 | [inc (line 3): true] access to parameter inc | 5 | @@ -370,6 +379,7 @@ | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:146:13:146:13 | [b (line 143): false] access to parameter b | 5 | | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:48 | call to method WriteLine | 5 | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:48 | call to method WriteLine | 5 | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods | 5 | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | exit M1 | 8 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | exit M2 | 8 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | exit M3 | 7 | @@ -422,6 +432,7 @@ | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | exit ToBool | 8 | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | exit CallToInt32 | 5 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | exit Main | 20 | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | exit Finally | 5 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:11:13:11:37 | call to method WriteLine | 7 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | 1 | | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 5 | @@ -559,6 +570,9 @@ | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | 5 | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | 5 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:167:17:167:37 | call to method WriteLine | 5 | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA | 5 | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB | 5 | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | exit ExceptionC | 5 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:17:180:18 | access to parameter b1 | 6 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | 1 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | 1 | @@ -647,6 +661,7 @@ | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | 1 | | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 10 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | exit M13 (normal) | 10 | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | exit Foreach | 5 | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:8:29:8:32 | access to parameter args | 3 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | 2 | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | 1 | @@ -674,15 +689,19 @@ | Foreach.cs:36:10:36:11 | exit M6 (normal) | Foreach.cs:36:10:36:11 | exit M6 | 2 | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | 1 | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:39:11:39:11 | ; | 4 | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | exit Initializers | 4 | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | exit Initializers | 16 | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | exit Initializers | 16 | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | exit M | 22 | | Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:16:18:16 | exit H | 5 | -| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor | 9 | +| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor | 11 | | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | exit Sub | 12 | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | exit Sub | 9 | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | exit Sub | 14 | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | exit IndexInitializers | 5 | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | exit Compound | 5 | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | exit Test | 105 | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | 5 | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:9:13:9:28 | ... == ... | 7 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | 2 | | LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:10:13:10:19 | return ...; | 1 | @@ -728,6 +747,11 @@ | LoopUnrolling.cs:94:10:94:12 | enter M11 | LoopUnrolling.cs:97:9:100:9 | [unroll (line 97)] foreach (... ... in ...) ... | 9 | | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | exit M11 | 2 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | 6 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | 2 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | 1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | 1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | 2 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | 2 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | 1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | 1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | 1 | @@ -798,8 +822,18 @@ | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | 1 | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | 2 | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (normal) | 2 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | {...} | 2 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | 1 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | 1 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | 2 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | 2 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | 5 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | 5 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | 2 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | 1 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | 1 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | 2 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | 2 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | 1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | 1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | 1 | @@ -807,6 +841,11 @@ | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | 4 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationB.cs:32:9:32:10 | exit M1 (abnormal) | 4 | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | exit M2 | 6 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | 2 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | 1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | 1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | 2 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | 2 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | 2 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (normal) | 2 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | 1 | @@ -877,14 +916,25 @@ | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | 1 | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | 3 | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (abnormal) | 3 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | {...} | 2 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | 1 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | 1 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | 2 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | 2 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | 5 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | 5 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | {...} | 2 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | 1 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | 1 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | 2 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | 2 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | 1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | 1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | 1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | 1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | 2 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | 2 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | 5 | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | 2 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | exit M1 | 3 | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | 1 | @@ -924,6 +974,7 @@ | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | exit M6 | 4 | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | exit Partial | 12 | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | exit Partial | 12 | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | exit Patterns | 5 | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:8:18:8:23 | Int32 i1 | 8 | | Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:8:13:8:23 | [false] ... is ... | 1 | | Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:8:13:8:23 | [true] ... is ... | 1 | @@ -1017,6 +1068,7 @@ | Patterns.cs:95:29:95:38 | [no-match] ... or ... | Patterns.cs:95:29:95:38 | [no-match] ... or ... | 1 | | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:36:95:38 | access to constant B | 1 | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:97:13:97:38 | call to method WriteLine | 4 | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | exit PostDominance | 5 | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | exit M1 | 7 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:12:18:12:21 | null | 5 | | PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | exit M2 | 2 | @@ -1030,9 +1082,11 @@ | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:19:13:19:21 | [true] ... is ... | 1 | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | 4 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | exit M3 (normal) | 4 | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | exit Qualifiers | 5 | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | exit Method | 4 | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | exit StaticMethod | 4 | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | exit M | 58 | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | exit Switch | 5 | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | exit M1 | 6 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:14:18:14:20 | "a" | 6 | | Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | exit M2 | 1 | @@ -1143,17 +1197,20 @@ | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:52 | ... => ... | 2 | | Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:48 | call to method WriteLine | 5 | | Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:48 | call to method WriteLine | 5 | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | 5 | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:18:7:22 | Int32 j | 13 | | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | 1 | | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | 1 | | TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; | 1 | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | exit M | 5 | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | exit VarDecls | 5 | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | exit M1 | 19 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | exit M2 | 13 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:25:20:25:20 | access to parameter b | 11 | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | exit M3 | 4 | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | 1 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | 1 | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | exit C | 5 | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | exit Dispose | 4 | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:11:13:11:17 | ... > ... | 15 | | cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | exit Main | 2 | @@ -1325,6 +1382,7 @@ | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | exit ControlFlowSub | 5 | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | exit ControlFlowSub | 5 | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | exit ControlFlowSub | 7 | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | exit DelegateCall | 5 | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | exit M | 6 | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | exit NegationInConstructor | 5 | | cflow.cs:298:10:298:10 | enter M | cflow.cs:300:46:300:50 | ... > ... | 7 | @@ -1332,5 +1390,6 @@ | cflow.cs:300:44:300:51 | [true] !... | cflow.cs:300:44:300:51 | [true] !... | 1 | | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:298:10:298:10 | exit M | 5 | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:64 | ... != ... | 3 | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | exit LambdaGetter | 5 | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | exit (...) => ... | 9 | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | exit get__getter | 4 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index 7246b3dc24f..694fe9700df 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -1,4 +1,8 @@ dominance +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | {...} | +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:23:5:25 | exit get_Item | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | @@ -300,6 +304,10 @@ dominance | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:80:73:80 | 1 | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:74:73:82 | (..., ...) | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:81 | dynamic access to element | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | {...} | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:11:3:12 | exit M1 | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | @@ -328,6 +336,10 @@ dominance | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:31:9:52 | { ..., ... } | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:48:9:48 | 3 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:43:9:50 | { ..., ... } | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | {...} | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | exit AssertTests | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | exit AssertTests (normal) | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:8:5:12:5 | {...} | | Assert.cs:8:5:12:5 | {...} | Assert.cs:9:9:9:33 | ... ...; | | Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:20:9:20 | access to parameter b | @@ -867,6 +879,10 @@ dominance | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | {...} | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | exit Assignments | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | exit Assignments (normal) | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:3:10:3:10 | exit M | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:5:9:5:18 | ... ...; | @@ -908,6 +924,10 @@ dominance | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | exit + (normal) | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:9:19:17 | return ...; | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | {...} | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | exit BreakInTry | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:5:9:17:9 | try {...} ... | @@ -1014,6 +1034,10 @@ dominance | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:31 | ... == ... | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | {...} | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:5:9:5:15 | exit Default | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:7:16:7:27 | default(...) | @@ -1034,6 +1058,10 @@ dominance | CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | exit Nameof (normal) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:9:22:25 | return ...; | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:28:10:28:10 | exit M | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | @@ -1048,6 +1076,10 @@ dominance | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | {...} | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | @@ -1123,6 +1155,10 @@ dominance | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith (normal) | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:78 | ... + ... | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:83 | ... + ... | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | {...} | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | exit Conditions | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | exit Conditions (normal) | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:5:9:6:16 | if (...) ... | @@ -1496,6 +1532,10 @@ dominance | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:13:149:48 | call to method WriteLine | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:45:149:45 | access to local variable s | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:38:149:47 | $"..." | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | {...} | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | exit ExitMethods | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:8:10:8:11 | exit M1 | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:10:9:10:25 | ...; | @@ -1691,6 +1731,10 @@ dominance | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:14 | "true" | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | delegate creation of type Func | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:9:25:33 | call to method ToBool | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | {...} | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | exit Finally | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | exit Finally (normal) | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:8:5:17:5 | {...} | | Finally.cs:8:5:17:5 | {...} | Finally.cs:9:9:16:9 | try {...} ... | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:10:9:12:9 | {...} | @@ -2133,6 +2177,18 @@ dominance | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:37 | call to method WriteLine | | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | {...} | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | exit ExceptionA | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | {...} | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | exit ExceptionB | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | {...} | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | exit ExceptionC | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:177:5:193:5 | {...} | | Finally.cs:177:5:193:5 | {...} | Finally.cs:178:9:192:9 | try {...} ... | | Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:179:9:181:9 | {...} | @@ -2403,6 +2459,10 @@ dominance | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | exit Foreach | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | exit Foreach (normal) | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:8:29:8:32 | access to parameter args | @@ -2453,6 +2513,9 @@ dominance | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:33:38:33 | Int32 y | | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:18:38:34 | (..., ...) | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | {...} | +| Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | exit Initializers | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | exit Initializers (normal) | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | @@ -2508,13 +2571,15 @@ dominance | Initializers.cs:18:16:18:16 | exit H (normal) | Initializers.cs:18:16:18:16 | exit H | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:16 | exit H (normal) | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:20 | ... = ... | -| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:22:23:22:23 | this access | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:22:23:22:23 | this access | +| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | call to constructor Object | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | exit NoConstructor | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:27:22:27 | 0 | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:23:23:23:23 | this access | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:27 | ... = ... | | Initializers.cs:23:23:23:23 | this access | Initializers.cs:23:27:23:27 | 1 | -| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | +| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | {...} | | Initializers.cs:23:27:23:27 | 1 | Initializers.cs:23:23:23:27 | ... = ... | | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | @@ -2548,6 +2613,14 @@ dominance | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:37:35:37 | access to parameter j | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:29:35:37 | ... = ... | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:37 | ... + ... | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | {...} | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | exit IndexInitializers | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | {...} | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | exit Compound | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | exit Compound (normal) | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:52:5:66:5 | {...} | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:51:10:51:13 | exit Test | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:54:9:54:96 | ... ...; | @@ -2652,6 +2725,10 @@ dominance | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:59:64:61 | "1" | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:54 | ... + ... | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:46:64:61 | ... = ... | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | {...} | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:9:9:10:19 | if (...) ... | @@ -2842,6 +2919,11 @@ dominance | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | @@ -2916,12 +2998,22 @@ dominance | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:34:24:34 | 0 | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:20:22:20:31 | {...} | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | access to property P | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | {...} | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:28:30:37 | throw ... | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:22:36:25 | null | @@ -2933,6 +3025,11 @@ dominance | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:16:37:26 | throw ...; | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (normal) | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | @@ -3006,13 +3103,27 @@ dominance | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:34:22:34 | 1 | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:18:22:18:36 | {...} | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | access to property P | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | {...} | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | {...} | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:9:3:10 | exit M1 | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:28 | ... ?? ... | @@ -3091,6 +3202,10 @@ dominance | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:22:4:24 | {...} | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | {...} | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | call to constructor Object | +| Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | exit Patterns | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | exit Patterns (normal) | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:5:10:5:11 | exit M1 | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:7:9:7:24 | ... ...; | @@ -3282,6 +3397,10 @@ dominance | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:97:13:97:39 | ...; | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:38 | call to method WriteLine | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | {...} | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | exit PostDominance | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:5:10:5:11 | exit M1 | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:7:9:7:29 | ...; | @@ -3313,6 +3432,10 @@ dominance | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:17:10:17:11 | exit M3 (normal) | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:28 | call to method WriteLine | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | {...} | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | exit Qualifiers | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:16:7:21 | exit Method | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:16:7:21 | exit Method (normal) | @@ -3376,6 +3499,10 @@ dominance | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:46 | call to method Method | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:9:30:46 | ... = ... | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | {...} | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | exit Switch | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | exit Switch (normal) | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:6:5:8:5 | {...} | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:5:10:5:11 | exit M1 | | Switch.cs:6:5:8:5 | {...} | Switch.cs:7:9:7:22 | switch (...) {...} | @@ -3617,6 +3744,10 @@ dominance | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:13:160:48 | call to method WriteLine | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:45:160:45 | access to local variable s | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:38:160:47 | $"..." | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | {...} | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:4:5:9:5 | {...} | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:3:10:3:10 | exit M | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:5:9:5:26 | ... ...; | @@ -3636,6 +3767,10 @@ dominance | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | exit M (normal) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:13:8:27 | Type t = ... | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | {...} | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | exit VarDecls | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:5:18:5:19 | exit M1 | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | @@ -3681,6 +3816,10 @@ dominance | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:28:25:28 | access to local variable y | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:13:25:29 | return ...; | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | {...} | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | exit C | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | exit C (normal) | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:51:28:53 | {...} | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:41:28:47 | exit Dispose | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | @@ -4304,6 +4443,10 @@ dominance | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:45 | call to method ToString | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | exit ControlFlowSub (normal) | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | {...} | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | exit DelegateCall | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:12:291:12 | exit M | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:40:291:40 | 0 | @@ -4328,6 +4471,10 @@ dominance | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:61:300:64 | null | | cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:64 | ... != ... | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | {...} | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | exit LambdaGetter | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | exit get__getter (normal) | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:307:5:310:5 | {...} | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | (...) => ... | @@ -4340,6 +4487,10 @@ dominance | cflow.cs:309:9:309:17 | return ...; | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | | cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:309:9:309:17 | return ...; | postDominance +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | {...} | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | call to constructor Object | | AccessorCalls.cs:5:23:5:25 | exit get_Item | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:23:5:25 | enter get_Item | @@ -4641,6 +4792,10 @@ postDominance | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:75:73:75 | 0 | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:80:73:80 | 1 | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:78 | access to local variable d | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | {...} | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | call to constructor Object | | ArrayCreation.cs:3:11:3:12 | exit M1 | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:27:3:27 | 0 | @@ -4669,6 +4824,10 @@ postDominance | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:48:9:48 | 3 | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:33:9:40 | { ..., ... } | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:45:9:45 | 2 | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | enter AssertTests | +| Assert.cs:5:7:5:17 | exit AssertTests | Assert.cs:5:7:5:17 | exit AssertTests (normal) | +| Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | {...} | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | call to constructor Object | | Assert.cs:7:10:7:11 | exit M1 (abnormal) | Assert.cs:10:9:10:31 | [assertion failure] call to method Assert | | Assert.cs:7:10:7:11 | exit M1 (normal) | Assert.cs:11:9:11:35 | call to method WriteLine | | Assert.cs:8:5:12:5 | {...} | Assert.cs:7:10:7:11 | enter M1 | @@ -5146,6 +5305,10 @@ postDominance | Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:25:140:26 | access to parameter b1 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:29:140:30 | access to parameter b2 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | enter Assignments | +| Assignments.cs:1:7:1:17 | exit Assignments | Assignments.cs:1:7:1:17 | exit Assignments (normal) | +| Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | {...} | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | call to constructor Object | | Assignments.cs:3:10:3:10 | exit M | Assignments.cs:3:10:3:10 | exit M (normal) | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:14:9:14:35 | ... += ... | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:3:10:3:10 | enter M | @@ -5187,6 +5350,10 @@ postDominance | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:17:40:17:40 | enter + | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:18:5:20:5 | {...} | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | enter BreakInTry | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | {...} | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | call to constructor Object | | BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:15:17:15:28 | ... == ... | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:16:17:16:17 | ; | @@ -5287,6 +5454,10 @@ postDominance | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:67:28:67:31 | [finally: return] null | | BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:67:21:67:23 | [finally: return] access to local variable arg | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:23 | access to local variable arg | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | {...} | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | | CompileTimeOperators.cs:5:9:5:15 | exit Default | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:7:9:7:28 | return ...; | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:5:9:5:15 | enter Default | @@ -5307,6 +5478,10 @@ postDominance | CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:21:5:23:5 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | | CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:28:10:28:10 | enter M | @@ -5321,6 +5496,10 @@ postDominance | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:9:40:11 | End: | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:38 | ...; | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | {...} | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | | ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:28:3:38 | call to method ToString | @@ -5396,6 +5575,10 @@ postDominance | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:78 | ... + ... | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | enter Conditions | +| Conditions.cs:1:7:1:16 | exit Conditions | Conditions.cs:1:7:1:16 | exit Conditions (normal) | +| Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | {...} | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | call to constructor Object | | Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:7:13:7:16 | [false] !... | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:8:13:8:15 | ...-- | @@ -5758,6 +5941,10 @@ postDominance | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:45:149:45 | access to local variable s | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:13:149:49 | ...; | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:40:149:43 | "b = " | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | enter ExitMethods | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | {...} | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | call to constructor Object | | ExitMethods.cs:8:10:8:11 | exit M1 | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:11:9:11:15 | return ...; | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:8:10:8:11 | enter M1 | @@ -5944,6 +6131,10 @@ postDominance | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:24:9:24:45 | call to method ToBool | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:9:25:14 | "true" | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | access to method Parse | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | enter Finally | +| Finally.cs:3:14:3:20 | exit Finally | Finally.cs:3:14:3:20 | exit Finally (normal) | +| Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | {...} | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | call to constructor Object | | Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | | Finally.cs:7:10:7:11 | exit M1 (normal) | Finally.cs:15:13:15:40 | call to method WriteLine | | Finally.cs:8:5:17:5 | {...} | Finally.cs:7:10:7:11 | enter M1 | @@ -6328,6 +6519,18 @@ postDominance | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:38 | ...; | | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | enter ExceptionA | +| Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | +| Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | {...} | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | enter ExceptionB | +| Finally.cs:173:11:173:20 | exit ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | +| Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | {...} | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | enter ExceptionC | +| Finally.cs:174:11:174:20 | exit ExceptionC | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | +| Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | {...} | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | call to constructor Exception | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | | Finally.cs:177:5:193:5 | {...} | Finally.cs:176:10:176:11 | enter M9 | @@ -6543,6 +6746,10 @@ postDominance | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | enter Foreach | +| Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | exit Foreach (normal) | +| Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | {...} | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | exit M1 (normal) | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:6:10:6:11 | enter M1 | @@ -6593,6 +6800,9 @@ postDominance | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:37:5:40:5 | {...} | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:18:38:34 | (..., ...) | +| Initializers.cs:3:7:3:18 | exit Initializers | Initializers.cs:3:7:3:18 | exit Initializers (normal) | +| Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | {...} | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | enter Initializers | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:8:5:8:16 | call to constructor Object | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:10:5:10:16 | call to constructor Object | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:13:5:17 | ... + ... | @@ -6648,9 +6858,11 @@ postDominance | Initializers.cs:18:16:18:16 | exit H (normal) | Initializers.cs:18:16:18:20 | ... = ... | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:20:18:20 | 1 | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:16 | enter H | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | enter NoConstructor | | Initializers.cs:20:11:20:23 | exit NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | -| Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:23:23:23:27 | ... = ... | -| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | enter NoConstructor | +| Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | {...} | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:23:23:23:27 | ... = ... | +| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | call to constructor Object | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:27:22:27 | 0 | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:23:23:23:23 | this access | Initializers.cs:22:23:22:27 | ... = ... | @@ -6688,6 +6900,14 @@ postDominance | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:29:35:29 | this access | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:37:35:37 | access to parameter j | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:33 | access to parameter i | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | enter IndexInitializers | +| Initializers.cs:39:7:39:23 | exit IndexInitializers | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | +| Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | {...} | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | enter Compound | +| Initializers.cs:41:11:41:18 | exit Compound | Initializers.cs:41:11:41:18 | exit Compound (normal) | +| Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | {...} | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | call to constructor Object | | Initializers.cs:51:10:51:13 | exit Test | Initializers.cs:51:10:51:13 | exit Test (normal) | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:57:13:65:9 | Compound compound = ... | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:51:10:51:13 | enter Test | @@ -6792,6 +7012,10 @@ postDominance | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:54:64:54 | 0 | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:50 | access to parameter i | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:50:64:54 | ... + ... | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | {...} | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | | LoopUnrolling.cs:7:10:7:11 | exit M1 | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:10:13:10:19 | return ...; | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | @@ -6980,6 +7204,11 @@ postDominance | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:98:9:100:9 | {...} | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:33 | ...; | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | {...} | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | {...} | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | throw ... | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:28:6:31 | null | @@ -7046,12 +7275,22 @@ postDominance | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:13:16:13:20 | ... = ... | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:16:24:16 | access to property P | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | this access | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | {...} | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:28:30:37 | throw ... | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | {...} | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | {...} | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:16:36:26 | throw ...; | | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:22:36:25 | null | @@ -7061,6 +7300,11 @@ postDominance | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:9:37:10 | enter M2 | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:14:37:28 | {...} | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | {...} | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | {...} | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | throw ... | @@ -7124,13 +7368,27 @@ postDominance | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:11:16:11:20 | ... = ... | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:16:22:16 | access to property P | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | this access | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | {...} | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:28:30:37 | throw ... | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | {...} | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | {...} | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | MultiImplementationB.cs:32:9:32:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:16:36:26 | throw ...; | | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | enter M1 | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | {...} | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | call to constructor Object | | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:23:3:28 | ... ?? ... | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:9:3:10 | enter M1 | @@ -7207,6 +7465,10 @@ postDominance | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:16:5:16 | access to property P | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | this access | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | enter Patterns | +| Patterns.cs:3:7:3:14 | exit Patterns | Patterns.cs:3:7:3:14 | exit Patterns (normal) | +| Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | {...} | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | call to constructor Object | | Patterns.cs:5:10:5:11 | exit M1 | Patterns.cs:5:10:5:11 | exit M1 (normal) | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:40:17:40:17 | access to local variable o | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:5:10:5:11 | enter M1 | @@ -7385,6 +7647,10 @@ postDominance | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:96:9:98:9 | {...} | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:39 | ...; | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | enter PostDominance | +| PostDominance.cs:3:7:3:19 | exit PostDominance | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | +| PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | {...} | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | call to constructor Object | | PostDominance.cs:5:10:5:11 | exit M1 | PostDominance.cs:5:10:5:11 | exit M1 (normal) | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:7:9:7:28 | call to method WriteLine | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:5:10:5:11 | enter M1 | @@ -7414,6 +7680,10 @@ postDominance | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:19:13:19:21 | [false] ... is ... | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:29 | ...; | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | enter Qualifiers | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | {...} | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | call to constructor Object | | Qualifiers.cs:7:16:7:21 | exit Method | Qualifiers.cs:7:16:7:21 | exit Method (normal) | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:16:7:21 | enter Method | @@ -7477,6 +7747,10 @@ postDominance | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:29:9:29:46 | ... = ... | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:9:30:47 | ...; | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | enter Switch | +| Switch.cs:3:7:3:12 | exit Switch | Switch.cs:3:7:3:12 | exit Switch (normal) | +| Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | {...} | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | call to constructor Object | | Switch.cs:5:10:5:11 | exit M1 | Switch.cs:5:10:5:11 | exit M1 (normal) | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:7:17:7:17 | access to parameter o | | Switch.cs:6:5:8:5 | {...} | Switch.cs:5:10:5:11 | enter M1 | @@ -7702,6 +7976,10 @@ postDominance | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:45:160:45 | access to local variable s | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:13:160:49 | ...; | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:40:160:43 | "b = " | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | {...} | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | call to constructor Object | | TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:3:10:3:10 | exit M (normal) | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:8:13:8:27 | Type t = ... | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:3:10:3:10 | enter M | @@ -7721,6 +7999,10 @@ postDominance | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:9:8:28 | ... ...; | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | enter VarDecls | +| VarDecls.cs:3:7:3:14 | exit VarDecls | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | +| VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | {...} | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | call to constructor Object | | VarDecls.cs:5:18:5:19 | exit M1 | VarDecls.cs:5:18:5:19 | exit M1 (normal) | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:9:13:9:29 | return ...; | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:5:18:5:19 | enter M1 | @@ -7766,6 +8048,10 @@ postDominance | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:24:31:24:41 | C y = ... | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | enter C | +| VarDecls.cs:28:11:28:11 | exit C | VarDecls.cs:28:11:28:11 | exit C (normal) | +| VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | {...} | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | call to constructor Object | | VarDecls.cs:28:41:28:47 | exit Dispose | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:51:28:53 | {...} | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:41:28:47 | enter Dispose | @@ -8370,6 +8656,10 @@ postDominance | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:5:286:18 | enter ControlFlowSub | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | enter DelegateCall | +| cflow.cs:289:7:289:18 | exit DelegateCall | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | +| cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | {...} | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | call to constructor Object | | cflow.cs:291:12:291:12 | exit M | cflow.cs:291:12:291:12 | exit M (normal) | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:38:291:41 | delegate call | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:12:291:12 | enter M | @@ -8394,6 +8684,10 @@ postDominance | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:61:300:64 | null | | cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:44:300:64 | ... && ... | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | enter LambdaGetter | +| cflow.cs:304:7:304:18 | exit LambdaGetter | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | +| cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | {...} | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | call to constructor Object | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | enter get__getter | | cflow.cs:306:60:310:5 | exit (...) => ... | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | cflow.cs:309:9:309:17 | return ...; | @@ -8406,6 +8700,7 @@ postDominance | cflow.cs:309:9:309:17 | return ...; | cflow.cs:309:16:309:16 | access to local variable x | | cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:308:16:308:20 | Object x = ... | blockDominance +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | enter get_Item | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | enter set_Item | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | enter add_Event | @@ -8419,10 +8714,12 @@ blockDominance | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | enter M7 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | enter M8 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | enter M9 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | enter M1 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | enter M2 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | enter M3 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | enter M4 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | enter AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | enter M1 | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | exit M1 | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:9:20:9:32 | ... ? ... : ... | @@ -9732,9 +10029,11 @@ blockDominance | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | enter Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | enter M | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | enter (...) => ... | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | enter + | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | enter BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | enter M1 | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | @@ -9849,11 +10148,14 @@ blockDominance | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | enter Default | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | enter M | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | enter M1 | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:28:3:38 | call to method ToString | @@ -9925,6 +10227,7 @@ blockDominance | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:35:14:35:24 | call to method Out | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | enter Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | enter IncrOrDecr | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | @@ -10233,6 +10536,7 @@ blockDominance | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:149:13:149:49 | ...; | | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:49 | ...; | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:49 | ...; | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | enter ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | enter M1 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | enter M2 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | enter M3 | @@ -10314,6 +10618,7 @@ blockDominance | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | enter ToBool | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | enter CallToInt32 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | enter Main | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | enter Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | exit M1 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | @@ -10907,6 +11212,9 @@ blockDominance | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | catch {...} | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | enter ExceptionA | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | enter ExceptionB | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | enter ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | enter M9 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | exit M9 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | @@ -11236,6 +11544,7 @@ blockDominance | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | | Finally.cs:270:9:273:9 | {...} | Finally.cs:270:9:273:9 | {...} | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | enter Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | enter M1 | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | exit M1 (normal) | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | @@ -11299,6 +11608,7 @@ blockDominance | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | enter Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | enter Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | enter M | @@ -11307,7 +11617,10 @@ blockDominance | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | enter Sub | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | enter IndexInitializers | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | enter Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | enter Test | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | enter M1 | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:10:13:10:19 | return ...; | @@ -11416,6 +11729,15 @@ blockDominance | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:22:97:22 | String x | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | @@ -11525,8 +11847,26 @@ blockDominance | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:50:23:53 | null | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | @@ -11537,6 +11877,15 @@ blockDominance | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | enter M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | @@ -11646,8 +11995,26 @@ blockDominance | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | @@ -11657,6 +12024,7 @@ blockDominance | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:28 | ... ?? ... | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:28:3:28 | 0 | @@ -11743,6 +12111,7 @@ blockDominance | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | enter Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | enter Partial | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | enter Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | enter M1 | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:8:13:8:23 | [false] ... is ... | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:8:13:8:23 | [true] ... is ... | @@ -12050,6 +12419,7 @@ blockDominance | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:29:95:38 | [no-match] ... or ... | | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:36:95:38 | access to constant B | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:96:9:98:9 | {...} | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | enter PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | enter M1 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | enter M2 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | exit M2 (normal) | @@ -12077,9 +12447,11 @@ blockDominance | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:20:45:20:53 | nameof(...) | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:20:45:20:53 | nameof(...) | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:29 | ...; | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | enter Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | enter Method | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | enter StaticMethod | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | enter M | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | enter Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | enter M1 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | enter M2 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | exit M2 | @@ -12396,6 +12768,7 @@ blockDominance | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:50:156:52 | "b" | | Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:49 | ...; | | Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:49 | ...; | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | @@ -12406,6 +12779,7 @@ blockDominance | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:9:8:28 | ... ...; | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | enter VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | enter M1 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | enter M2 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | enter M3 | @@ -12415,6 +12789,7 @@ blockDominance | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:20:25:28 | ... ? ... : ... | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | enter C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | enter Dispose | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | enter Main | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | exit Main (normal) | @@ -13160,6 +13535,7 @@ blockDominance | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | enter ControlFlowSub | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | enter ControlFlowSub | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | enter ControlFlowSub | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | enter DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | enter M | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | enter NegationInConstructor | | cflow.cs:298:10:298:10 | enter M | cflow.cs:298:10:298:10 | enter M | @@ -13172,9 +13548,11 @@ blockDominance | cflow.cs:300:44:300:51 | [true] !... | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:300:44:300:64 | ... && ... | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:56 | access to parameter s | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | enter LambdaGetter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | enter (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | enter get__getter | postBlockDominance +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | enter get_Item | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | enter set_Item | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | enter add_Event | @@ -13188,10 +13566,12 @@ postBlockDominance | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | enter M7 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | enter M8 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | enter M9 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | enter M1 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | enter M2 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | enter M3 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | enter M4 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | enter AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | enter M1 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | exit M1 | | Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:7:10:7:11 | enter M1 | @@ -13985,9 +14365,11 @@ postBlockDominance | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | enter M13 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:29:140:30 | access to parameter b2 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | enter Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | enter M | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | enter (...) => ... | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | enter + | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | enter BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | enter M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | enter M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | @@ -14072,11 +14454,14 @@ postBlockDominance | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | enter Default | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | enter M | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | enter M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | enter M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | @@ -14145,6 +14530,7 @@ postBlockDominance | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:35:14:35:24 | call to method Out | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:35:14:35:24 | call to method Out | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | enter Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | enter IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | enter IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | @@ -14400,6 +14786,7 @@ postBlockDominance | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:49 | ...; | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:49 | ...; | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | enter ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | enter M1 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | enter M2 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | enter M3 | @@ -14466,6 +14853,7 @@ postBlockDominance | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | enter ToBool | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | enter CallToInt32 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | enter Main | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | enter Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | @@ -14708,6 +15096,9 @@ postBlockDominance | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | catch {...} | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | enter ExceptionA | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | enter ExceptionB | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | enter ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | enter M9 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | @@ -14827,6 +15218,7 @@ postBlockDominance | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:270:9:273:9 | {...} | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | enter Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | enter M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | enter M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 (normal) | @@ -14893,6 +15285,7 @@ postBlockDominance | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | enter Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | enter Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | enter M | @@ -14901,7 +15294,10 @@ postBlockDominance | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | enter Sub | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | enter IndexInitializers | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | enter Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | enter Test | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | enter M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | enter M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | @@ -15001,6 +15397,15 @@ postBlockDominance | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:97:22:97:22 | String x | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:94:10:94:12 | enter M11 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:22:97:22 | String x | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | @@ -15084,14 +15489,41 @@ postBlockDominance | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:50:23:53 | null | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationB.cs:21:28:21:35 | enter implicit conversion | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | enter M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | @@ -15173,8 +15605,26 @@ postBlockDominance | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | @@ -15182,6 +15632,7 @@ postBlockDominance | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | enter M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | enter M1 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:28 | ... ?? ... | @@ -15270,6 +15721,7 @@ postBlockDominance | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | enter Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | enter Partial | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | enter Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | enter M1 | | Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:8:13:8:23 | [false] ... is ... | | Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:8:13:8:23 | [true] ... is ... | @@ -15517,6 +15969,7 @@ postBlockDominance | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:95:21:95:40 | [match] { ... } | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:95:29:95:38 | [match] ... or ... | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:96:9:98:9 | {...} | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | enter PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | enter M1 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | enter M2 | | PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | enter M2 | @@ -15540,9 +15993,11 @@ postBlockDominance | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | enter M3 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:19:13:19:21 | [false] ... is ... | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:29 | ...; | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | enter Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | enter Method | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | enter StaticMethod | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | enter M | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | enter Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | enter M1 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | enter M2 | | Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | exit M2 | @@ -15779,6 +16234,7 @@ postBlockDominance | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:50:156:52 | "b" | | Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:49 | ...; | | Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:49 | ...; | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M | | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | @@ -15789,6 +16245,7 @@ postBlockDominance | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:9:8:28 | ... ...; | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | enter VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | enter M1 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | enter M2 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | enter M3 | @@ -15798,6 +16255,7 @@ postBlockDominance | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:28:25:28 | access to local variable y | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | enter C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | enter Dispose | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | enter Main | | cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | enter Main | @@ -16438,6 +16896,7 @@ postBlockDominance | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | enter ControlFlowSub | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | enter ControlFlowSub | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | enter ControlFlowSub | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | enter DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | enter M | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | enter NegationInConstructor | | cflow.cs:298:10:298:10 | enter M | cflow.cs:298:10:298:10 | enter M | @@ -16450,5 +16909,6 @@ postBlockDominance | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:44:300:51 | [true] !... | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:56 | access to parameter s | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | enter LambdaGetter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | enter (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | enter get__getter | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index c7a94483689..ca55c02506d 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -1,4 +1,9 @@ nodeEnclosing +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | | AccessorCalls.cs:5:23:5:25 | exit get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:23:5:25 | get_Item | @@ -313,6 +318,11 @@ nodeEnclosing | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:66:10:66:11 | M9 | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | M1 | | ArrayCreation.cs:3:11:3:12 | exit M1 | ArrayCreation.cs:3:11:3:12 | M1 | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:11:3:12 | M1 | @@ -345,6 +355,11 @@ nodeEnclosing | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:12:9:13 | M4 | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:12:9:13 | M4 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:12:9:13 | M4 | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | exit AssertTests | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:7:10:7:11 | exit M1 (abnormal) | Assert.cs:7:10:7:11 | M1 | @@ -924,6 +939,11 @@ nodeEnclosing | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | M13 | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | exit Assignments | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | M | | Assignments.cs:3:10:3:10 | exit M | Assignments.cs:3:10:3:10 | M | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:3:10:3:10 | M | @@ -968,6 +988,11 @@ nodeEnclosing | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:17:40:17:40 | + | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | + | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:17:40:17:40 | + | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | M1 | @@ -1080,6 +1105,11 @@ nodeEnclosing | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | M4 | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | Default | | CompileTimeOperators.cs:5:9:5:15 | exit Default | CompileTimeOperators.cs:5:9:5:15 | Default | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:5:9:5:15 | Default | @@ -1104,6 +1134,11 @@ nodeEnclosing | CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:20:12:20:17 | Nameof | | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | Nameof | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:28:10:28:10 | M | @@ -1119,6 +1154,11 @@ nodeEnclosing | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:28:10:28:10 | M | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | M1 | @@ -1208,6 +1248,11 @@ nodeEnclosing | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | exit Conditions | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | IncrOrDecr | @@ -1603,6 +1648,11 @@ nodeEnclosing | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:143:10:143:12 | M11 | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | M1 | | ExitMethods.cs:8:10:8:11 | exit M1 | ExitMethods.cs:8:10:8:11 | M1 | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:8:10:8:11 | M1 | @@ -1832,6 +1882,11 @@ nodeEnclosing | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:20:17:20:20 | Main | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:20:17:20:20 | Main | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:20:17:20:20 | Main | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | exit Finally | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:7:10:7:11 | M1 | @@ -2309,6 +2364,21 @@ nodeEnclosing | Finally.cs:167:35:167:36 | "" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | exit ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | exit ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | M9 | @@ -2596,6 +2666,11 @@ nodeEnclosing | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | 3 | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:263:10:263:12 | M13 | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | M1 | @@ -2653,6 +2728,10 @@ nodeEnclosing | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | Initializers | +| Initializers.cs:3:7:3:18 | exit Initializers | Initializers.cs:3:7:3:18 | Initializers | +| Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | Initializers | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | Initializers | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:8:5:8:16 | Initializers | @@ -2707,9 +2786,11 @@ nodeEnclosing | Initializers.cs:15:39:15:39 | access to local variable i | Initializers.cs:12:10:12:10 | M | | Initializers.cs:15:42:15:61 | object creation of type Initializers | Initializers.cs:12:10:12:10 | M | | Initializers.cs:15:59:15:60 | "" | Initializers.cs:12:10:12:10 | M | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | exit NoConstructor | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | NoConstructor | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:20:11:20:23 | NoConstructor | @@ -2751,6 +2832,16 @@ nodeEnclosing | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:9:35:11 | Sub | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | exit IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | exit Compound | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:51:10:51:13 | exit Test | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:51:10:51:13 | Test | @@ -2856,6 +2947,11 @@ nodeEnclosing | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:51:10:51:13 | Test | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | M1 | @@ -3060,6 +3156,16 @@ nodeEnclosing | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:94:10:94:12 | M11 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -3224,6 +3330,16 @@ nodeEnclosing | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationB.cs:18:12:18:13 | C2 | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationB.cs:18:12:18:13 | C2 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | @@ -3234,6 +3350,16 @@ nodeEnclosing | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | @@ -3254,6 +3380,16 @@ nodeEnclosing | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:9:37:10 | M2 | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | M2 | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:9:37:10 | M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -3415,12 +3551,32 @@ nodeEnclosing | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:18:12:18:13 | C2 | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:18:12:18:13 | C2 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | @@ -3431,6 +3587,11 @@ nodeEnclosing | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | M1 | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:9:3:10 | M1 | @@ -3522,6 +3683,11 @@ nodeEnclosing | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:12:4:18 | Partial | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:4:12:4:18 | Partial | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | exit Patterns | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:5:10:5:11 | exit M1 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:5:10:5:11 | M1 | @@ -3731,6 +3897,11 @@ nodeEnclosing | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:93:17:93:19 | M10 | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | exit PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | M1 | | PostDominance.cs:5:10:5:11 | exit M1 | PostDominance.cs:5:10:5:11 | M1 | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:5:10:5:11 | M1 | @@ -3767,6 +3938,11 @@ nodeEnclosing | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:17:10:17:11 | M3 | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | Method | | Qualifiers.cs:7:16:7:21 | exit Method | Qualifiers.cs:7:16:7:21 | Method | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:16:7:21 | Method | @@ -3833,6 +4009,11 @@ nodeEnclosing | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:10:10:10:10 | M | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:10:10:10:10 | M | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:10:10:10:10 | M | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | exit Switch | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | M1 | | Switch.cs:5:10:5:11 | exit M1 | Switch.cs:5:10:5:11 | M1 | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:5:10:5:11 | M1 | @@ -4108,6 +4289,11 @@ nodeEnclosing | Switch.cs:160:38:160:47 | $"..." | Switch.cs:154:10:154:12 | M15 | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:154:10:154:12 | M15 | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:154:10:154:12 | M15 | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:3:10:3:10 | M | @@ -4129,6 +4315,11 @@ nodeEnclosing | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:3:10:3:10 | M | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | exit VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | M1 | | VarDecls.cs:5:18:5:19 | exit M1 | VarDecls.cs:5:18:5:19 | M1 | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:5:18:5:19 | M1 | @@ -4178,6 +4369,11 @@ nodeEnclosing | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | exit C | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | Dispose | | VarDecls.cs:28:41:28:47 | exit Dispose | VarDecls.cs:28:41:28:47 | Dispose | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:41:28:47 | Dispose | @@ -4846,6 +5042,11 @@ nodeEnclosing | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:5:286:18 | ControlFlowSub | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:5:286:18 | ControlFlowSub | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | ControlFlowSub | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | exit DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | M | | cflow.cs:291:12:291:12 | exit M | cflow.cs:291:12:291:12 | M | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:12:291:12 | M | @@ -4874,6 +5075,11 @@ nodeEnclosing | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:298:10:298:10 | M | | cflow.cs:300:61:300:64 | null | cflow.cs:298:10:298:10 | M | | cflow.cs:300:70:300:71 | "" | cflow.cs:298:10:298:10 | M | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | exit LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | get__getter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | get__getter | @@ -4888,6 +5094,7 @@ nodeEnclosing | cflow.cs:309:9:309:17 | return ...; | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:306:60:310:5 | (...) => ... | blockEnclosing +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | set_Item | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | add_Event | @@ -4901,10 +5108,12 @@ blockEnclosing | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | M7 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | M8 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | M9 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | M1 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | M2 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | M3 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | M4 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:7:10:7:11 | M1 | @@ -5078,9 +5287,11 @@ blockEnclosing | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | M | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | (...) => ... | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | + | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:3:10:3:11 | M1 | @@ -5117,11 +5328,14 @@ blockEnclosing | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | M4 | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | Default | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | Sizeof | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | Typeof | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | M | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:12:3:13 | M1 | @@ -5158,6 +5372,7 @@ blockEnclosing | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | M8 | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:32:10:32:11 | M8 | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:3:10:3:19 | IncrOrDecr | @@ -5260,6 +5475,7 @@ blockEnclosing | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:143:10:143:12 | M11 | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | M1 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | M2 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | M3 | @@ -5312,6 +5528,7 @@ blockEnclosing | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | ToBool | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | CallToInt32 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | Main | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | M1 | @@ -5449,6 +5666,9 @@ blockEnclosing | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | M9 | @@ -5537,6 +5757,7 @@ blockEnclosing | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | M13 | | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:263:10:263:12 | M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | M13 | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | M1 | @@ -5564,6 +5785,7 @@ blockEnclosing | Foreach.cs:36:10:36:11 | exit M6 (normal) | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | M | @@ -5571,7 +5793,10 @@ blockEnclosing | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | Sub | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | Test | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:7:10:7:11 | M1 | @@ -5617,6 +5842,12 @@ blockEnclosing | LoopUnrolling.cs:94:10:94:12 | enter M11 | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:94:10:94:12 | M11 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -5690,8 +5921,20 @@ blockEnclosing | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationB.cs:21:28:21:35 | implicit conversion | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | @@ -5699,6 +5942,12 @@ blockEnclosing | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -5772,14 +6021,27 @@ blockEnclosing | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:28:21:35 | implicit conversion | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | M1 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:9:3:10 | M1 | @@ -5819,6 +6081,7 @@ blockEnclosing | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | Partial | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:5:10:5:11 | M1 | @@ -5912,6 +6175,7 @@ blockEnclosing | Patterns.cs:95:29:95:38 | [no-match] ... or ... | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:93:17:93:19 | M10 | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | M1 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | M2 | | PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | M2 | @@ -5925,9 +6189,11 @@ blockEnclosing | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | M3 | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | Method | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | StaticMethod | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | M | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | M1 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | M2 | | Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | M2 | @@ -6038,17 +6304,20 @@ blockEnclosing | Switch.cs:156:50:156:52 | "b" | Switch.cs:154:10:154:12 | M15 | | Switch.cs:158:13:158:49 | ...; | Switch.cs:154:10:154:12 | M15 | | Switch.cs:160:13:160:49 | ...; | Switch.cs:154:10:154:12 | M15 | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | M | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | M1 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | M2 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | Dispose | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | Main | | cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | Main | @@ -6220,6 +6489,7 @@ blockEnclosing | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | ControlFlowSub | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | ControlFlowSub | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | M | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | NegationInConstructor | | cflow.cs:298:10:298:10 | enter M | cflow.cs:298:10:298:10 | M | @@ -6227,5 +6497,6 @@ blockEnclosing | cflow.cs:300:44:300:51 | [true] !... | cflow.cs:298:10:298:10 | M | | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:298:10:298:10 | M | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:298:10:298:10 | M | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | get__getter | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected index 62edcbee351..34f82a9381f 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected @@ -1,3 +1,5 @@ +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | {...} | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:37:5:39 | {...} | | AccessorCalls.cs:7:36:7:38 | {...} | AccessorCalls.cs:7:36:7:38 | {...} | @@ -287,6 +289,8 @@ | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:78:73:78 | access to local variable d | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:78:73:78 | access to local variable d | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:80:73:80 | 1 | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | {...} | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | ArrayCreation.cs:5:28:5:28 | 0 | @@ -307,6 +311,8 @@ | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:45:9:45 | 2 | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:45:9:45 | 2 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:48:9:48 | 3 | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | {...} | | Assert.cs:8:5:12:5 | {...} | Assert.cs:8:5:12:5 | {...} | | Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:9:9:33 | ... ...; | | Assert.cs:9:16:9:32 | String s = ... | Assert.cs:9:20:9:20 | access to parameter b | @@ -668,6 +674,8 @@ | Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:29:140:30 | access to parameter b2 | | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:33:140:34 | access to parameter b3 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:141:9:141:15 | return ...; | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | {...} | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:9:5:18 | ... ...; | | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:17:5:17 | 0 | @@ -706,6 +714,8 @@ | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:18:5:20:5 | {...} | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:16:19:16 | access to parameter x | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | {...} | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:5:9:17:9 | try {...} ... | | BreakInTry.cs:6:9:12:9 | {...} | BreakInTry.cs:6:9:12:9 | {...} | @@ -780,6 +790,8 @@ | BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:67:21:67:23 | access to local variable arg | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:28:67:31 | null | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | {...} | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:7:16:7:27 | default(...) | | CompileTimeOperators.cs:7:16:7:27 | default(...) | CompileTimeOperators.cs:7:16:7:27 | default(...) | @@ -793,6 +805,8 @@ | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | {...} | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:31:9:34:9 | {...} | @@ -811,6 +825,8 @@ | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:14:40:38 | ...; | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:32:40:36 | "End" | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | {...} | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:40:3:49 | call to method ToLower | ConditionalAccess.cs:3:26:3:26 | access to parameter i | @@ -869,6 +885,8 @@ | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:75:41:78 | ", " | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | {...} | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:5:9:6:16 | if (...) ... | | Conditions.cs:5:13:5:15 | access to parameter inc | Conditions.cs:5:13:5:15 | access to parameter inc | @@ -1146,6 +1164,8 @@ | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:40:149:43 | "b = " | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:40:149:43 | "b = " | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:45:149:45 | access to local variable s | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | {...} | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:10:20:10:23 | true | | ExitMethods.cs:10:9:10:25 | ...; | ExitMethods.cs:10:9:10:25 | ...; | @@ -1313,6 +1333,8 @@ | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:34 | ...; | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | access to method Parse | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | access to method Parse | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | {...} | | Finally.cs:8:5:17:5 | {...} | Finally.cs:8:5:17:5 | {...} | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:9:9:16:9 | try {...} ... | | Finally.cs:10:9:12:9 | {...} | Finally.cs:10:9:12:9 | {...} | @@ -1522,6 +1544,12 @@ | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:35:167:36 | "" | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:17:167:38 | ...; | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:35:167:36 | "" | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | {...} | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | {...} | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | {...} | | Finally.cs:177:5:193:5 | {...} | Finally.cs:177:5:193:5 | {...} | | Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | | Finally.cs:179:9:181:9 | {...} | Finally.cs:179:9:181:9 | {...} | @@ -1636,6 +1664,8 @@ | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:19 | ...; | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | {...} | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:29:8:32 | access to parameter args | | Foreach.cs:8:22:8:24 | String arg | Foreach.cs:8:22:8:24 | String arg | @@ -1675,6 +1705,7 @@ | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:33:38:33 | Int32 y | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:39:38:42 | access to parameter args | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:39:11:39:11 | ; | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | {...} | | Initializers.cs:5:9:5:9 | access to field F | Initializers.cs:5:9:5:9 | this access | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:9:5:9 | this access | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:9:5:9 | this access | @@ -1711,6 +1742,8 @@ | Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:59:15:60 | "" | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:20:18:20 | 1 | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to constructor Object | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | {...} | | Initializers.cs:22:23:22:23 | access to field F | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:23:22:23 | this access | @@ -1746,6 +1779,10 @@ | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:33:35:33 | access to parameter i | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:33:35:33 | access to parameter i | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:37:35:37 | access to parameter j | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | {...} | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | {...} | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:52:5:66:5 | {...} | | Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:9:54:96 | ... ...; | | Initializers.cs:54:13:54:95 | Dictionary dict = ... | Initializers.cs:54:20:54:95 | object creation of type Dictionary | @@ -1853,6 +1890,8 @@ | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:50:64:50 | access to parameter i | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:54:64:54 | 0 | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:59:64:61 | "1" | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | {...} | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:9:9:10:19 | if (...) ... | | LoopUnrolling.cs:9:13:9:16 | access to parameter args | LoopUnrolling.cs:9:13:9:16 | access to parameter args | @@ -2025,6 +2064,8 @@ | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:13:99:33 | ...; | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:31:99:31 | access to local variable x | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | {...} | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:25:7:39 | {...} | @@ -2064,14 +2105,20 @@ | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:16:24:16 | this access | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:34:24:34 | 0 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | {...} | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:34:30:37 | null | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | {...} | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:22:36:25 | null | | MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:22:36:25 | null | | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:14:37:28 | {...} | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:22:37:25 | null | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | {...} | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:25:4:37 | {...} | | MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationB.cs:4:34:4:34 | 1 | @@ -2109,7 +2156,13 @@ | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:16:22:16 | this access | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:16:22:16 | this access | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:34:22:34 | 1 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | {...} | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | {...} | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | @@ -2170,6 +2223,8 @@ | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:34:5:34 | 0 | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to constructor Object | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | {...} | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:9:7:24 | ... ...; | | Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:20:7:23 | null | @@ -2335,6 +2390,8 @@ | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:13:97:39 | ...; | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:31:97:37 | "not C" | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | {...} | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:7:27:7:27 | access to parameter s | | PostDominance.cs:7:9:7:29 | ...; | PostDominance.cs:7:9:7:29 | ...; | @@ -2360,6 +2417,8 @@ | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:29 | ...; | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:27:21:27 | access to parameter s | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | {...} | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:41:8:44 | null | | Qualifiers.cs:11:5:31:5 | {...} | Qualifiers.cs:11:5:31:5 | {...} | @@ -2417,6 +2476,8 @@ | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:9:30:47 | ...; | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | {...} | | Switch.cs:6:5:8:5 | {...} | Switch.cs:6:5:8:5 | {...} | | Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:9:7:22 | switch (...) {...} | | Switch.cs:7:17:7:17 | access to parameter o | Switch.cs:7:17:7:17 | access to parameter o | @@ -2641,6 +2702,8 @@ | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:40:160:43 | "b = " | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:40:160:43 | "b = " | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:45:160:45 | access to local variable s | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:4:5:9:5 | {...} | | TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:9:5:26 | ... ...; | | TypeAccesses.cs:5:13:5:25 | String s = ... | TypeAccesses.cs:5:25:5:25 | access to parameter o | @@ -2658,6 +2721,8 @@ | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:9:8:28 | ... ...; | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:17:8:27 | typeof(...) | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | {...} | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | | VarDecls.cs:7:22:7:36 | Char* c1 = ... | VarDecls.cs:7:27:7:33 | access to parameter strings | @@ -2698,6 +2763,8 @@ | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:20:25:20 | access to parameter b | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | {...} | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:51:28:53 | {...} | | cflow.cs:6:5:35:5 | {...} | cflow.cs:6:5:35:5 | {...} | | cflow.cs:7:9:7:28 | ... ...; | cflow.cs:7:9:7:28 | ... ...; | @@ -3282,6 +3349,8 @@ | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:48:286:50 | {...} | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | {...} | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:40:291:40 | 0 | @@ -3300,6 +3369,8 @@ | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:61:300:64 | null | cflow.cs:300:61:300:64 | null | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:70:300:71 | "" | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | {...} | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:307:5:310:5 | {...} | cflow.cs:307:5:310:5 | {...} | | cflow.cs:308:9:308:21 | ... ...; | cflow.cs:308:9:308:21 | ... ...; | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected index 77a49dbfc47..573d08853b2 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected @@ -1,3 +1,5 @@ +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to constructor Object | normal | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | {...} | normal | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:30:5:30 | access to parameter i | normal | | AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:37:5:39 | {...} | normal | | AccessorCalls.cs:7:36:7:38 | {...} | AccessorCalls.cs:7:36:7:38 | {...} | normal | @@ -287,6 +289,8 @@ | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:78:73:78 | access to local variable d | normal | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:78:73:81 | dynamic access to element | normal | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:80:73:80 | 1 | normal | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to constructor Object | normal | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | {...} | normal | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | normal | | ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:27:3:27 | 0 | normal | | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | normal | @@ -307,6 +311,8 @@ | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:43:9:50 | { ..., ... } | normal | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:45:9:45 | 2 | normal | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:48:9:48 | 3 | normal | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to constructor Object | normal | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | {...} | normal | | Assert.cs:8:5:12:5 | {...} | Assert.cs:10:9:10:31 | call to method Assert | exit | | Assert.cs:8:5:12:5 | {...} | Assert.cs:11:9:11:35 | call to method WriteLine | normal | | Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:16:9:32 | String s = ... | normal | @@ -801,6 +807,8 @@ | Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:29:140:30 | access to parameter b2 | true | | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:33:140:34 | access to parameter b3 | normal | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:141:9:141:15 | return ...; | return | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to constructor Object | normal | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | {...} | normal | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:14:9:14:35 | ... += ... | normal | | Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | @@ -839,6 +847,8 @@ | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:19:9:19:17 | return ...; | return | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:9:19:17 | return ...; | return | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:16:19:16 | access to parameter x | normal | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to constructor Object | normal | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | {...} | normal | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:15:17:15:28 | ... == ... | false | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:16:17:16:17 | ; | normal | | BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:15:17:15:28 | ... == ... | false | @@ -964,6 +974,8 @@ | BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:67:21:67:31 | ... == ... | true | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:28:67:31 | null | normal | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | break | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | normal | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | {...} | normal | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | | CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | | CompileTimeOperators.cs:7:16:7:27 | default(...) | CompileTimeOperators.cs:7:16:7:27 | default(...) | normal | @@ -977,6 +989,8 @@ | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:9:22:25 | return ...; | return | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | normal | | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | normal | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | normal | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | {...} | normal | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | goto(End) [normal] (0) | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | throw(Exception) [normal] (0) | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | @@ -1003,6 +1017,8 @@ | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:32:40:36 | "End" | normal | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | normal | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | {...} | normal | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | non-null | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | @@ -1087,6 +1103,8 @@ | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:70:41:83 | ... + ... | normal | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:75:41:78 | ", " | normal | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | normal | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to constructor Object | normal | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | {...} | normal | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:7:13:7:16 | !... | false | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:8:13:8:15 | ...-- | normal | | Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:5:13:5:15 | access to parameter inc | false | @@ -1440,6 +1458,8 @@ | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:38:149:47 | $"..." | normal | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:40:149:43 | "b = " | normal | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:45:149:45 | access to local variable s | normal | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to constructor Object | normal | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | {...} | normal | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:11:9:11:15 | return ...; | return | | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | normal | | ExitMethods.cs:10:9:10:25 | ...; | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | normal | @@ -1641,6 +1661,8 @@ | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:33 | call to method ToBool | normal | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | access to method Parse | normal | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | delegate creation of type Func | normal | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to constructor Object | normal | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | {...} | normal | | Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | normal | | Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | throw(Exception) [normal] (0) | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:15:13:15:40 | call to method WriteLine | normal | @@ -2028,6 +2050,12 @@ | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:17:167:37 | call to method WriteLine | normal | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:17:167:37 | call to method WriteLine | normal | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:35:167:36 | "" | normal | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to constructor Exception | normal | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | {...} | normal | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to constructor Exception | normal | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | {...} | normal | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to constructor Exception | normal | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | {...} | normal | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | false | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | throw(Exception) [false] (0) | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | throw(ExceptionA) [false] (0) | @@ -2271,6 +2299,8 @@ | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... = ... | normal | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:18 | ... = ... | normal | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | normal | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | normal | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | {...} | normal | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | | Foreach.cs:8:22:8:24 | String arg | Foreach.cs:8:22:8:24 | String arg | normal | @@ -2313,6 +2343,7 @@ | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:33:38:33 | Int32 y | normal | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:39:38:42 | access to parameter args | normal | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:39:11:39:11 | ; | normal | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | {...} | normal | | Initializers.cs:5:9:5:9 | access to field F | Initializers.cs:5:9:5:9 | this access | normal | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:9:5:9 | this access | normal | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:9:5:17 | ... = ... | normal | @@ -2349,6 +2380,8 @@ | Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:59:15:60 | "" | normal | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:20 | ... = ... | normal | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 | normal | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to constructor Object | normal | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | {...} | normal | | Initializers.cs:22:23:22:23 | access to field F | Initializers.cs:22:23:22:23 | this access | normal | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:23:22:23 | this access | normal | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:23:22:27 | ... = ... | normal | @@ -2384,6 +2417,10 @@ | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:33:35:33 | access to parameter i | normal | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:33:35:37 | ... + ... | normal | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:37:35:37 | access to parameter j | normal | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to constructor Object | normal | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | {...} | normal | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to constructor Object | normal | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | {...} | normal | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:57:13:65:9 | Compound compound = ... | normal | | Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:13:54:95 | Dictionary dict = ... | normal | | Initializers.cs:54:13:54:95 | Dictionary dict = ... | Initializers.cs:54:13:54:95 | Dictionary dict = ... | normal | @@ -2491,6 +2528,8 @@ | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:50:64:54 | ... + ... | normal | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:54:64:54 | 0 | normal | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:59:64:61 | "1" | normal | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | normal | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | {...} | normal | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:10:13:10:19 | return ...; | return | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | empty | | LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:9:13:9:28 | ... == ... | false | @@ -2677,6 +2716,8 @@ | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:31:99:31 | access to local variable x | normal | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | normal | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | {...} | normal | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | throw ... | throw(NullReferenceException) | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | normal | | MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:27:7:37 | throw ...; | throw(NullReferenceException) | @@ -2716,14 +2757,20 @@ | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:16:24:16 | this access | normal | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:32:24:34 | ... = ... | normal | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:34:24:34 | 0 | normal | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | normal | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | {...} | normal | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:28:30:37 | throw ... | throw(NullReferenceException) | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:34:30:37 | null | normal | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | normal | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | {...} | normal | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:22:36:25 | null | normal | | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:16:37:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:16:37:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:22:37:25 | null | normal | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | normal | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | {...} | normal | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | normal | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:27:4:35 | return ...; | return | | MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationB.cs:4:27:4:35 | return ...; | return | @@ -2761,7 +2808,13 @@ | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:16:22:16 | this access | normal | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:32:22:34 | ... = ... | normal | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:34:22:34 | 1 | normal | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | normal | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | {...} | normal | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | normal | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | {...} | normal | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | normal | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to constructor Object | normal | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | {...} | normal | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | non-null | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | null | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:28 | ... ?? ... | normal | @@ -2838,6 +2891,8 @@ | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:16:5:16 | this access | normal | | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:32:5:34 | ... = ... | normal | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:34:5:34 | 0 | normal | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to constructor Object | normal | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | {...} | normal | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:40:17:40:17 | access to local variable o | normal | | Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:16:7:23 | Object o = ... | normal | | Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:16:7:23 | Object o = ... | normal | @@ -3063,6 +3118,8 @@ | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:31:97:37 | "not C" | normal | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to constructor Object | normal | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | {...} | normal | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | | PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | | PostDominance.cs:7:9:7:29 | ...; | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | @@ -3096,6 +3153,8 @@ | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:27:21:27 | access to parameter s | normal | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to constructor Object | normal | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | {...} | normal | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:28:7:31 | null | normal | | Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:41:8:44 | null | normal | | Qualifiers.cs:11:5:31:5 | {...} | Qualifiers.cs:30:9:30:46 | ... = ... | normal | @@ -3153,6 +3212,8 @@ | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:9:30:46 | ... = ... | normal | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | normal | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:46 | call to method Method | normal | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to constructor Object | normal | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | {...} | normal | | Switch.cs:6:5:8:5 | {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | | Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | | Switch.cs:7:17:7:17 | access to parameter o | Switch.cs:7:17:7:17 | access to parameter o | normal | @@ -3511,6 +3572,8 @@ | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:38:160:47 | $"..." | normal | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:40:160:43 | "b = " | normal | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:45:160:45 | access to local variable s | normal | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object | normal | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} | normal | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:13:5:25 | String s = ... | normal | | TypeAccesses.cs:5:13:5:25 | String s = ... | TypeAccesses.cs:5:13:5:25 | String s = ... | normal | @@ -3531,6 +3594,8 @@ | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:17:8:27 | typeof(...) | normal | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to constructor Object | normal | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | {...} | normal | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:9:13:9:29 | return ...; | return | | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:9:13:9:29 | return ...; | return | | VarDecls.cs:7:22:7:36 | Char* c1 = ... | VarDecls.cs:7:22:7:36 | Char* c1 = ... | normal | @@ -3572,6 +3637,8 @@ | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:20:25:28 | ... ? ... : ... | normal | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | normal | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | normal | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to constructor Object | normal | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | {...} | normal | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:51:28:53 | {...} | normal | | cflow.cs:6:5:35:5 | {...} | cflow.cs:24:25:24:31 | ... <= ... | false | | cflow.cs:7:9:7:28 | ... ...; | cflow.cs:7:13:7:27 | Int32 a = ... | normal | @@ -4287,6 +4354,8 @@ | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:34 | access to parameter i | normal | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:45 | call to method ToString | normal | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:48:286:50 | {...} | normal | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to constructor Object | normal | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | {...} | normal | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:38:291:38 | access to parameter f | normal | | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:38:291:41 | delegate call | normal | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:40:291:40 | 0 | normal | @@ -4307,6 +4376,8 @@ | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:56:300:64 | ... != ... | normal | | cflow.cs:300:61:300:64 | null | cflow.cs:300:61:300:64 | null | normal | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:70:300:71 | "" | normal | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to constructor Object | normal | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | {...} | normal | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | normal | | cflow.cs:307:5:310:5 | {...} | cflow.cs:309:9:309:17 | return ...; | return | | cflow.cs:308:9:308:21 | ... ...; | cflow.cs:308:16:308:20 | Object x = ... | normal | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index d5c2e78587d..502acfb87b7 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -1,4 +1,18 @@ AccessorCalls.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter AccessorCalls +#-----| -> call to constructor Object + +# 1| exit AccessorCalls + +# 1| exit AccessorCalls (normal) +#-----| -> exit AccessorCalls + +# 1| {...} +#-----| -> exit AccessorCalls (normal) + # 5| enter get_Item #-----| -> access to parameter i @@ -929,6 +943,20 @@ AccessorCalls.cs: #-----| -> dynamic access to element ArrayCreation.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter ArrayCreation +#-----| -> call to constructor Object + +# 1| exit ArrayCreation + +# 1| exit ArrayCreation (normal) +#-----| -> exit ArrayCreation + +# 1| {...} +#-----| -> exit ArrayCreation (normal) + # 3| enter M1 #-----| -> 0 @@ -1022,6 +1050,20 @@ ArrayCreation.cs: #-----| -> { ..., ... } Assert.cs: +# 5| call to constructor Object +#-----| -> {...} + +# 5| enter AssertTests +#-----| -> call to constructor Object + +# 5| exit AssertTests + +# 5| exit AssertTests (normal) +#-----| -> exit AssertTests + +# 5| {...} +#-----| -> exit AssertTests (normal) + # 7| enter M1 #-----| -> {...} @@ -2794,6 +2836,20 @@ Assert.cs: #-----| return -> exit M13 (normal) Assignments.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter Assignments +#-----| -> call to constructor Object + +# 1| exit Assignments + +# 1| exit Assignments (normal) +#-----| -> exit Assignments + +# 1| {...} +#-----| -> exit Assignments (normal) + # 3| enter M #-----| -> {...} @@ -2924,6 +2980,20 @@ Assignments.cs: #-----| -> return ...; BreakInTry.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter BreakInTry +#-----| -> call to constructor Object + +# 1| exit BreakInTry + +# 1| exit BreakInTry (normal) +#-----| -> exit BreakInTry + +# 1| {...} +#-----| -> exit BreakInTry (normal) + # 3| enter M1 #-----| -> {...} @@ -3274,6 +3344,20 @@ BreakInTry.cs: #-----| break -> exit M4 (normal) CompileTimeOperators.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter CompileTimeOperators +#-----| -> call to constructor Object + +# 3| exit CompileTimeOperators + +# 3| exit CompileTimeOperators (normal) +#-----| -> exit CompileTimeOperators + +# 3| {...} +#-----| -> exit CompileTimeOperators (normal) + # 5| enter Default #-----| -> {...} @@ -3342,6 +3426,20 @@ CompileTimeOperators.cs: # 22| nameof(...) #-----| -> return ...; +# 26| call to constructor Object +#-----| -> {...} + +# 26| enter GotoInTryFinally +#-----| -> call to constructor Object + +# 26| exit GotoInTryFinally + +# 26| exit GotoInTryFinally (normal) +#-----| -> exit GotoInTryFinally + +# 26| {...} +#-----| -> exit GotoInTryFinally (normal) + # 28| enter M #-----| -> {...} @@ -3387,6 +3485,20 @@ CompileTimeOperators.cs: #-----| -> call to method WriteLine ConditionalAccess.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter ConditionalAccess +#-----| -> call to constructor Object + +# 1| exit ConditionalAccess + +# 1| exit ConditionalAccess (normal) +#-----| -> exit ConditionalAccess + +# 1| {...} +#-----| -> exit ConditionalAccess (normal) + # 3| enter M1 #-----| -> access to parameter i @@ -3657,6 +3769,20 @@ ConditionalAccess.cs: #-----| -> ... + ... Conditions.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter Conditions +#-----| -> call to constructor Object + +# 1| exit Conditions + +# 1| exit Conditions (normal) +#-----| -> exit Conditions + +# 1| {...} +#-----| -> exit Conditions (normal) + # 3| enter IncrOrDecr #-----| -> {...} @@ -4866,6 +4992,20 @@ Conditions.cs: #-----| -> $"..." ExitMethods.cs: +# 6| call to constructor Object +#-----| -> {...} + +# 6| enter ExitMethods +#-----| -> call to constructor Object + +# 6| exit ExitMethods + +# 6| exit ExitMethods (normal) +#-----| -> exit ExitMethods + +# 6| {...} +#-----| -> exit ExitMethods (normal) + # 8| enter M1 #-----| -> {...} @@ -5537,6 +5677,20 @@ Extensions.cs: #-----| -> call to method ToBool Finally.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter Finally +#-----| -> call to constructor Object + +# 3| exit Finally + +# 3| exit Finally (normal) +#-----| -> exit Finally + +# 3| {...} +#-----| -> exit Finally (normal) + # 7| enter M1 #-----| -> {...} @@ -7019,6 +7173,48 @@ Finally.cs: # 167| [finally: exception(Exception)] "" #-----| -> [finally: exception(Exception)] call to method WriteLine +# 172| call to constructor Exception +#-----| -> {...} + +# 172| enter ExceptionA +#-----| -> call to constructor Exception + +# 172| exit ExceptionA + +# 172| exit ExceptionA (normal) +#-----| -> exit ExceptionA + +# 172| {...} +#-----| -> exit ExceptionA (normal) + +# 173| call to constructor Exception +#-----| -> {...} + +# 173| enter ExceptionB +#-----| -> call to constructor Exception + +# 173| exit ExceptionB + +# 173| exit ExceptionB (normal) +#-----| -> exit ExceptionB + +# 173| {...} +#-----| -> exit ExceptionB (normal) + +# 174| call to constructor Exception +#-----| -> {...} + +# 174| enter ExceptionC +#-----| -> call to constructor Exception + +# 174| exit ExceptionC + +# 174| exit ExceptionC (normal) +#-----| -> exit ExceptionC + +# 174| {...} +#-----| -> exit ExceptionC (normal) + # 176| enter M9 #-----| -> {...} @@ -7915,6 +8111,20 @@ Finally.cs: #-----| -> [finally: exception(Exception)] ... + ... Foreach.cs: +# 4| call to constructor Object +#-----| -> {...} + +# 4| enter Foreach +#-----| -> call to constructor Object + +# 4| exit Foreach + +# 4| exit Foreach (normal) +#-----| -> exit Foreach + +# 4| {...} +#-----| -> exit Foreach (normal) + # 6| enter M1 #-----| -> {...} @@ -8089,6 +8299,17 @@ Foreach.cs: #-----| -> foreach (... ... in ...) ... Initializers.cs: +# 3| enter Initializers +#-----| -> {...} + +# 3| exit Initializers + +# 3| exit Initializers (normal) +#-----| -> exit Initializers + +# 3| {...} +#-----| -> exit Initializers (normal) + # 5| this access #-----| -> access to field H @@ -8262,14 +8483,20 @@ Initializers.cs: # 18| 1 #-----| -> ... = ... -# 20| enter NoConstructor +# 20| call to constructor Object #-----| -> this access +# 20| enter NoConstructor +#-----| -> call to constructor Object + # 20| exit NoConstructor # 20| exit NoConstructor (normal) #-----| -> exit NoConstructor +# 20| {...} +#-----| -> exit NoConstructor (normal) + # 22| this access #-----| -> 0 @@ -8283,7 +8510,7 @@ Initializers.cs: #-----| -> 1 # 23| ... = ... -#-----| -> exit NoConstructor (normal) +#-----| -> {...} # 23| 1 #-----| -> ... = ... @@ -8390,6 +8617,34 @@ Initializers.cs: # 35| access to parameter j #-----| -> ... + ... +# 39| call to constructor Object +#-----| -> {...} + +# 39| enter IndexInitializers +#-----| -> call to constructor Object + +# 39| exit IndexInitializers + +# 39| exit IndexInitializers (normal) +#-----| -> exit IndexInitializers + +# 39| {...} +#-----| -> exit IndexInitializers (normal) + +# 41| call to constructor Object +#-----| -> {...} + +# 41| enter Compound +#-----| -> call to constructor Object + +# 41| exit Compound + +# 41| exit Compound (normal) +#-----| -> exit Compound + +# 41| {...} +#-----| -> exit Compound (normal) + # 51| enter Test #-----| -> {...} @@ -8705,6 +8960,20 @@ Initializers.cs: #-----| -> ... = ... LoopUnrolling.cs: +# 5| call to constructor Object +#-----| -> {...} + +# 5| enter LoopUnrolling +#-----| -> call to constructor Object + +# 5| exit LoopUnrolling + +# 5| exit LoopUnrolling (normal) +#-----| -> exit LoopUnrolling + +# 5| {...} +#-----| -> exit LoopUnrolling (normal) + # 7| enter M1 #-----| -> {...} @@ -9320,6 +9589,13 @@ LoopUnrolling.cs: #-----| -> call to method WriteLine MultiImplementationA.cs: +# 4| call to constructor Object +#-----| -> {...} + +# 4| {...} +#-----| -> exit C1 (normal) +#-----| -> exit C1 (normal) + # 6| throw ... #-----| exception(NullReferenceException) -> exit get_P1 (abnormal) #-----| exception(NullReferenceException) -> exit get_P1 (abnormal) @@ -9381,6 +9657,12 @@ MultiImplementationA.cs: #-----| -> exit set_Item (normal) #-----| -> exit set_Item (normal) +# 16| exit M1 + +MultiImplementationB.cs: +# 14| exit M1 + +MultiImplementationA.cs: # 17| {...} #-----| -> M2(...) @@ -9448,6 +9730,13 @@ MultiImplementationA.cs: # 24| 0 #-----| -> access to property P +# 28| call to constructor Object +#-----| -> {...} + +# 28| {...} +#-----| -> exit C3 (normal) +#-----| -> exit C3 (normal) + # 30| throw ... #-----| exception(NullReferenceException) -> exit get_P3 (abnormal) #-----| exception(NullReferenceException) -> exit get_P3 (abnormal) @@ -9455,6 +9744,13 @@ MultiImplementationA.cs: # 30| null #-----| -> throw ... +# 34| call to constructor Object +#-----| -> {...} + +# 34| {...} +#-----| -> exit C4 (normal) +#-----| -> exit C4 (normal) + # 36| {...} #-----| -> null @@ -9483,6 +9779,39 @@ MultiImplementationA.cs: #-----| -> throw ...; MultiImplementationB.cs: +# 1| call to constructor Object +#-----| -> {...} + +MultiImplementationA.cs: +# 4| enter C1 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationB.cs: +# 1| enter C1 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationA.cs: +# 4| exit C1 + +MultiImplementationB.cs: +# 1| exit C1 + +MultiImplementationA.cs: +# 4| exit C1 (normal) +#-----| -> exit C1 +#-----| -> exit C1 + +MultiImplementationB.cs: +# 1| exit C1 (normal) +#-----| -> exit C1 +#-----| -> exit C1 + +# 1| {...} +#-----| -> exit C1 (normal) +#-----| -> exit C1 (normal) + # 3| 0 #-----| -> exit get_P1 (normal) #-----| -> exit get_P1 (normal) @@ -9787,12 +10116,6 @@ MultiImplementationB.cs: #-----| -> {...} #-----| -> {...} -MultiImplementationA.cs: -# 16| exit M1 - -MultiImplementationB.cs: -# 14| exit M1 - MultiImplementationA.cs: # 16| exit M1 (normal) #-----| -> exit M1 @@ -10010,6 +10333,39 @@ MultiImplementationB.cs: # 22| 1 #-----| -> access to property P +# 25| call to constructor Object +#-----| -> {...} + +MultiImplementationA.cs: +# 28| enter C3 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationB.cs: +# 25| enter C3 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationA.cs: +# 28| exit C3 + +MultiImplementationB.cs: +# 25| exit C3 + +MultiImplementationA.cs: +# 28| exit C3 (normal) +#-----| -> exit C3 +#-----| -> exit C3 + +MultiImplementationB.cs: +# 25| exit C3 (normal) +#-----| -> exit C3 +#-----| -> exit C3 + +# 25| {...} +#-----| -> exit C3 (normal) +#-----| -> exit C3 (normal) + MultiImplementationA.cs: # 30| enter get_P3 #-----| -> null @@ -10034,6 +10390,39 @@ MultiImplementationB.cs: #-----| -> exit get_P3 #-----| -> exit get_P3 +# 30| call to constructor Object +#-----| -> {...} + +MultiImplementationA.cs: +# 34| enter C4 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationB.cs: +# 30| enter C4 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationA.cs: +# 34| exit C4 + +MultiImplementationB.cs: +# 30| exit C4 + +MultiImplementationA.cs: +# 34| exit C4 (normal) +#-----| -> exit C4 +#-----| -> exit C4 + +MultiImplementationB.cs: +# 30| exit C4 (normal) +#-----| -> exit C4 +#-----| -> exit C4 + +# 30| {...} +#-----| -> exit C4 (normal) +#-----| -> exit C4 (normal) + MultiImplementationA.cs: # 36| enter M1 #-----| -> {...} @@ -10075,6 +10464,20 @@ MultiImplementationB.cs: #-----| -> exit M1 (normal) NullCoalescing.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter NullCoalescing +#-----| -> call to constructor Object + +# 1| exit NullCoalescing + +# 1| exit NullCoalescing (normal) +#-----| -> exit NullCoalescing + +# 1| {...} +#-----| -> exit NullCoalescing (normal) + # 3| enter M1 #-----| -> access to parameter i @@ -10355,6 +10758,20 @@ PartialImplementationB.cs: #-----| -> access to property P Patterns.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter Patterns +#-----| -> call to constructor Object + +# 3| exit Patterns + +# 3| exit Patterns (normal) +#-----| -> exit Patterns + +# 3| {...} +#-----| -> exit Patterns (normal) + # 5| enter M1 #-----| -> {...} @@ -10995,6 +11412,20 @@ Patterns.cs: #-----| -> call to method WriteLine PostDominance.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter PostDominance +#-----| -> call to constructor Object + +# 3| exit PostDominance + +# 3| exit PostDominance (normal) +#-----| -> exit PostDominance + +# 3| {...} +#-----| -> exit PostDominance (normal) + # 5| enter M1 #-----| -> {...} @@ -11103,6 +11534,20 @@ PostDominance.cs: #-----| -> call to method WriteLine Qualifiers.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter Qualifiers +#-----| -> call to constructor Object + +# 1| exit Qualifiers + +# 1| exit Qualifiers (normal) +#-----| -> exit Qualifiers + +# 1| {...} +#-----| -> exit Qualifiers (normal) + # 7| enter Method #-----| -> null @@ -11299,6 +11744,20 @@ Qualifiers.cs: #-----| -> ... = ... Switch.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter Switch +#-----| -> call to constructor Object + +# 3| exit Switch + +# 3| exit Switch (normal) +#-----| -> exit Switch + +# 3| {...} +#-----| -> exit Switch (normal) + # 5| enter M1 #-----| -> {...} @@ -12144,6 +12603,20 @@ Switch.cs: #-----| -> $"..." TypeAccesses.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter TypeAccesses +#-----| -> call to constructor Object + +# 1| exit TypeAccesses + +# 1| exit TypeAccesses (normal) +#-----| -> exit TypeAccesses + +# 1| {...} +#-----| -> exit TypeAccesses (normal) + # 3| enter M #-----| -> {...} @@ -12208,6 +12681,20 @@ TypeAccesses.cs: #-----| -> Type t = ... VarDecls.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter VarDecls +#-----| -> call to constructor Object + +# 3| exit VarDecls + +# 3| exit VarDecls (normal) +#-----| -> exit VarDecls + +# 3| {...} +#-----| -> exit VarDecls (normal) + # 5| enter M1 #-----| -> {...} @@ -12353,6 +12840,20 @@ VarDecls.cs: # 25| access to local variable y #-----| -> ... ? ... : ... +# 28| call to constructor Object +#-----| -> {...} + +# 28| enter C +#-----| -> call to constructor Object + +# 28| exit C + +# 28| exit C (normal) +#-----| -> exit C + +# 28| {...} +#-----| -> exit C (normal) + # 28| enter Dispose #-----| -> {...} @@ -14376,6 +14877,20 @@ cflow.cs: # 286| {...} #-----| -> exit ControlFlowSub (normal) +# 289| call to constructor Object +#-----| -> {...} + +# 289| enter DelegateCall +#-----| -> call to constructor Object + +# 289| exit DelegateCall + +# 289| exit DelegateCall (normal) +#-----| -> exit DelegateCall + +# 289| {...} +#-----| -> exit DelegateCall (normal) + # 291| enter M #-----| -> access to parameter f @@ -14458,6 +14973,20 @@ cflow.cs: # 300| "" #-----| -> object creation of type NegationInConstructor +# 304| call to constructor Object +#-----| -> {...} + +# 304| enter LambdaGetter +#-----| -> call to constructor Object + +# 304| exit LambdaGetter + +# 304| exit LambdaGetter (normal) +#-----| -> exit LambdaGetter + +# 304| {...} +#-----| -> exit LambdaGetter (normal) + # 306| (...) => ... #-----| -> exit get__getter (normal) diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql index dd6c58d68f7..62805d6e6c9 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql @@ -4,6 +4,9 @@ import csharp import Common -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl::TestOutput -private class MyRelevantNode extends RelevantNode, SourceControlFlowNode { } +private class MyRelevantNode extends SourceControlFlowNode { + string getOrderDisambiguation() { result = "" } +} + +import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl::TestOutput diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected index c5ffb215b4b..0dc443fa623 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1027,6 +1027,7 @@ finallyNode | cflow.cs:275:13:275:42 | [finally: return] ...; | cflow.cs:268:9:276:9 | try {...} ... | | cflow.cs:275:31:275:40 | [finally: return] "not dead" | cflow.cs:268:9:276:9 | try {...} ... | entryPoint +| AccessorCalls.cs:1:7:1:19 | AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object | | AccessorCalls.cs:5:23:5:25 | get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:33:5:35 | set_Item | AccessorCalls.cs:5:37:5:39 | {...} | | AccessorCalls.cs:7:32:7:34 | add_Event | AccessorCalls.cs:7:36:7:38 | {...} | @@ -1040,10 +1041,12 @@ entryPoint | AccessorCalls.cs:56:10:56:11 | M7 | AccessorCalls.cs:57:5:59:5 | {...} | | AccessorCalls.cs:61:10:61:11 | M8 | AccessorCalls.cs:62:5:64:5 | {...} | | AccessorCalls.cs:66:10:66:11 | M9 | AccessorCalls.cs:67:5:74:5 | {...} | +| ArrayCreation.cs:1:7:1:19 | ArrayCreation | ArrayCreation.cs:1:7:1:19 | call to constructor Object | | ArrayCreation.cs:3:11:3:12 | M1 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:5:12:5:13 | M2 | ArrayCreation.cs:5:28:5:28 | 0 | | ArrayCreation.cs:7:11:7:12 | M3 | ArrayCreation.cs:7:19:7:36 | 2 | | ArrayCreation.cs:9:12:9:13 | M4 | ArrayCreation.cs:9:20:9:52 | 2 | +| Assert.cs:5:7:5:17 | AssertTests | Assert.cs:5:7:5:17 | call to constructor Object | | Assert.cs:7:10:7:11 | M1 | Assert.cs:8:5:12:5 | {...} | | Assert.cs:14:10:14:11 | M2 | Assert.cs:15:5:19:5 | {...} | | Assert.cs:21:10:21:11 | M3 | Assert.cs:22:5:26:5 | {...} | @@ -1058,18 +1061,23 @@ entryPoint | Assert.cs:84:10:84:12 | M12 | Assert.cs:85:5:129:5 | {...} | | Assert.cs:131:18:131:32 | AssertTrueFalse | Assert.cs:135:5:136:5 | {...} | | Assert.cs:138:10:138:12 | M13 | Assert.cs:139:5:142:5 | {...} | +| Assignments.cs:1:7:1:17 | Assignments | Assignments.cs:1:7:1:17 | call to constructor Object | | Assignments.cs:3:10:3:10 | M | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:14:33:14:35 | {...} | | Assignments.cs:17:40:17:40 | + | Assignments.cs:18:5:20:5 | {...} | +| BreakInTry.cs:1:7:1:16 | BreakInTry | BreakInTry.cs:1:7:1:16 | call to constructor Object | | BreakInTry.cs:3:10:3:11 | M1 | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:20:10:20:11 | M2 | BreakInTry.cs:21:5:36:5 | {...} | | BreakInTry.cs:38:10:38:11 | M3 | BreakInTry.cs:39:5:54:5 | {...} | | BreakInTry.cs:56:10:56:11 | M4 | BreakInTry.cs:57:5:71:5 | {...} | +| CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | | CompileTimeOperators.cs:5:9:5:15 | Default | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:10:9:10:14 | Sizeof | CompileTimeOperators.cs:11:5:13:5 | {...} | | CompileTimeOperators.cs:15:10:15:15 | Typeof | CompileTimeOperators.cs:16:5:18:5 | {...} | | CompileTimeOperators.cs:20:12:20:17 | Nameof | CompileTimeOperators.cs:21:5:23:5 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | | CompileTimeOperators.cs:28:10:28:10 | M | CompileTimeOperators.cs:29:5:41:5 | {...} | +| ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | | ConditionalAccess.cs:3:12:3:13 | M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:5:10:5:11 | M2 | ConditionalAccess.cs:5:26:5:26 | access to parameter s | | ConditionalAccess.cs:7:10:7:11 | M3 | ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | @@ -1080,6 +1088,7 @@ entryPoint | ConditionalAccess.cs:30:10:30:12 | Out | ConditionalAccess.cs:30:32:30:32 | 0 | | ConditionalAccess.cs:32:10:32:11 | M8 | ConditionalAccess.cs:33:5:36:5 | {...} | | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | +| Conditions.cs:1:7:1:16 | Conditions | Conditions.cs:1:7:1:16 | call to constructor Object | | Conditions.cs:3:10:3:19 | IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:11:9:11:10 | M1 | Conditions.cs:12:5:20:5 | {...} | | Conditions.cs:22:9:22:10 | M2 | Conditions.cs:23:5:31:5 | {...} | @@ -1092,6 +1101,7 @@ entryPoint | Conditions.cs:113:10:113:11 | M9 | Conditions.cs:114:5:124:5 | {...} | | Conditions.cs:129:10:129:12 | M10 | Conditions.cs:130:5:141:5 | {...} | | Conditions.cs:143:10:143:12 | M11 | Conditions.cs:144:5:150:5 | {...} | +| ExitMethods.cs:6:7:6:17 | ExitMethods | ExitMethods.cs:6:7:6:17 | call to constructor Object | | ExitMethods.cs:8:10:8:11 | M1 | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:14:10:14:11 | M2 | ExitMethods.cs:15:5:18:5 | {...} | | ExitMethods.cs:20:10:20:11 | M3 | ExitMethods.cs:21:5:24:5 | {...} | @@ -1118,6 +1128,7 @@ entryPoint | Extensions.cs:10:24:10:29 | ToBool | Extensions.cs:11:5:13:5 | {...} | | Extensions.cs:15:23:15:33 | CallToInt32 | Extensions.cs:15:48:15:50 | "0" | | Extensions.cs:20:17:20:20 | Main | Extensions.cs:21:5:26:5 | {...} | +| Finally.cs:3:14:3:20 | Finally | Finally.cs:3:14:3:20 | call to constructor Object | | Finally.cs:7:10:7:11 | M1 | Finally.cs:8:5:17:5 | {...} | | Finally.cs:19:10:19:11 | M2 | Finally.cs:20:5:52:5 | {...} | | Finally.cs:54:10:54:11 | M3 | Finally.cs:55:5:72:5 | {...} | @@ -1126,25 +1137,33 @@ entryPoint | Finally.cs:121:10:121:11 | M6 | Finally.cs:122:5:131:5 | {...} | | Finally.cs:133:10:133:11 | M7 | Finally.cs:134:5:145:5 | {...} | | Finally.cs:147:10:147:11 | M8 | Finally.cs:148:5:170:5 | {...} | +| Finally.cs:172:11:172:20 | ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | ExceptionB | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | ExceptionC | Finally.cs:174:11:174:20 | call to constructor Exception | | Finally.cs:176:10:176:11 | M9 | Finally.cs:177:5:193:5 | {...} | | Finally.cs:195:10:195:12 | M10 | Finally.cs:196:5:214:5 | {...} | | Finally.cs:216:10:216:12 | M11 | Finally.cs:217:5:231:5 | {...} | | Finally.cs:233:10:233:12 | M12 | Finally.cs:234:5:261:5 | {...} | | Finally.cs:263:10:263:12 | M13 | Finally.cs:264:5:274:5 | {...} | +| Foreach.cs:4:7:4:13 | Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:6:10:6:11 | M1 | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:12:10:12:11 | M2 | Foreach.cs:13:5:16:5 | {...} | | Foreach.cs:18:10:18:11 | M3 | Foreach.cs:19:5:22:5 | {...} | | Foreach.cs:24:10:24:11 | M4 | Foreach.cs:25:5:28:5 | {...} | | Foreach.cs:30:10:30:11 | M5 | Foreach.cs:31:5:34:5 | {...} | | Foreach.cs:36:10:36:11 | M6 | Foreach.cs:37:5:40:5 | {...} | +| Initializers.cs:3:7:3:18 | Initializers | Initializers.cs:3:7:3:18 | {...} | | Initializers.cs:8:5:8:16 | Initializers | Initializers.cs:8:5:8:16 | call to constructor Object | | Initializers.cs:10:5:10:16 | Initializers | Initializers.cs:10:5:10:16 | call to constructor Object | | Initializers.cs:12:10:12:10 | M | Initializers.cs:13:5:16:5 | {...} | -| Initializers.cs:20:11:20:23 | NoConstructor | Initializers.cs:22:23:22:23 | this access | +| Initializers.cs:20:11:20:23 | NoConstructor | Initializers.cs:20:11:20:23 | call to constructor Object | | Initializers.cs:31:9:31:11 | Sub | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | | Initializers.cs:33:9:33:11 | Sub | Initializers.cs:33:22:33:25 | call to constructor Sub | | Initializers.cs:35:9:35:11 | Sub | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | +| Initializers.cs:39:7:39:23 | IndexInitializers | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:41:11:41:18 | Compound | Initializers.cs:41:11:41:18 | call to constructor Object | | Initializers.cs:51:10:51:13 | Test | Initializers.cs:52:5:66:5 | {...} | +| LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | | LoopUnrolling.cs:7:10:7:11 | M1 | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:15:10:15:11 | M2 | LoopUnrolling.cs:16:5:20:5 | {...} | | LoopUnrolling.cs:22:10:22:11 | M3 | LoopUnrolling.cs:23:5:27:5 | {...} | @@ -1156,6 +1175,8 @@ entryPoint | LoopUnrolling.cs:76:10:76:11 | M9 | LoopUnrolling.cs:77:5:83:5 | {...} | | LoopUnrolling.cs:85:10:85:12 | M10 | LoopUnrolling.cs:86:5:92:5 | {...} | | LoopUnrolling.cs:94:10:94:12 | M11 | LoopUnrolling.cs:95:5:101:5 | {...} | +| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | MultiImplementationA.cs:6:22:6:31 | get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:22:6:31 | get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:7:21:7:23 | get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | @@ -1181,10 +1202,16 @@ entryPoint | MultiImplementationA.cs:22:6:22:7 | ~C2 | MultiImplementationB.cs:20:11:20:25 | {...} | | MultiImplementationA.cs:23:28:23:35 | implicit conversion | MultiImplementationA.cs:23:50:23:53 | null | | MultiImplementationA.cs:23:28:23:35 | implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | MultiImplementationA.cs:30:21:30:23 | get_P3 | MultiImplementationA.cs:30:34:30:37 | null | +| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | MultiImplementationA.cs:36:9:36:10 | M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:9:36:10 | M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:37:9:37:10 | M2 | MultiImplementationA.cs:37:14:37:28 | {...} | +| MultiImplementationB.cs:1:7:1:8 | C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | MultiImplementationB.cs:3:22:3:22 | get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationB.cs:3:22:3:22 | get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:4:21:4:23 | get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | @@ -1210,9 +1237,14 @@ entryPoint | MultiImplementationB.cs:20:6:20:7 | ~C2 | MultiImplementationB.cs:20:11:20:25 | {...} | | MultiImplementationB.cs:21:28:21:35 | implicit conversion | MultiImplementationA.cs:23:50:23:53 | null | | MultiImplementationB.cs:21:28:21:35 | implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationB.cs:25:7:25:8 | C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | MultiImplementationB.cs:27:21:27:23 | get_P3 | MultiImplementationA.cs:30:34:30:37 | null | +| MultiImplementationB.cs:30:15:30:16 | C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | MultiImplementationB.cs:32:9:32:10 | M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationB.cs:32:9:32:10 | M1 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | NullCoalescing | NullCoalescing.cs:1:7:1:20 | call to constructor Object | | NullCoalescing.cs:3:9:3:10 | M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:5:9:5:10 | M2 | NullCoalescing.cs:5:25:5:25 | access to parameter b | | NullCoalescing.cs:7:12:7:13 | M3 | NullCoalescing.cs:7:40:7:41 | access to parameter s1 | @@ -1221,6 +1253,7 @@ entryPoint | NullCoalescing.cs:13:10:13:11 | M6 | NullCoalescing.cs:14:5:18:5 | {...} | | PartialImplementationA.cs:3:12:3:18 | Partial | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | | PartialImplementationB.cs:4:12:4:18 | Partial | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | +| Patterns.cs:3:7:3:14 | Patterns | Patterns.cs:3:7:3:14 | call to constructor Object | | Patterns.cs:5:10:5:11 | M1 | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:47:24:47:25 | M2 | Patterns.cs:48:9:48:9 | access to parameter c | | Patterns.cs:50:24:50:25 | M3 | Patterns.cs:51:9:51:9 | access to parameter c | @@ -1231,12 +1264,15 @@ entryPoint | Patterns.cs:85:26:85:27 | M8 | Patterns.cs:85:39:85:39 | access to parameter i | | Patterns.cs:87:26:87:27 | M9 | Patterns.cs:87:39:87:39 | access to parameter i | | Patterns.cs:93:17:93:19 | M10 | Patterns.cs:94:5:99:5 | {...} | +| PostDominance.cs:3:7:3:19 | PostDominance | PostDominance.cs:3:7:3:19 | call to constructor Object | | PostDominance.cs:5:10:5:11 | M1 | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:10:10:10:11 | M2 | PostDominance.cs:11:5:15:5 | {...} | | PostDominance.cs:17:10:17:11 | M3 | PostDominance.cs:18:5:22:5 | {...} | +| Qualifiers.cs:1:7:1:16 | Qualifiers | Qualifiers.cs:1:7:1:16 | call to constructor Object | | Qualifiers.cs:7:16:7:21 | Method | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:8:23:8:34 | StaticMethod | Qualifiers.cs:8:41:8:44 | null | | Qualifiers.cs:10:10:10:10 | M | Qualifiers.cs:11:5:31:5 | {...} | +| Switch.cs:3:7:3:12 | Switch | Switch.cs:3:7:3:12 | call to constructor Object | | Switch.cs:5:10:5:11 | M1 | Switch.cs:6:5:8:5 | {...} | | Switch.cs:10:10:10:11 | M2 | Switch.cs:11:5:33:5 | {...} | | Switch.cs:35:10:35:11 | M3 | Switch.cs:36:5:42:5 | {...} | @@ -1253,10 +1289,13 @@ entryPoint | Switch.cs:134:9:134:11 | M13 | Switch.cs:135:5:142:5 | {...} | | Switch.cs:144:9:144:11 | M14 | Switch.cs:145:5:152:5 | {...} | | Switch.cs:154:10:154:12 | M15 | Switch.cs:155:5:161:5 | {...} | +| TypeAccesses.cs:1:7:1:18 | TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object | | TypeAccesses.cs:3:10:3:10 | M | TypeAccesses.cs:4:5:9:5 | {...} | +| VarDecls.cs:3:7:3:14 | VarDecls | VarDecls.cs:3:7:3:14 | call to constructor Object | | VarDecls.cs:5:18:5:19 | M1 | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:13:12:13:13 | M2 | VarDecls.cs:14:5:17:5 | {...} | | VarDecls.cs:19:7:19:8 | M3 | VarDecls.cs:20:5:26:5 | {...} | +| VarDecls.cs:28:11:28:11 | C | VarDecls.cs:28:11:28:11 | call to constructor Object | | VarDecls.cs:28:41:28:47 | Dispose | VarDecls.cs:28:51:28:53 | {...} | | cflow.cs:5:17:5:20 | Main | cflow.cs:6:5:35:5 | {...} | | cflow.cs:37:17:37:22 | Switch | cflow.cs:38:5:68:5 | {...} | @@ -1286,8 +1325,10 @@ entryPoint | cflow.cs:282:5:282:18 | ControlFlowSub | cflow.cs:282:24:282:27 | call to constructor ControlFlow | | cflow.cs:284:5:284:18 | ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | | cflow.cs:286:5:286:18 | ControlFlowSub | cflow.cs:286:34:286:34 | access to parameter i | +| cflow.cs:289:7:289:18 | DelegateCall | cflow.cs:289:7:289:18 | call to constructor Object | | cflow.cs:291:12:291:12 | M | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:296:5:296:25 | NegationInConstructor | cflow.cs:296:5:296:25 | call to constructor Object | | cflow.cs:298:10:298:10 | M | cflow.cs:299:5:301:5 | {...} | +| cflow.cs:304:7:304:18 | LambdaGetter | cflow.cs:304:7:304:18 | call to constructor Object | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:307:5:310:5 | {...} | | cflow.cs:306:60:310:5 | get__getter | cflow.cs:306:60:310:5 | (...) => ... | diff --git a/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected b/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected index 84f6cd7966b..8ba5f8687b4 100644 --- a/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected +++ b/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected @@ -1,4 +1,6 @@ countSplits +| SplittingStressTest.cs:1:7:1:25 | call to constructor Object | 1 | +| SplittingStressTest.cs:1:7:1:25 | {...} | 1 | | SplittingStressTest.cs:4:5:168:5 | {...} | 1 | | SplittingStressTest.cs:5:9:6:13 | if (...) ... | 1 | | SplittingStressTest.cs:5:13:5:14 | access to parameter b1 | 1 | diff --git a/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected b/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected index 59e0fb54c32..3873d436892 100644 --- a/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected @@ -1,21 +1,23 @@ edges -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | CSharp7.cs:49:22:49:23 | SSA def(t1) : String | provenance | | -| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:21 | SSA def(x) : String | provenance | | -| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | provenance | | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | CSharp7.cs:49:22:49:23 | String t1 : String | provenance | | +| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:9 | access to parameter x : String | provenance | | +| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | provenance | | +| CSharp7.cs:49:22:49:23 | String t1 : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | | CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | provenance | | -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | provenance | | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | String t4 : String | provenance | | +| CSharp7.cs:55:30:55:31 | String t4 : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:20:82:20 | access to parameter x : String | provenance | | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | provenance | | | CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | provenance | | -| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:175:16:175:18 | access to local variable src : String | provenance | | | CSharp7.cs:177:25:177:25 | s : String | CSharp7.cs:177:31:177:31 | access to parameter s : String | provenance | | | CSharp7.cs:178:25:178:25 | s : String | CSharp7.cs:178:37:178:37 | access to parameter s : String | provenance | | | CSharp7.cs:181:23:181:25 | access to local variable src : String | CSharp7.cs:177:25:177:25 | s : String | provenance | | @@ -23,24 +25,26 @@ edges | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:178:25:178:25 | s : String | provenance | | | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:182:21:182:26 | call to local function h | provenance | | nodes -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | semmle.label | access to parameter x : String | | CSharp7.cs:39:13:39:21 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:42:19:42:19 | x : String | semmle.label | x : String | -| CSharp7.cs:44:9:44:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | semmle.label | SSA def(t1) : String | +| CSharp7.cs:44:9:44:9 | access to parameter y : String | semmle.label | access to parameter y : String | +| CSharp7.cs:49:22:49:23 | String t1 : String | semmle.label | String t1 : String | | CSharp7.cs:51:18:51:19 | access to local variable t1 | semmle.label | access to local variable t1 | | CSharp7.cs:55:11:55:19 | "tainted" : String | semmle.label | "tainted" : String | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | semmle.label | SSA def(t4) : String | +| CSharp7.cs:55:30:55:31 | String t4 : String | semmle.label | String t4 : String | | CSharp7.cs:56:18:56:19 | access to local variable t4 | semmle.label | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | semmle.label | x : String | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:82:16:82:26 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:82:20:82:20 | access to parameter x : String | semmle.label | access to parameter x : String | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:87:19:87:27 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:90:18:90:28 | call to method I | semmle.label | call to method I | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | semmle.label | access to field Item1 : String | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | semmle.label | access to local variable src : String | | CSharp7.cs:175:22:175:30 | "tainted" | semmle.label | "tainted" | | CSharp7.cs:175:22:175:30 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:177:25:177:25 | s : String | semmle.label | s : String | @@ -52,7 +56,7 @@ nodes | CSharp7.cs:182:21:182:26 | call to local function h | semmle.label | call to local function h | | CSharp7.cs:182:23:182:25 | access to local variable src : String | semmle.label | access to local variable src : String | subpaths -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | CSharp7.cs:55:30:55:31 | String t4 : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | | CSharp7.cs:181:23:181:25 | access to local variable src : String | CSharp7.cs:177:25:177:25 | s : String | CSharp7.cs:177:31:177:31 | access to parameter s : String | CSharp7.cs:181:21:181:26 | call to local function g | | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:178:25:178:25 | s : String | CSharp7.cs:178:37:178:37 | access to parameter s : String | CSharp7.cs:182:21:182:26 | call to local function h | diff --git a/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected b/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected index 2cc4eb58cf9..7b7a73b3c70 100644 --- a/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected +++ b/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected @@ -1,22 +1,24 @@ edges -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | CSharp7.cs:49:22:49:23 | SSA def(t1) : String | provenance | | -| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:21 | SSA def(x) : String | provenance | | -| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | provenance | | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | CSharp7.cs:49:22:49:23 | String t1 : String | provenance | | +| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:9 | access to parameter x : String | provenance | | +| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | provenance | | +| CSharp7.cs:49:22:49:23 | String t1 : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | | CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | provenance | | -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | provenance | | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | String t4 : String | provenance | | +| CSharp7.cs:55:30:55:31 | String t4 : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:20:82:20 | access to parameter x : String | provenance | | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | provenance | | | CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | provenance | | -| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:180:23:180:25 | access to local variable src : String | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:180:23:180:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:175:16:175:18 | access to local variable src : String | provenance | | | CSharp7.cs:176:25:176:25 | s : String | CSharp7.cs:176:33:176:33 | access to parameter s : String | provenance | | | CSharp7.cs:176:31:176:34 | call to local function g : String | CSharp7.cs:176:31:176:39 | ... + ... : String | provenance | | | CSharp7.cs:176:33:176:33 | access to parameter s : String | CSharp7.cs:176:31:176:34 | call to local function g : String | provenance | | @@ -30,24 +32,26 @@ edges | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:178:25:178:25 | s : String | provenance | | | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:182:21:182:26 | call to local function h | provenance | | nodes -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | semmle.label | access to parameter x : String | | CSharp7.cs:39:13:39:21 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:42:19:42:19 | x : String | semmle.label | x : String | -| CSharp7.cs:44:9:44:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | semmle.label | SSA def(t1) : String | +| CSharp7.cs:44:9:44:9 | access to parameter y : String | semmle.label | access to parameter y : String | +| CSharp7.cs:49:22:49:23 | String t1 : String | semmle.label | String t1 : String | | CSharp7.cs:51:18:51:19 | access to local variable t1 | semmle.label | access to local variable t1 | | CSharp7.cs:55:11:55:19 | "tainted" : String | semmle.label | "tainted" : String | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | semmle.label | SSA def(t4) : String | +| CSharp7.cs:55:30:55:31 | String t4 : String | semmle.label | String t4 : String | | CSharp7.cs:56:18:56:19 | access to local variable t4 | semmle.label | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | semmle.label | x : String | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:82:16:82:26 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:82:20:82:20 | access to parameter x : String | semmle.label | access to parameter x : String | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:87:19:87:27 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:90:18:90:28 | call to method I | semmle.label | call to method I | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | semmle.label | access to field Item1 : String | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | semmle.label | access to local variable src : String | | CSharp7.cs:175:22:175:30 | "tainted" | semmle.label | "tainted" | | CSharp7.cs:175:22:175:30 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:176:25:176:25 | s : String | semmle.label | s : String | @@ -65,7 +69,7 @@ nodes | CSharp7.cs:182:21:182:26 | call to local function h | semmle.label | call to local function h | | CSharp7.cs:182:23:182:25 | access to local variable src : String | semmle.label | access to local variable src : String | subpaths -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | CSharp7.cs:55:30:55:31 | String t4 : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | | CSharp7.cs:176:33:176:33 | access to parameter s : String | CSharp7.cs:177:25:177:25 | s : String | CSharp7.cs:177:31:177:31 | access to parameter s : String | CSharp7.cs:176:31:176:34 | call to local function g : String | | CSharp7.cs:180:23:180:25 | access to local variable src : String | CSharp7.cs:176:25:176:25 | s : String | CSharp7.cs:176:31:176:39 | ... + ... : String | CSharp7.cs:180:21:180:26 | call to local function f | diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected index af72c3e5e38..ec78d10b35f 100644 --- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected @@ -1,95 +1,148 @@ | CSharp7.cs:5:7:5:14 | this | CSharp7.cs:7:9:7:9 | this access | | CSharp7.cs:7:9:7:9 | [post] this access | CSharp7.cs:8:9:8:9 | this access | | CSharp7.cs:7:9:7:9 | this access | CSharp7.cs:8:9:8:9 | this access | +| CSharp7.cs:7:13:7:18 | 11 | CSharp7.cs:7:9:7:9 | access to field x | | CSharp7.cs:8:9:8:9 | [post] this access | CSharp7.cs:9:9:9:9 | this access | | CSharp7.cs:8:9:8:9 | this access | CSharp7.cs:9:9:9:9 | this access | +| CSharp7.cs:8:13:8:19 | 123456 | CSharp7.cs:8:9:8:9 | access to field y | +| CSharp7.cs:9:13:9:23 | 128 | CSharp7.cs:9:9:9:9 | access to field z | | CSharp7.cs:14:9:14:13 | [post] this access | CSharp7.cs:23:39:23:43 | this access | | CSharp7.cs:14:9:14:13 | this access | CSharp7.cs:23:39:23:43 | this access | +| CSharp7.cs:14:17:14:17 | 0 | CSharp7.cs:14:9:14:13 | access to field field | | CSharp7.cs:15:9:15:11 | SSA entry def(this.field) | CSharp7.cs:15:18:15:22 | access to field field | | CSharp7.cs:15:9:15:11 | this | CSharp7.cs:15:18:15:22 | this access | | CSharp7.cs:19:9:19:11 | this | CSharp7.cs:19:16:19:20 | this access | | CSharp7.cs:20:9:20:11 | this | CSharp7.cs:20:16:20:20 | this access | | CSharp7.cs:20:9:20:11 | value | CSharp7.cs:20:24:20:28 | access to parameter value | +| CSharp7.cs:20:24:20:28 | access to parameter value | CSharp7.cs:20:16:20:20 | access to field field | | CSharp7.cs:23:5:23:27 | this | CSharp7.cs:14:9:14:13 | this access | | CSharp7.cs:24:6:24:28 | this | CSharp7.cs:24:35:24:39 | this access | | CSharp7.cs:29:19:29:19 | i | CSharp7.cs:31:16:31:16 | access to parameter i | | CSharp7.cs:31:16:31:16 | access to parameter i | CSharp7.cs:31:16:31:20 | ... > ... | | CSharp7.cs:31:16:31:16 | access to parameter i | CSharp7.cs:31:24:31:24 | access to parameter i | | CSharp7.cs:31:24:31:24 | access to parameter i | CSharp7.cs:31:16:31:59 | ... ? ... : ... | -| CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:21 | SSA def(x) | +| CSharp7.cs:39:9:39:9 | access to parameter x | CSharp7.cs:39:9:39:21 | SSA def(x) | +| CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:9 | access to parameter x | | CSharp7.cs:42:19:42:19 | x | CSharp7.cs:44:13:44:13 | access to parameter x | -| CSharp7.cs:44:13:44:13 | access to parameter x | CSharp7.cs:44:9:44:13 | SSA def(y) | +| CSharp7.cs:44:9:44:9 | access to parameter y | CSharp7.cs:44:9:44:13 | SSA def(y) | +| CSharp7.cs:44:13:44:13 | access to parameter x | CSharp7.cs:44:9:44:9 | access to parameter y | | CSharp7.cs:47:10:47:10 | this | CSharp7.cs:49:9:49:24 | this access | | CSharp7.cs:49:9:49:24 | [post] this access | CSharp7.cs:50:9:50:21 | this access | | CSharp7.cs:49:9:49:24 | this access | CSharp7.cs:50:9:50:21 | this access | | CSharp7.cs:49:22:49:23 | SSA def(t1) | CSharp7.cs:51:18:51:19 | access to local variable t1 | +| CSharp7.cs:49:22:49:23 | String t1 | CSharp7.cs:49:22:49:23 | SSA def(t1) | | CSharp7.cs:50:9:50:21 | [post] this access | CSharp7.cs:52:9:52:17 | this access | | CSharp7.cs:50:9:50:21 | this access | CSharp7.cs:52:9:52:17 | this access | | CSharp7.cs:50:19:50:20 | SSA def(t2) | CSharp7.cs:54:14:54:15 | access to local variable t2 | +| CSharp7.cs:50:19:50:20 | String t2 | CSharp7.cs:50:19:50:20 | SSA def(t2) | +| CSharp7.cs:51:18:51:19 | access to local variable t1 | CSharp7.cs:51:13:51:14 | access to local variable t3 | | CSharp7.cs:52:9:52:17 | [post] this access | CSharp7.cs:55:9:55:32 | this access | | CSharp7.cs:52:9:52:17 | this access | CSharp7.cs:55:9:55:32 | this access | | CSharp7.cs:52:15:52:16 | SSA def(t1) | CSharp7.cs:53:14:53:15 | access to local variable t1 | +| CSharp7.cs:52:15:52:16 | access to local variable t1 | CSharp7.cs:52:15:52:16 | SSA def(t1) | +| CSharp7.cs:53:14:53:15 | access to local variable t1 | CSharp7.cs:53:9:53:10 | access to local variable t3 | +| CSharp7.cs:54:14:54:15 | access to local variable t2 | CSharp7.cs:54:9:54:10 | access to local variable t3 | | CSharp7.cs:55:30:55:31 | SSA def(t4) | CSharp7.cs:56:18:56:19 | access to local variable t4 | +| CSharp7.cs:55:30:55:31 | String t4 | CSharp7.cs:55:30:55:31 | SSA def(t4) | +| CSharp7.cs:56:18:56:19 | access to local variable t4 | CSharp7.cs:56:13:56:14 | access to local variable t5 | | CSharp7.cs:67:10:67:20 | this | CSharp7.cs:69:26:69:28 | this access | | CSharp7.cs:69:26:69:28 | [post] this access | CSharp7.cs:70:17:70:19 | this access | | CSharp7.cs:69:26:69:28 | call to method F | CSharp7.cs:69:9:69:22 | (..., ...) | | CSharp7.cs:69:26:69:28 | this access | CSharp7.cs:70:17:70:19 | this access | +| CSharp7.cs:70:13:70:13 | access to local variable z | CSharp7.cs:70:13:70:19 | SSA def(z) | | CSharp7.cs:70:13:70:19 | SSA def(z) | CSharp7.cs:73:16:73:16 | access to local variable z | | CSharp7.cs:70:17:70:19 | [post] this access | CSharp7.cs:71:18:71:20 | this access | -| CSharp7.cs:70:17:70:19 | call to method F | CSharp7.cs:70:13:70:19 | SSA def(z) | +| CSharp7.cs:70:17:70:19 | call to method F | CSharp7.cs:70:13:70:13 | access to local variable z | | CSharp7.cs:70:17:70:19 | this access | CSharp7.cs:71:18:71:20 | this access | | CSharp7.cs:71:18:71:20 | [post] this access | CSharp7.cs:72:13:72:15 | this access | | CSharp7.cs:71:18:71:20 | call to method F | CSharp7.cs:71:9:71:14 | (..., ...) | | CSharp7.cs:71:18:71:20 | this access | CSharp7.cs:72:13:72:15 | this access | +| CSharp7.cs:72:13:72:17 | access to field Item1 | CSharp7.cs:72:9:72:9 | access to local variable x | | CSharp7.cs:73:16:73:16 | [post] access to local variable z | CSharp7.cs:75:39:75:39 | access to local variable z | | CSharp7.cs:73:16:73:16 | access to local variable z | CSharp7.cs:75:39:75:39 | access to local variable z | | CSharp7.cs:73:27:73:35 | (..., ...) | CSharp7.cs:73:9:73:23 | (..., ...) | +| CSharp7.cs:73:28:73:28 | 1 | CSharp7.cs:73:10:73:10 | access to local variable x | +| CSharp7.cs:73:31:73:31 | 2 | CSharp7.cs:73:13:73:13 | access to local variable y | +| CSharp7.cs:73:34:73:34 | 3 | CSharp7.cs:73:16:73:22 | access to field Item1 | | CSharp7.cs:74:9:74:32 | SSA def(x) | CSharp7.cs:77:27:77:27 | access to local variable x | +| CSharp7.cs:74:10:74:10 | access to local variable x | CSharp7.cs:74:9:74:32 | SSA def(x) | | CSharp7.cs:74:18:74:32 | ... = ... | CSharp7.cs:74:9:74:14 | (..., ...) | | CSharp7.cs:74:27:74:32 | (..., ...) | CSharp7.cs:74:18:74:23 | (..., ...) | | CSharp7.cs:74:27:74:32 | (..., ...) | CSharp7.cs:74:18:74:32 | ... = ... | +| CSharp7.cs:74:28:74:28 | 1 | CSharp7.cs:74:19:74:19 | access to local variable x | +| CSharp7.cs:74:31:74:31 | 2 | CSharp7.cs:74:22:74:22 | access to local variable y | +| CSharp7.cs:75:9:75:40 | ... = ... | CSharp7.cs:75:9:75:40 | SSA def(a) | +| CSharp7.cs:75:9:75:40 | ... = ... | CSharp7.cs:75:9:75:40 | SSA def(b) | +| CSharp7.cs:75:9:75:40 | ... = ... | CSharp7.cs:75:9:75:40 | SSA def(c) | | CSharp7.cs:75:9:75:40 | SSA def(a) | CSharp7.cs:76:31:76:31 | access to local variable a | | CSharp7.cs:75:9:75:40 | SSA def(b) | CSharp7.cs:76:24:76:24 | access to local variable b | | CSharp7.cs:75:9:75:40 | SSA def(c) | CSharp7.cs:76:28:76:28 | access to local variable c | | CSharp7.cs:75:35:75:40 | (..., ...) | CSharp7.cs:75:9:75:31 | (..., ...) | -| CSharp7.cs:75:36:75:36 | 1 | CSharp7.cs:75:9:75:40 | SSA def(a) | +| CSharp7.cs:75:36:75:36 | 1 | CSharp7.cs:75:9:75:40 | ... = ... | | CSharp7.cs:76:23:76:33 | (..., ...) | CSharp7.cs:76:9:76:19 | (..., ...) | +| CSharp7.cs:76:24:76:24 | access to local variable b | CSharp7.cs:76:10:76:10 | access to local variable a | +| CSharp7.cs:76:28:76:28 | access to local variable c | CSharp7.cs:76:14:76:14 | access to local variable b | +| CSharp7.cs:76:31:76:31 | access to local variable a | CSharp7.cs:76:17:76:17 | access to local variable c | | CSharp7.cs:77:22:77:28 | (..., ...) | CSharp7.cs:77:9:77:18 | (..., ...) | +| CSharp7.cs:77:23:77:24 | "" | CSharp7.cs:77:9:77:28 | ... = ... | +| CSharp7.cs:77:27:77:27 | access to local variable x | CSharp7.cs:77:9:77:28 | ... = ... | | CSharp7.cs:80:21:80:21 | x | CSharp7.cs:82:20:82:20 | access to parameter x | | CSharp7.cs:85:10:85:18 | this | CSharp7.cs:90:18:90:28 | this access | +| CSharp7.cs:87:13:87:14 | access to local variable t1 | CSharp7.cs:87:13:87:34 | SSA def(t1) | | CSharp7.cs:87:13:87:34 | SSA def(t1) | CSharp7.cs:88:28:88:29 | access to local variable t1 | | CSharp7.cs:87:13:87:34 | SSA qualifier def(t1.Item1) | CSharp7.cs:90:20:90:27 | access to field Item1 | -| CSharp7.cs:87:18:87:34 | (..., ...) | CSharp7.cs:87:13:87:34 | SSA def(t1) | +| CSharp7.cs:87:18:87:34 | (..., ...) | CSharp7.cs:87:13:87:14 | access to local variable t1 | +| CSharp7.cs:88:9:88:29 | ... = ... | CSharp7.cs:88:9:88:29 | SSA def(t3) | | CSharp7.cs:88:9:88:29 | SSA def(t3) | CSharp7.cs:89:18:89:19 | access to local variable t3 | | CSharp7.cs:88:28:88:29 | access to local variable t1 | CSharp7.cs:88:9:88:24 | (..., ...) | | CSharp7.cs:88:28:88:29 | access to local variable t1 | CSharp7.cs:90:20:90:21 | access to local variable t1 | +| CSharp7.cs:89:18:89:19 | access to local variable t3 | CSharp7.cs:89:13:89:14 | access to local variable t4 | +| CSharp7.cs:90:18:90:28 | call to method I | CSharp7.cs:90:13:90:14 | access to local variable t5 | +| CSharp7.cs:95:18:95:38 | (..., ...) | CSharp7.cs:95:13:95:14 | access to local variable m1 | +| CSharp7.cs:96:18:96:43 | (..., ...) | CSharp7.cs:96:13:96:14 | access to local variable m2 | +| CSharp7.cs:101:18:101:48 | access to field Item1 | CSharp7.cs:101:13:101:14 | access to local variable m1 | +| CSharp7.cs:102:18:102:53 | access to field Item2 | CSharp7.cs:102:13:102:14 | access to local variable m2 | +| CSharp7.cs:107:9:107:46 | ... = ... | CSharp7.cs:107:9:107:46 | SSA def(m1) | +| CSharp7.cs:107:9:107:46 | ... = ... | CSharp7.cs:107:9:107:46 | SSA def(m2) | | CSharp7.cs:107:9:107:46 | SSA def(m1) | CSharp7.cs:110:27:110:28 | access to local variable m1 | | CSharp7.cs:107:9:107:46 | SSA def(m2) | CSharp7.cs:110:31:110:32 | access to local variable m2 | | CSharp7.cs:107:28:107:46 | (..., ...) | CSharp7.cs:107:9:107:24 | (..., ...) | -| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | SSA def(m1) | -| CSharp7.cs:107:40:107:45 | (..., ...) | CSharp7.cs:107:9:107:46 | SSA def(m2) | +| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | ... = ... | +| CSharp7.cs:107:40:107:45 | (..., ...) | CSharp7.cs:107:9:107:46 | ... = ... | | CSharp7.cs:110:9:110:33 | SSA def(m4) | CSharp7.cs:111:18:111:19 | access to local variable m4 | +| CSharp7.cs:110:15:110:16 | access to local variable m4 | CSharp7.cs:110:9:110:33 | SSA def(m4) | | CSharp7.cs:110:26:110:33 | (..., ...) | CSharp7.cs:110:9:110:22 | (..., ...) | +| CSharp7.cs:110:27:110:28 | access to local variable m1 | CSharp7.cs:110:10:110:11 | access to local variable m3 | +| CSharp7.cs:111:18:111:19 | access to local variable m4 | CSharp7.cs:111:13:111:14 | access to local variable m6 | +| CSharp7.cs:112:9:112:67 | ... = ... | CSharp7.cs:112:9:112:67 | SSA def(m9) | | CSharp7.cs:112:9:112:67 | SSA def(m9) | CSharp7.cs:113:19:113:20 | access to local variable m9 | | CSharp7.cs:112:38:112:67 | ... = ... | CSharp7.cs:112:9:112:34 | (..., ...) | | CSharp7.cs:112:38:112:67 | SSA def(m2) | CSharp7.cs:116:9:116:10 | access to local variable m2 | | CSharp7.cs:112:38:112:67 | SSA qualifier def(m2.Item1) | CSharp7.cs:117:19:117:26 | access to field Item1 | +| CSharp7.cs:112:43:112:44 | access to local variable m2 | CSharp7.cs:112:38:112:67 | SSA def(m2) | | CSharp7.cs:112:49:112:67 | (..., ...) | CSharp7.cs:112:38:112:45 | (..., ...) | | CSharp7.cs:112:49:112:67 | (..., ...) | CSharp7.cs:112:38:112:67 | ... = ... | -| CSharp7.cs:112:61:112:66 | (..., ...) | CSharp7.cs:112:38:112:67 | SSA def(m2) | +| CSharp7.cs:112:50:112:58 | "DefUse2" | CSharp7.cs:112:39:112:40 | access to local variable m1 | +| CSharp7.cs:112:61:112:66 | (..., ...) | CSharp7.cs:112:43:112:44 | access to local variable m2 | +| CSharp7.cs:113:19:113:20 | access to local variable m9 | CSharp7.cs:113:13:113:15 | access to local variable m10 | | CSharp7.cs:116:9:116:10 | [post] access to local variable m2 | CSharp7.cs:117:19:117:20 | access to local variable m2 | | CSharp7.cs:116:9:116:10 | access to local variable m2 | CSharp7.cs:117:19:117:20 | access to local variable m2 | +| CSharp7.cs:116:20:116:20 | 0 | CSharp7.cs:116:9:116:16 | access to field Item2 | +| CSharp7.cs:117:19:117:26 | access to field Item1 | CSharp7.cs:117:13:117:15 | access to local variable m11 | +| CSharp7.cs:121:22:121:36 | ... = ... | CSharp7.cs:121:16:121:18 | access to local variable m13 | +| CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:24 | access to local variable m12 | | CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:36 | ... = ... | | CSharp7.cs:127:9:127:12 | this | CSharp7.cs:133:24:133:25 | this access | | CSharp7.cs:129:20:129:20 | x | CSharp7.cs:129:32:129:32 | access to parameter x | | CSharp7.cs:129:32:129:32 | access to parameter x | CSharp7.cs:129:32:129:36 | ... + ... | | CSharp7.cs:129:36:129:36 | 1 | CSharp7.cs:129:32:129:36 | ... + ... | | CSharp7.cs:131:22:131:22 | t | CSharp7.cs:131:39:131:39 | access to parameter t | +| CSharp7.cs:133:24:133:25 | delegate creation of type Func | CSharp7.cs:133:19:133:20 | access to local variable f4 | | CSharp7.cs:133:24:133:25 | this access | CSharp7.cs:154:16:154:17 | this access | | CSharp7.cs:137:29:137:29 | x | CSharp7.cs:137:34:137:34 | access to parameter x | +| CSharp7.cs:137:29:137:38 | (...) => ... | CSharp7.cs:137:24:137:25 | access to local variable f5 | | CSharp7.cs:137:34:137:34 | access to parameter x | CSharp7.cs:137:34:137:38 | ... + ... | | CSharp7.cs:137:38:137:38 | 1 | CSharp7.cs:137:34:137:38 | ... + ... | -| CSharp7.cs:139:9:139:51 | this | CSharp7.cs:139:38:139:39 | this access | | CSharp7.cs:139:20:139:20 | x | CSharp7.cs:139:26:139:26 | access to parameter x | | CSharp7.cs:139:26:139:26 | access to parameter x | CSharp7.cs:139:26:139:30 | ... > ... | | CSharp7.cs:139:26:139:26 | access to parameter x | CSharp7.cs:139:41:139:41 | access to parameter x | @@ -97,57 +150,68 @@ | CSharp7.cs:139:34:139:46 | ... + ... | CSharp7.cs:139:26:139:50 | ... ? ... : ... | | CSharp7.cs:139:38:139:46 | call to local function f7 | CSharp7.cs:139:34:139:46 | ... + ... | | CSharp7.cs:139:50:139:50 | 0 | CSharp7.cs:139:26:139:50 | ... ? ... : ... | -| CSharp7.cs:141:9:141:31 | this | CSharp7.cs:141:26:141:27 | this access | | CSharp7.cs:141:20:141:20 | x | CSharp7.cs:141:29:141:29 | access to parameter x | -| CSharp7.cs:143:9:147:9 | this | CSharp7.cs:146:20:146:21 | this access | -| CSharp7.cs:145:13:145:35 | this | CSharp7.cs:145:30:145:31 | this access | | CSharp7.cs:145:24:145:24 | x | CSharp7.cs:145:33:145:33 | access to parameter x | +| CSharp7.cs:149:20:152:9 | (...) => ... | CSharp7.cs:149:16:149:16 | access to local variable a | | CSharp7.cs:157:10:157:17 | this | CSharp7.cs:169:9:169:9 | this access | | CSharp7.cs:160:18:160:18 | t | CSharp7.cs:160:24:160:24 | access to parameter t | -| CSharp7.cs:162:9:167:9 | this | CSharp7.cs:165:13:165:16 | this access | | CSharp7.cs:162:26:162:26 | u | CSharp7.cs:166:22:166:22 | access to parameter u | -| CSharp7.cs:164:13:164:43 | this | CSharp7.cs:164:37:164:40 | this access | | CSharp7.cs:165:13:165:16 | this access | CSharp7.cs:166:20:166:20 | this access | | CSharp7.cs:169:9:169:9 | this access | CSharp7.cs:170:9:170:9 | this access | | CSharp7.cs:173:10:173:19 | this | CSharp7.cs:180:21:180:21 | this access | +| CSharp7.cs:175:16:175:18 | access to local variable src | CSharp7.cs:175:16:175:30 | SSA def(src) | | CSharp7.cs:175:16:175:30 | SSA def(src) | CSharp7.cs:180:23:180:25 | access to local variable src | -| CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:30 | SSA def(src) | -| CSharp7.cs:176:9:176:40 | this | CSharp7.cs:176:31:176:31 | this access | +| CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:18 | access to local variable src | | CSharp7.cs:176:25:176:25 | s | CSharp7.cs:176:33:176:33 | access to parameter s | | CSharp7.cs:176:31:176:34 | call to local function g | CSharp7.cs:176:31:176:39 | ... + ... | | CSharp7.cs:176:38:176:39 | "" | CSharp7.cs:176:31:176:39 | ... + ... | | CSharp7.cs:177:25:177:25 | s | CSharp7.cs:177:31:177:31 | access to parameter s | | CSharp7.cs:178:25:178:25 | s | CSharp7.cs:178:37:178:37 | access to parameter s | | CSharp7.cs:180:21:180:21 | this access | CSharp7.cs:181:21:181:21 | this access | +| CSharp7.cs:180:21:180:26 | call to local function f | CSharp7.cs:180:13:180:17 | access to local variable sink1 | | CSharp7.cs:180:23:180:25 | [post] access to local variable src | CSharp7.cs:181:23:181:25 | access to local variable src | | CSharp7.cs:180:23:180:25 | access to local variable src | CSharp7.cs:181:23:181:25 | access to local variable src | | CSharp7.cs:181:21:181:21 | this access | CSharp7.cs:182:21:182:21 | this access | +| CSharp7.cs:181:21:181:26 | call to local function g | CSharp7.cs:181:13:181:17 | access to local variable sink2 | | CSharp7.cs:181:23:181:25 | [post] access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | | CSharp7.cs:181:23:181:25 | access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | +| CSharp7.cs:182:21:182:26 | call to local function h | CSharp7.cs:182:13:182:17 | access to local variable sink3 | | CSharp7.cs:188:10:188:11 | this | CSharp7.cs:197:14:197:23 | this access | +| CSharp7.cs:190:13:190:14 | access to local variable v1 | CSharp7.cs:190:13:190:18 | SSA def(v1) | | CSharp7.cs:190:13:190:18 | SSA def(v1) | CSharp7.cs:191:26:191:27 | access to local variable v1 | -| CSharp7.cs:190:18:190:18 | 2 | CSharp7.cs:190:13:190:18 | SSA def(v1) | -| CSharp7.cs:191:22:191:27 | ref ... | CSharp7.cs:191:17:191:27 | SSA def(r1) | +| CSharp7.cs:190:18:190:18 | 2 | CSharp7.cs:190:13:190:14 | access to local variable v1 | +| CSharp7.cs:191:17:191:18 | access to local variable r1 | CSharp7.cs:191:17:191:27 | SSA def(r1) | +| CSharp7.cs:191:22:191:27 | ref ... | CSharp7.cs:191:17:191:18 | access to local variable r1 | | CSharp7.cs:191:26:191:27 | access to local variable v1 | CSharp7.cs:197:21:197:22 | access to local variable v1 | +| CSharp7.cs:192:13:192:17 | access to local variable array | CSharp7.cs:192:13:192:31 | SSA def(array) | | CSharp7.cs:192:13:192:31 | SSA def(array) | CSharp7.cs:194:14:194:18 | access to local variable array | -| CSharp7.cs:192:21:192:31 | array creation of type Int32[] | CSharp7.cs:192:13:192:31 | SSA def(array) | -| CSharp7.cs:193:14:193:14 | 3 | CSharp7.cs:193:9:193:14 | SSA def(r1) | +| CSharp7.cs:192:21:192:31 | array creation of type Int32[] | CSharp7.cs:192:13:192:17 | access to local variable array | +| CSharp7.cs:193:9:193:10 | access to local variable r1 | CSharp7.cs:193:9:193:14 | SSA def(r1) | +| CSharp7.cs:193:14:193:14 | 3 | CSharp7.cs:193:9:193:10 | access to local variable r1 | +| CSharp7.cs:194:9:194:10 | access to local variable r1 | CSharp7.cs:194:9:194:21 | SSA def(r1) | | CSharp7.cs:194:9:194:21 | SSA def(r1) | CSharp7.cs:196:26:196:27 | access to local variable r1 | | CSharp7.cs:194:14:194:18 | access to local variable array | CSharp7.cs:194:14:194:21 | access to array element | | CSharp7.cs:194:14:194:18 | access to local variable array | CSharp7.cs:195:26:195:30 | access to local variable array | -| CSharp7.cs:194:14:194:21 | access to array element | CSharp7.cs:194:9:194:21 | SSA def(r1) | +| CSharp7.cs:194:14:194:21 | access to array element | CSharp7.cs:194:9:194:10 | access to local variable r1 | +| CSharp7.cs:195:22:195:33 | ref ... | CSharp7.cs:195:17:195:18 | access to local variable r2 | | CSharp7.cs:195:26:195:30 | access to local variable array | CSharp7.cs:195:26:195:33 | access to array element | +| CSharp7.cs:196:22:196:27 | ref ... | CSharp7.cs:196:17:196:18 | access to local variable r3 | | CSharp7.cs:196:26:196:27 | access to local variable r1 | CSharp7.cs:198:33:198:34 | access to local variable r1 | | CSharp7.cs:197:14:197:23 | [post] this access | CSharp7.cs:198:26:198:35 | this access | +| CSharp7.cs:197:14:197:23 | call to method F2 | CSharp7.cs:197:9:197:10 | access to local variable v1 | | CSharp7.cs:197:14:197:23 | this access | CSharp7.cs:198:26:198:35 | this access | +| CSharp7.cs:198:22:198:35 | ref ... | CSharp7.cs:198:17:198:18 | access to local variable r4 | | CSharp7.cs:198:26:198:35 | [post] this access | CSharp7.cs:199:9:199:18 | this access | | CSharp7.cs:198:26:198:35 | this access | CSharp7.cs:199:9:199:18 | this access | | CSharp7.cs:198:33:198:34 | access to local variable r1 | CSharp7.cs:199:16:199:17 | access to local variable r1 | +| CSharp7.cs:199:22:199:22 | 3 | CSharp7.cs:199:9:199:22 | ... = ... | | CSharp7.cs:202:24:202:24 | p | CSharp7.cs:205:20:205:20 | access to parameter p | | CSharp7.cs:204:28:204:28 | q | CSharp7.cs:204:44:204:44 | access to parameter q | -| CSharp7.cs:215:13:215:17 | false | CSharp7.cs:215:9:215:17 | SSA def(x) | +| CSharp7.cs:215:9:215:9 | access to parameter x | CSharp7.cs:215:9:215:17 | SSA def(x) | +| CSharp7.cs:215:13:215:17 | false | CSharp7.cs:215:9:215:9 | access to parameter x | | CSharp7.cs:219:10:219:13 | this | CSharp7.cs:221:13:221:20 | this access | | CSharp7.cs:221:13:221:20 | [post] this access | CSharp7.cs:222:18:222:25 | this access | +| CSharp7.cs:221:13:221:20 | call to method f | CSharp7.cs:221:9:221:20 | ... = ... | | CSharp7.cs:221:13:221:20 | this access | CSharp7.cs:222:18:222:25 | this access | | CSharp7.cs:222:18:222:25 | [post] this access | CSharp7.cs:223:22:223:29 | this access | | CSharp7.cs:222:18:222:25 | call to method f | CSharp7.cs:222:9:222:14 | (..., ...) | @@ -156,14 +220,16 @@ | CSharp7.cs:223:22:223:29 | call to method f | CSharp7.cs:223:9:223:18 | (..., ...) | | CSharp7.cs:223:22:223:29 | this access | CSharp7.cs:224:22:224:33 | this access | | CSharp7.cs:224:22:224:33 | call to method f | CSharp7.cs:224:9:224:18 | (..., ...) | +| CSharp7.cs:232:16:232:16 | access to local variable o | CSharp7.cs:232:16:232:23 | SSA def(o) | | CSharp7.cs:232:16:232:23 | SSA def(o) | CSharp7.cs:233:13:233:13 | access to local variable o | -| CSharp7.cs:232:20:232:23 | null | CSharp7.cs:232:16:232:23 | SSA def(o) | -| CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:233:18:233:23 | SSA def(i1) | +| CSharp7.cs:232:20:232:23 | null | CSharp7.cs:232:16:232:16 | access to local variable o | +| CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:233:18:233:23 | Int32 i1 | | CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:237:18:237:18 | access to local variable o | | CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | | CSharp7.cs:233:13:233:23 | [false] ... is ... | CSharp7.cs:233:13:233:33 | [false] ... && ... | | CSharp7.cs:233:13:233:23 | [true] ... is ... | CSharp7.cs:233:13:233:33 | [false] ... && ... | | CSharp7.cs:233:13:233:23 | [true] ... is ... | CSharp7.cs:233:13:233:33 | [true] ... && ... | +| CSharp7.cs:233:18:233:23 | Int32 i1 | CSharp7.cs:233:18:233:23 | SSA def(i1) | | CSharp7.cs:233:18:233:23 | SSA def(i1) | CSharp7.cs:233:28:233:29 | access to local variable i1 | | CSharp7.cs:233:28:233:29 | access to local variable i1 | CSharp7.cs:233:28:233:33 | ... > ... | | CSharp7.cs:233:28:233:29 | access to local variable i1 | CSharp7.cs:235:38:235:39 | access to local variable i1 | @@ -171,57 +237,69 @@ | CSharp7.cs:233:28:233:33 | ... > ... | CSharp7.cs:233:13:233:33 | [true] ... && ... | | CSharp7.cs:235:33:235:36 | "int " | CSharp7.cs:235:31:235:41 | $"..." | | CSharp7.cs:235:38:235:39 | access to local variable i1 | CSharp7.cs:235:31:235:41 | $"..." | -| CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:237:23:237:31 | SSA def(s1) | +| CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:237:23:237:31 | String s1 | | CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:241:18:241:18 | access to local variable o | | CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | | CSharp7.cs:237:23:237:31 | SSA def(s1) | CSharp7.cs:239:41:239:42 | access to local variable s1 | +| CSharp7.cs:237:23:237:31 | String s1 | CSharp7.cs:237:23:237:31 | SSA def(s1) | | CSharp7.cs:239:33:239:39 | "string " | CSharp7.cs:239:31:239:44 | $"..." | | CSharp7.cs:239:41:239:42 | access to local variable s1 | CSharp7.cs:239:31:239:44 | $"..." | | CSharp7.cs:241:18:241:18 | access to local variable o | CSharp7.cs:244:18:244:18 | access to local variable o | | CSharp7.cs:241:18:241:18 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | +| CSharp7.cs:244:18:244:18 | access to local variable o | CSharp7.cs:244:23:244:28 | Object v1 | | CSharp7.cs:244:18:244:18 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | | CSharp7.cs:248:9:274:9 | SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o | | CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:254:27:254:27 | access to local variable o | -| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:257:18:257:23 | SSA def(i2) | -| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:260:18:260:23 | SSA def(i3) | -| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:263:18:263:26 | SSA def(s2) | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:257:18:257:23 | Int32 i2 | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:260:18:260:23 | Int32 i3 | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:263:18:263:26 | String s2 | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:269:18:269:23 | Object v2 | | CSharp7.cs:252:26:252:26 | 1 | CSharp7.cs:252:26:252:30 | ... < ... | | CSharp7.cs:252:30:252:30 | 2 | CSharp7.cs:252:26:252:30 | ... < ... | -| CSharp7.cs:254:27:254:27 | access to local variable o | CSharp7.cs:254:32:254:40 | SSA def(s4) | +| CSharp7.cs:254:27:254:27 | access to local variable o | CSharp7.cs:254:32:254:40 | String s4 | | CSharp7.cs:254:32:254:40 | SSA def(s4) | CSharp7.cs:255:40:255:41 | access to local variable s4 | +| CSharp7.cs:254:32:254:40 | String s4 | CSharp7.cs:254:32:254:40 | SSA def(s4) | | CSharp7.cs:255:37:255:38 | "x " | CSharp7.cs:255:35:255:43 | $"..." | | CSharp7.cs:255:40:255:41 | access to local variable s4 | CSharp7.cs:255:35:255:43 | $"..." | +| CSharp7.cs:257:18:257:23 | Int32 i2 | CSharp7.cs:257:18:257:23 | SSA def(i2) | | CSharp7.cs:257:18:257:23 | SSA def(i2) | CSharp7.cs:257:30:257:31 | access to local variable i2 | | CSharp7.cs:257:30:257:31 | access to local variable i2 | CSharp7.cs:257:30:257:35 | ... > ... | | CSharp7.cs:257:30:257:31 | access to local variable i2 | CSharp7.cs:258:47:258:48 | access to local variable i2 | | CSharp7.cs:258:37:258:45 | "positive " | CSharp7.cs:258:35:258:50 | $"..." | | CSharp7.cs:258:47:258:48 | access to local variable i2 | CSharp7.cs:258:35:258:50 | $"..." | +| CSharp7.cs:260:18:260:23 | Int32 i3 | CSharp7.cs:260:18:260:23 | SSA def(i3) | | CSharp7.cs:260:18:260:23 | SSA def(i3) | CSharp7.cs:261:42:261:43 | access to local variable i3 | | CSharp7.cs:261:37:261:40 | "int " | CSharp7.cs:261:35:261:45 | $"..." | | CSharp7.cs:261:42:261:43 | access to local variable i3 | CSharp7.cs:261:35:261:45 | $"..." | | CSharp7.cs:263:18:263:26 | SSA def(s2) | CSharp7.cs:264:45:264:46 | access to local variable s2 | +| CSharp7.cs:263:18:263:26 | String s2 | CSharp7.cs:263:18:263:26 | SSA def(s2) | | CSharp7.cs:264:37:264:43 | "string " | CSharp7.cs:264:35:264:48 | $"..." | | CSharp7.cs:264:45:264:46 | access to local variable s2 | CSharp7.cs:264:35:264:48 | $"..." | +| CSharp7.cs:282:13:282:16 | access to local variable dict | CSharp7.cs:282:13:282:48 | SSA def(dict) | | CSharp7.cs:282:13:282:48 | SSA def(dict) | CSharp7.cs:283:20:283:23 | access to local variable dict | -| CSharp7.cs:282:20:282:48 | object creation of type Dictionary | CSharp7.cs:282:13:282:48 | SSA def(dict) | +| CSharp7.cs:282:20:282:48 | object creation of type Dictionary | CSharp7.cs:282:13:282:16 | access to local variable dict | +| CSharp7.cs:283:13:283:16 | access to local variable list | CSharp7.cs:283:13:283:62 | SSA def(list) | | CSharp7.cs:283:13:283:62 | SSA def(list) | CSharp7.cs:285:39:285:42 | access to local variable list | -| CSharp7.cs:283:20:283:62 | call to method Select,(Int32,String)> | CSharp7.cs:283:13:283:62 | SSA def(list) | +| CSharp7.cs:283:20:283:62 | call to method Select,(Int32,String)> | CSharp7.cs:283:13:283:16 | access to local variable list | | CSharp7.cs:283:32:283:35 | item | CSharp7.cs:283:41:283:44 | access to parameter item | | CSharp7.cs:283:41:283:44 | access to parameter item | CSharp7.cs:283:41:283:48 | access to property Key | | CSharp7.cs:283:41:283:44 | access to parameter item | CSharp7.cs:283:51:283:54 | access to parameter item | | CSharp7.cs:283:51:283:54 | access to parameter item | CSharp7.cs:283:51:283:60 | access to property Value | | CSharp7.cs:285:39:285:42 | access to local variable list | CSharp7.cs:287:36:287:39 | access to local variable list | | CSharp7.cs:287:36:287:39 | access to local variable list | CSharp7.cs:289:32:289:35 | access to local variable list | +| CSharp7.cs:297:18:297:18 | access to local variable x | CSharp7.cs:297:18:297:22 | SSA def(x) | | CSharp7.cs:297:18:297:22 | SSA def(x) | CSharp7.cs:297:25:297:25 | SSA phi(x) | -| CSharp7.cs:297:22:297:22 | 0 | CSharp7.cs:297:18:297:22 | SSA def(x) | +| CSharp7.cs:297:22:297:22 | 0 | CSharp7.cs:297:18:297:18 | access to local variable x | | CSharp7.cs:297:25:297:25 | SSA phi(x) | CSharp7.cs:297:25:297:25 | access to local variable x | | CSharp7.cs:297:25:297:25 | access to local variable x | CSharp7.cs:297:25:297:30 | ... < ... | | CSharp7.cs:297:25:297:25 | access to local variable x | CSharp7.cs:297:35:297:35 | access to local variable x | | CSharp7.cs:297:25:297:30 | ... < ... | CSharp7.cs:297:25:297:44 | [false] ... && ... | | CSharp7.cs:297:25:297:30 | ... < ... | CSharp7.cs:297:25:297:44 | [true] ... && ... | -| CSharp7.cs:297:35:297:35 | access to local variable x | CSharp7.cs:297:40:297:44 | SSA def(y) | +| CSharp7.cs:297:35:297:35 | access to local variable x | CSharp7.cs:297:40:297:44 | Int32 y | | CSharp7.cs:297:35:297:35 | access to local variable x | CSharp7.cs:297:49:297:49 | access to local variable x | | CSharp7.cs:297:35:297:44 | [false] ... is ... | CSharp7.cs:297:25:297:44 | [false] ... && ... | | CSharp7.cs:297:35:297:44 | [true] ... is ... | CSharp7.cs:297:25:297:44 | [true] ... && ... | +| CSharp7.cs:297:40:297:44 | Int32 y | CSharp7.cs:297:40:297:44 | SSA def(y) | | CSharp7.cs:297:40:297:44 | SSA def(y) | CSharp7.cs:299:31:299:31 | access to local variable y | | CSharp7.cs:297:47:297:49 | SSA def(x) | CSharp7.cs:297:25:297:25 | SSA phi(x) | +| CSharp7.cs:297:49:297:49 | access to local variable x | CSharp7.cs:297:47:297:49 | SSA def(x) | diff --git a/csharp/ql/test/library-tests/csharp7/TaintReaches.expected b/csharp/ql/test/library-tests/csharp7/TaintReaches.expected index 6e9a4c8dcfa..d3765576f50 100644 --- a/csharp/ql/test/library-tests/csharp7/TaintReaches.expected +++ b/csharp/ql/test/library-tests/csharp7/TaintReaches.expected @@ -1,7 +1,15 @@ +| CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:9 | access to parameter x | | CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:21 | SSA def(x) | +| CSharp7.cs:77:23:77:24 | "" | CSharp7.cs:77:9:77:28 | ... = ... | +| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | ... = ... | | CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | SSA def(m1) | +| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:110:10:110:11 | access to local variable m3 | | CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:110:27:110:28 | access to local variable m1 | +| CSharp7.cs:112:50:112:58 | "DefUse2" | CSharp7.cs:112:39:112:40 | access to local variable m1 | +| CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:16:121:18 | access to local variable m13 | +| CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:24 | access to local variable m12 | | CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:36 | ... = ... | +| CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:18 | access to local variable src | | CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:30 | SSA def(src) | | CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:180:23:180:25 | access to local variable src | | CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:181:23:181:25 | access to local variable src | diff --git a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected index 484ab5d1788..d47e03f752e 100644 --- a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected +++ b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected @@ -5,14 +5,19 @@ suppressNullableWarnings | NullableRefTypes.cs:88:13:88:14 | ...! | NullableRefTypes.cs:88:13:88:13 | access to local variable x | | NullableRefTypes.cs:113:36:113:44 | ...! | NullableRefTypes.cs:113:36:113:43 | access to field Property | nullableDataFlow +| NullableRefTypes.cs:84:17:84:17 | access to local variable x | NullableRefTypes.cs:84:17:84:28 | SSA def(x) | | NullableRefTypes.cs:84:17:84:28 | SSA def(x) | NullableRefTypes.cs:85:20:85:20 | access to local variable x | -| NullableRefTypes.cs:84:21:84:28 | "source" | NullableRefTypes.cs:84:17:84:28 | SSA def(x) | +| NullableRefTypes.cs:84:21:84:28 | "source" | NullableRefTypes.cs:84:17:84:17 | access to local variable x | | NullableRefTypes.cs:85:20:85:20 | access to local variable x | NullableRefTypes.cs:85:20:85:21 | ...! | | NullableRefTypes.cs:85:20:85:20 | access to local variable x | NullableRefTypes.cs:86:13:86:13 | access to local variable x | +| NullableRefTypes.cs:85:20:85:21 | ...! | NullableRefTypes.cs:85:16:85:16 | access to local variable y | | NullableRefTypes.cs:86:13:86:13 | access to local variable x | NullableRefTypes.cs:86:13:86:14 | ...! | +| NullableRefTypes.cs:86:13:86:14 | ...! | NullableRefTypes.cs:86:9:86:9 | access to local variable y | +| NullableRefTypes.cs:87:9:87:9 | access to local variable x | NullableRefTypes.cs:87:9:87:16 | SSA def(x) | | NullableRefTypes.cs:87:9:87:16 | SSA def(x) | NullableRefTypes.cs:88:13:88:13 | access to local variable x | -| NullableRefTypes.cs:87:13:87:16 | null | NullableRefTypes.cs:87:9:87:16 | SSA def(x) | +| NullableRefTypes.cs:87:13:87:16 | null | NullableRefTypes.cs:87:9:87:9 | access to local variable x | | NullableRefTypes.cs:88:13:88:13 | access to local variable x | NullableRefTypes.cs:88:13:88:14 | ...! | +| NullableRefTypes.cs:88:13:88:14 | ...! | NullableRefTypes.cs:88:9:88:9 | access to local variable y | nullableControlFlow | NullableRefTypes.cs:82:10:82:40 | enter TestSuppressNullableWarningExpr | NullableRefTypes.cs:83:5:89:5 | {...} | successor | | NullableRefTypes.cs:82:10:82:40 | exit TestSuppressNullableWarningExpr (normal) | NullableRefTypes.cs:82:10:82:40 | exit TestSuppressNullableWarningExpr | successor | @@ -239,6 +244,7 @@ annotatedTypeConstraints | NullableRefTypes.cs:58:24:58:25 | T2 | NullableRefTypes.cs:54:11:54:33 | Generic!, MyClass!>! | typeNotAnnotated expressionTypes +| NullableRefTypes.cs:6:7:6:13 | call to constructor Object | object | | NullableRefTypes.cs:13:19:13:22 | null | null | | NullableRefTypes.cs:14:18:14:21 | this access | MyClass! | | NullableRefTypes.cs:17:29:17:32 | null | null | @@ -265,6 +271,8 @@ expressionTypes | NullableRefTypes.cs:40:26:40:30 | ref ... | MyClass | | NullableRefTypes.cs:40:30:40:30 | access to local variable b | MyClass? | | NullableRefTypes.cs:51:44:51:47 | null | null | +| NullableRefTypes.cs:54:11:54:33 | call to constructor Object | object | +| NullableRefTypes.cs:58:11:58:26 | call to constructor Object | object | | NullableRefTypes.cs:73:18:73:18 | access to local variable x | MyClass! | | NullableRefTypes.cs:73:18:73:25 | MyClass x = ... | MyClass! | | NullableRefTypes.cs:73:22:73:25 | null | null | @@ -276,6 +284,7 @@ expressionTypes | NullableRefTypes.cs:75:11:75:11 | access to local variable x | MyClass? | | NullableRefTypes.cs:76:16:76:32 | default(...) | MyStruct! | | NullableRefTypes.cs:76:24:76:31 | access to type MyStruct | MyStruct | +| NullableRefTypes.cs:80:7:80:22 | call to constructor Object | object | | NullableRefTypes.cs:84:17:84:17 | access to local variable x | string! | | NullableRefTypes.cs:84:17:84:28 | String x = ... | string! | | NullableRefTypes.cs:84:21:84:28 | "source" | string! | @@ -308,6 +317,7 @@ expressionTypes | NullableRefTypes.cs:96:9:96:15 | access to type Console | Console! | | NullableRefTypes.cs:96:9:96:28 | call to method WriteLine | Void! | | NullableRefTypes.cs:96:27:96:27 | access to local variable x | string? | +| NullableRefTypes.cs:100:7:100:14 | call to constructor Object | object | | NullableRefTypes.cs:103:48:103:52 | ref ... | MyClass | | NullableRefTypes.cs:103:52:103:52 | access to parameter r | MyClass! | | NullableRefTypes.cs:104:48:104:52 | ref ... | MyClass | @@ -326,11 +336,16 @@ expressionTypes | NullableRefTypes.cs:113:36:113:43 | access to field Property | MyClass? | | NullableRefTypes.cs:113:36:113:43 | this access | RefTypes | | NullableRefTypes.cs:113:36:113:44 | ...! | MyClass? | +| NullableRefTypes.cs:116:7:116:23 | call to constructor Object | object | +| NullableRefTypes.cs:136:7:136:24 | call to constructor Object | object | +| NullableRefTypes.cs:154:7:154:25 | call to constructor Object | object | | NullableRefTypes.cs:157:18:157:30 | object creation of type MyClass | MyClass | | NullableRefTypes.cs:160:17:160:17 | access to local variable a | MyClass | | NullableRefTypes.cs:160:17:160:21 | MyClass a = ... | MyClass | | NullableRefTypes.cs:160:21:160:21 | access to parameter p | MyClass | | NullableRefTypes.cs:161:16:161:16 | access to local variable a | MyClass | +| NullableRefTypes.cs:165:8:165:15 | call to constructor ValueType | ValueType | +| NullableRefTypes.cs:171:16:171:37 | call to constructor Object | object | | NullableRefTypes.cs:181:17:181:17 | access to local variable x | string! | | NullableRefTypes.cs:181:17:181:31 | String x = ... | string! | | NullableRefTypes.cs:181:21:181:31 | call to method MaybeNull | string? | diff --git a/csharp/ql/test/library-tests/csharp9/PrintAst.expected b/csharp/ql/test/library-tests/csharp9/PrintAst.expected index a46ffa3257b..eacbfd8fd45 100644 --- a/csharp/ql/test/library-tests/csharp9/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp9/PrintAst.expected @@ -884,7 +884,6 @@ Record.cs: # 27| -1: [TypeMention] string # 27| 1: [Parameter] LastName # 27| -1: [TypeMention] string -# 27| 4: [BlockStmt] {...} # 27| 16: [Property] FirstName # 27| 3: [Getter] get_FirstName # 27| 4: [Setter] set_FirstName @@ -917,7 +916,6 @@ Record.cs: # 30| 3: [ConstructorInitializer] call to constructor Person1 # 30| 0: [ParameterAccess] access to parameter FirstName # 30| 1: [ParameterAccess] access to parameter LastName -# 29| 4: [BlockStmt] {...} # 29| 17: [Property] Subject # 29| 3: [Getter] get_Subject # 29| 4: [Setter] set_Subject @@ -945,7 +943,6 @@ Record.cs: # 33| 3: [ConstructorInitializer] call to constructor Person1 # 33| 0: [ParameterAccess] access to parameter FirstName # 33| 1: [ParameterAccess] access to parameter LastName -# 32| 4: [BlockStmt] {...} # 32| 17: [Property] Level # 32| 3: [Getter] get_Level # 32| 4: [Setter] set_Level @@ -966,7 +963,6 @@ Record.cs: #-----| 2: (Parameters) # 35| 0: [Parameter] Name # 35| -1: [TypeMention] string -# 35| 4: [BlockStmt] {...} # 35| 16: [Property] Name # 35| 3: [Getter] get_Name # 35| 4: [Setter] set_Name @@ -993,7 +989,6 @@ Record.cs: # 41| -1: [TypeMention] string # 41| 3: [ConstructorInitializer] call to constructor Pet # 41| 0: [ParameterAccess] access to parameter Name -# 41| 4: [BlockStmt] {...} # 41| 15: [Property] EqualityContract # 41| 3: [Getter] get_EqualityContract # 43| 16: [Method] WagTail @@ -1035,7 +1030,6 @@ Record.cs: #-----| 2: (Parameters) # 54| 0: [Parameter] A # 54| -1: [TypeMention] string -# 54| 4: [BlockStmt] {...} # 54| 16: [Property] A # 54| 3: [Getter] get_A # 54| 4: [Setter] set_A @@ -1060,7 +1054,6 @@ Record.cs: # 56| -1: [TypeMention] string # 56| 3: [ConstructorInitializer] call to constructor R1 # 56| 0: [ParameterAccess] access to parameter A -# 56| 4: [BlockStmt] {...} # 56| 17: [Property] B # 56| 3: [Getter] get_B # 56| 4: [Setter] set_B diff --git a/csharp/ql/test/library-tests/csharp9/nativeInt.expected b/csharp/ql/test/library-tests/csharp9/nativeInt.expected index f9498eb046b..2c63241e1fe 100644 --- a/csharp/ql/test/library-tests/csharp9/nativeInt.expected +++ b/csharp/ql/test/library-tests/csharp9/nativeInt.expected @@ -1,3 +1,4 @@ +| NativeInt.cs:3:14:3:22 | call to constructor Object | Object | | NativeInt.cs:7:14:7:14 | access to local variable x | IntPtr | | NativeInt.cs:7:14:7:18 | IntPtr x = ... | IntPtr | | NativeInt.cs:7:18:7:18 | (...) ... | IntPtr | diff --git a/csharp/ql/test/library-tests/dataflow/async/Async.expected b/csharp/ql/test/library-tests/dataflow/async/Async.expected index ed0395fff0b..743f8d120b2 100644 --- a/csharp/ql/test/library-tests/dataflow/async/Async.expected +++ b/csharp/ql/test/library-tests/dataflow/async/Async.expected @@ -10,7 +10,8 @@ edges | Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | provenance | | | Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | provenance | | | Async.cs:24:41:24:45 | input : String | Async.cs:26:35:26:39 | access to parameter input : String | provenance | | -| Async.cs:26:17:26:40 | await ... : String | Async.cs:27:14:27:14 | access to local variable x | provenance | | +| Async.cs:26:13:26:13 | access to local variable x : String | Async.cs:27:14:27:14 | access to local variable x | provenance | | +| Async.cs:26:17:26:40 | await ... : String | Async.cs:26:13:26:13 | access to local variable x : String | provenance | | | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | Async.cs:26:17:26:40 | await ... : String | provenance | | | Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | provenance | | | Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | provenance | | @@ -47,6 +48,7 @@ nodes | Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | semmle.label | call to method ReturnAwait : Task [property Result] : String | | Async.cs:21:32:21:36 | access to parameter input : String | semmle.label | access to parameter input : String | | Async.cs:24:41:24:45 | input : String | semmle.label | input : String | +| Async.cs:26:13:26:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Async.cs:26:17:26:40 | await ... : String | semmle.label | await ... : String | | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | semmle.label | call to method ReturnAwait : Task [property Result] : String | | Async.cs:26:35:26:39 | access to parameter input : String | semmle.label | access to parameter input : String | diff --git a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected index daf679b629a..6ebc0d47f02 100644 --- a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected @@ -5,11 +5,31 @@ edges | CallSensitivityFlow.cs:27:40:27:40 | o : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | provenance | | | CallSensitivityFlow.cs:27:40:27:40 | o : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | provenance | | | CallSensitivityFlow.cs:35:41:35:41 | o : Object | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | provenance | | -| CallSensitivityFlow.cs:43:45:43:45 | o : Object | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:43:45:43:45 | o : Object | CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:50:13:50:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:50:13:50:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:52:16:52:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:52:16:52:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | | CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | CallSensitivityFlow.cs:19:39:19:39 | o : Object | provenance | | | CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | CallSensitivityFlow.cs:27:40:27:40 | o : Object | provenance | | | CallSensitivityFlow.cs:80:26:80:37 | object creation of type Object : Object | CallSensitivityFlow.cs:35:41:35:41 | o : Object | provenance | | @@ -31,7 +51,11 @@ edges | CallSensitivityFlow.cs:119:32:119:43 | object creation of type Object : Object | CallSensitivityFlow.cs:140:49:140:49 | o : Object | provenance | | | CallSensitivityFlow.cs:124:43:124:43 | o : Object | CallSensitivityFlow.cs:128:22:128:22 | access to parameter o | provenance | | | CallSensitivityFlow.cs:132:44:132:44 | o : Object | CallSensitivityFlow.cs:136:22:136:22 | access to parameter o | provenance | | -| CallSensitivityFlow.cs:140:49:140:49 | o : Object | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:140:49:140:49 | o : Object | CallSensitivityFlow.cs:142:20:142:21 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:142:20:142:21 | access to local variable o1 : Object | CallSensitivityFlow.cs:146:24:146:26 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:146:24:146:26 | access to local variable tmp : Object | CallSensitivityFlow.cs:147:17:147:18 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:147:17:147:18 | access to local variable o2 : Object | CallSensitivityFlow.cs:149:20:149:21 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:149:20:149:21 | access to local variable o3 : Object | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | provenance | | | CallSensitivityFlow.cs:162:34:162:34 | o : Object | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | provenance | | | CallSensitivityFlow.cs:167:44:167:44 | o : Object | CallSensitivityFlow.cs:169:14:169:14 | access to parameter o : Object | provenance | | | CallSensitivityFlow.cs:169:14:169:14 | access to parameter o : Object | CallSensitivityFlow.cs:162:34:162:34 | o : Object | provenance | | @@ -39,7 +63,8 @@ edges | CallSensitivityFlow.cs:174:45:174:53 | call to method MOut : Object | CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | provenance | | | CallSensitivityFlow.cs:182:21:182:32 | object creation of type Object : Object | CallSensitivityFlow.cs:205:40:205:40 | o : Object | provenance | | | CallSensitivityFlow.cs:185:21:185:32 | object creation of type Object : Object | CallSensitivityFlow.cs:167:44:167:44 | o : Object | provenance | | -| CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | provenance | | +| CallSensitivityFlow.cs:187:13:187:13 | access to local variable o : Object | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | provenance | | +| CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | CallSensitivityFlow.cs:187:13:187:13 | access to local variable o : Object | provenance | | | CallSensitivityFlow.cs:205:40:205:40 | o : Object | CallSensitivityFlow.cs:208:18:208:18 | access to parameter o | provenance | | nodes | CallSensitivityFlow.cs:7:38:7:38 | o : Object | semmle.label | o : Object | @@ -54,11 +79,31 @@ nodes | CallSensitivityFlow.cs:35:41:35:41 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | semmle.label | [cond (line 35): true] access to parameter o | | CallSensitivityFlow.cs:43:45:43:45 | o : Object | semmle.label | o : Object | +| CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:50:13:50:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:52:16:52:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | semmle.label | access to local variable o3 | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | semmle.label | access to local variable o3 | | CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | @@ -84,6 +129,10 @@ nodes | CallSensitivityFlow.cs:132:44:132:44 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:136:22:136:22 | access to parameter o | semmle.label | access to parameter o | | CallSensitivityFlow.cs:140:49:140:49 | o : Object | semmle.label | o : Object | +| CallSensitivityFlow.cs:142:20:142:21 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:146:24:146:26 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:147:17:147:18 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:149:20:149:21 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | semmle.label | access to local variable o3 | | CallSensitivityFlow.cs:162:34:162:34 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | semmle.label | access to parameter o | @@ -93,6 +142,7 @@ nodes | CallSensitivityFlow.cs:174:45:174:53 | call to method MOut : Object | semmle.label | call to method MOut : Object | | CallSensitivityFlow.cs:182:21:182:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | CallSensitivityFlow.cs:185:21:185:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| CallSensitivityFlow.cs:187:13:187:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | semmle.label | call to method CallMOut : Object | | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | semmle.label | access to local variable o | | CallSensitivityFlow.cs:205:40:205:40 | o : Object | semmle.label | o : Object | diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected index 2aadd5b0bbf..4230fdcc5a1 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected @@ -46,19 +46,23 @@ edges | CollectionFlow.cs:36:49:36:52 | args : null [element] : A | CollectionFlow.cs:36:63:36:66 | access to parameter args : null [element] : A | provenance | | | CollectionFlow.cs:36:63:36:66 | access to parameter args : A[] [element] : A | CollectionFlow.cs:36:63:36:69 | access to array element | provenance | | | CollectionFlow.cs:36:63:36:66 | access to parameter args : null [element] : A | CollectionFlow.cs:36:63:36:69 | access to array element | provenance | | -| CollectionFlow.cs:40:17:40:23 | object creation of type A : A | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | provenance | | -| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | provenance | | -| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | provenance | | -| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:40:13:40:13 | access to local variable a : A | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:40:17:40:23 | object creation of type A : A | CollectionFlow.cs:40:13:40:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | provenance | | | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | provenance | | | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | CollectionFlow.cs:42:14:42:19 | access to array element | provenance | | | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | provenance | | | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | CollectionFlow.cs:22:34:22:35 | ts : null [element] : A | provenance | | | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | CollectionFlow.cs:44:14:44:23 | call to method First | provenance | | -| CollectionFlow.cs:58:17:58:23 | object creation of type A : A | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | provenance | | -| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:60:14:60:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | -| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:61:18:61:18 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | -| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:58:13:58:13 | access to local variable a : A | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:58:17:58:23 | object creation of type A : A | CollectionFlow.cs:58:13:58:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:60:14:60:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:61:18:61:18 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | | CollectionFlow.cs:59:45:59:55 | { ..., ... } : A[] [element] : A | CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | provenance | | | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | CollectionFlow.cs:59:45:59:55 | { ..., ... } : A[] [element] : A | provenance | | | CollectionFlow.cs:60:14:60:14 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:60:14:60:17 | access to field As : A[] [element] : A | provenance | | @@ -68,7 +72,8 @@ edges | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | provenance | | | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | CollectionFlow.cs:22:34:22:35 | ts : A[] [element] : A | provenance | | | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | CollectionFlow.cs:62:14:62:24 | call to method First | provenance | | -| CollectionFlow.cs:76:17:76:23 | object creation of type A : A | CollectionFlow.cs:78:18:78:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:76:13:76:13 | access to local variable a : A | CollectionFlow.cs:78:18:78:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:76:17:76:23 | object creation of type A : A | CollectionFlow.cs:76:13:76:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:79:14:79:16 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:80:18:80:20 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | provenance | | @@ -77,7 +82,8 @@ edges | CollectionFlow.cs:80:18:80:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:22:34:22:35 | ts : A[] [element] : A | provenance | | | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:81:14:81:23 | call to method First | provenance | | -| CollectionFlow.cs:96:17:96:23 | object creation of type A : A | CollectionFlow.cs:98:19:98:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:96:13:96:13 | access to local variable a : A | CollectionFlow.cs:98:19:98:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:96:17:96:23 | object creation of type A : A | CollectionFlow.cs:96:13:96:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:99:14:99:17 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:100:22:100:25 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | provenance | | @@ -86,16 +92,19 @@ edges | CollectionFlow.cs:100:22:100:25 | access to local variable list : List [element] : A | CollectionFlow.cs:16:49:16:52 | list : List [element] : A | provenance | | | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | CollectionFlow.cs:24:43:24:46 | list : List [element] : A | provenance | | | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | CollectionFlow.cs:101:14:101:28 | call to method ListFirst | provenance | | -| CollectionFlow.cs:115:17:115:23 | object creation of type A : A | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | provenance | | -| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | provenance | | -| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | provenance | | -| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:115:13:115:13 | access to local variable a : A | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | provenance | | +| CollectionFlow.cs:115:17:115:23 | object creation of type A : A | CollectionFlow.cs:115:13:115:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | provenance | | | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | CollectionFlow.cs:117:14:117:20 | access to indexer | provenance | | | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | CollectionFlow.cs:16:49:16:52 | list : List [element] : A | provenance | | | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | CollectionFlow.cs:24:43:24:46 | list : List [element] : A | provenance | | | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | CollectionFlow.cs:119:14:119:28 | call to method ListFirst | provenance | | -| CollectionFlow.cs:132:17:132:23 | object creation of type A : A | CollectionFlow.cs:134:18:134:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:132:13:132:13 | access to local variable a : A | CollectionFlow.cs:134:18:134:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:132:17:132:23 | object creation of type A : A | CollectionFlow.cs:132:13:132:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:135:14:135:17 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:136:22:136:25 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | provenance | | @@ -104,7 +113,8 @@ edges | CollectionFlow.cs:136:22:136:25 | access to local variable list : List [element] : A | CollectionFlow.cs:16:49:16:52 | list : List [element] : A | provenance | | | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | CollectionFlow.cs:24:43:24:46 | list : List [element] : A | provenance | | | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | CollectionFlow.cs:137:14:137:28 | call to method ListFirst | provenance | | -| CollectionFlow.cs:151:17:151:23 | object creation of type A : A | CollectionFlow.cs:153:19:153:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:151:13:151:13 | access to local variable a : A | CollectionFlow.cs:153:19:153:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:151:17:151:23 | object creation of type A : A | CollectionFlow.cs:151:13:151:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:154:14:154:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:155:23:155:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:156:28:156:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | @@ -119,12 +129,14 @@ edges | CollectionFlow.cs:157:29:157:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:157:14:157:33 | call to method DictFirstValue | provenance | | | CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:158:14:158:34 | call to method DictValuesFirst | provenance | | -| CollectionFlow.cs:174:17:174:23 | object creation of type A : A | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:177:23:177:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:178:28:178:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:174:13:174:13 | access to local variable a : A | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | provenance | | +| CollectionFlow.cs:174:17:174:23 | object creation of type A : A | CollectionFlow.cs:174:13:174:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:177:23:177:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:178:28:178:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:176:14:176:20 | access to indexer | provenance | | | CollectionFlow.cs:177:23:177:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:18:61:18:64 | dict : Dictionary [element, property Value] : A | provenance | | @@ -134,12 +146,14 @@ edges | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:14:179:33 | call to method DictFirstValue | provenance | | | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:180:14:180:34 | call to method DictValuesFirst | provenance | | -| CollectionFlow.cs:195:17:195:23 | object creation of type A : A | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:198:23:198:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:199:28:199:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:195:13:195:13 | access to local variable a : A | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:195:17:195:23 | object creation of type A : A | CollectionFlow.cs:195:13:195:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:198:23:198:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:199:28:199:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:197:14:197:20 | access to indexer | provenance | | | CollectionFlow.cs:198:23:198:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:18:61:18:64 | dict : Dictionary [element, property Value] : A | provenance | | @@ -149,11 +163,13 @@ edges | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:200:14:200:33 | call to method DictFirstValue | provenance | | | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:14:201:34 | call to method DictValuesFirst | provenance | | -| CollectionFlow.cs:217:17:217:23 | object creation of type A : A | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:220:21:220:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:217:13:217:13 | access to local variable a : A | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | provenance | | +| CollectionFlow.cs:217:17:217:23 | object creation of type A : A | CollectionFlow.cs:217:13:217:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:220:21:220:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:219:14:219:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | | | CollectionFlow.cs:219:14:219:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:219:14:219:30 | call to method First | provenance | | @@ -162,11 +178,13 @@ edges | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:221:14:221:32 | call to method DictKeysFirst | provenance | | | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:34:57:34:60 | dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:222:14:222:31 | call to method DictFirstKey | provenance | | -| CollectionFlow.cs:236:17:236:23 | object creation of type A : A | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:239:21:239:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:236:13:236:13 | access to local variable a : A | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | provenance | | +| CollectionFlow.cs:236:17:236:23 | object creation of type A : A | CollectionFlow.cs:236:13:236:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:239:21:239:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:238:14:238:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | | | CollectionFlow.cs:238:14:238:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:238:14:238:30 | call to method First | provenance | | @@ -175,24 +193,31 @@ edges | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:240:14:240:32 | call to method DictKeysFirst | provenance | | | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:34:57:34:60 | dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:241:14:241:31 | call to method DictFirstKey | provenance | | -| CollectionFlow.cs:255:17:255:23 | object creation of type A : A | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | provenance | | -| CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:255:13:255:13 | access to local variable a : A | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:255:17:255:23 | object creation of type A : A | CollectionFlow.cs:255:13:255:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:256:13:256:15 | access to local variable as : null [element] : A | CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:256:13:256:15 | access to local variable as : null [element] : A | provenance | | | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | provenance | | -| CollectionFlow.cs:257:22:257:22 | SSA def(x) : A | CollectionFlow.cs:258:18:258:18 | access to local variable x | provenance | | -| CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | CollectionFlow.cs:257:22:257:22 | SSA def(x) : A | provenance | | -| CollectionFlow.cs:270:17:270:23 | object creation of type A : A | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | provenance | | -| CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | CollectionFlow.cs:258:18:258:18 | access to local variable x | provenance | | +| CollectionFlow.cs:270:13:270:13 | access to local variable a : A | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:270:17:270:23 | object creation of type A : A | CollectionFlow.cs:270:13:270:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:271:13:271:15 | access to local variable as : null [element] : A | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:271:13:271:15 | access to local variable as : null [element] : A | provenance | | | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:272:13:272:22 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | provenance | | -| CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | +| CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | CollectionFlow.cs:272:13:272:22 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:274:18:274:35 | access to property Current | provenance | | -| CollectionFlow.cs:287:17:287:23 | object creation of type A : A | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:287:13:287:13 | access to local variable a : A | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:287:17:287:23 | object creation of type A : A | CollectionFlow.cs:287:13:287:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:289:9:289:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:290:26:290:29 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | CollectionFlow.cs:289:9:289:12 | [post] access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:290:13:290:22 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | | CollectionFlow.cs:290:26:290:29 | access to local variable list : List [element] : A | CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | provenance | | -| CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:290:13:290:22 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:292:18:292:35 | access to property Current | provenance | | -| CollectionFlow.cs:306:17:306:23 | object creation of type A : A | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | provenance | | +| CollectionFlow.cs:306:13:306:13 | access to local variable a : A | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | provenance | | +| CollectionFlow.cs:306:17:306:23 | object creation of type A : A | CollectionFlow.cs:306:13:306:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | CollectionFlow.cs:309:9:309:12 | access to local variable list : List [element, property Key] : A | provenance | | | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | provenance | | | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | provenance | | @@ -201,7 +226,8 @@ edges | CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:311:18:311:24 | access to property Key | provenance | | | CollectionFlow.cs:328:32:328:38 | element : A | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | provenance | | | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | CollectionFlow.cs:328:44:328:48 | [post] access to parameter array : A[] [element] : A | provenance | | -| CollectionFlow.cs:332:17:332:23 | object creation of type A : A | CollectionFlow.cs:334:23:334:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:332:13:332:13 | access to local variable a : A | CollectionFlow.cs:334:23:334:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:332:17:332:23 | object creation of type A : A | CollectionFlow.cs:332:13:332:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:335:14:335:16 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:336:18:336:20 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:337:20:337:22 | access to local variable as : A[] [element] : A | provenance | | @@ -213,7 +239,8 @@ edges | CollectionFlow.cs:337:20:337:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:337:14:337:23 | call to method First | provenance | | | CollectionFlow.cs:350:34:350:40 | element : A | CollectionFlow.cs:350:55:350:61 | access to parameter element : A | provenance | | | CollectionFlow.cs:350:55:350:61 | access to parameter element : A | CollectionFlow.cs:350:46:350:49 | [post] access to parameter list : List [element] : A | provenance | | -| CollectionFlow.cs:354:17:354:23 | object creation of type A : A | CollectionFlow.cs:356:23:356:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:354:13:354:13 | access to local variable a : A | CollectionFlow.cs:356:23:356:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:354:17:354:23 | object creation of type A : A | CollectionFlow.cs:354:13:354:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:357:14:357:17 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:358:22:358:25 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:359:24:359:27 | access to local variable list : List [element] : A | provenance | | @@ -229,46 +256,63 @@ edges | CollectionFlow.cs:376:20:376:38 | array creation of type A[] : null [element] : A | CollectionFlow.cs:36:49:36:52 | args : null [element] : A | provenance | | | CollectionFlow.cs:376:28:376:38 | { ..., ... } : null [element] : A | CollectionFlow.cs:376:20:376:38 | array creation of type A[] : null [element] : A | provenance | | | CollectionFlow.cs:376:30:376:36 | object creation of type A : A | CollectionFlow.cs:376:28:376:38 | { ..., ... } : null [element] : A | provenance | | -| CollectionFlow.cs:406:17:406:23 | object creation of type A : A | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | provenance | | +| CollectionFlow.cs:406:13:406:13 | access to local variable a : A | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | provenance | | +| CollectionFlow.cs:406:17:406:23 | object creation of type A : A | CollectionFlow.cs:406:13:406:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:408:9:408:13 | [post] access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:409:14:409:18 | access to local variable array : MyInlineArray [element] : A | provenance | | | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | CollectionFlow.cs:408:9:408:13 | [post] access to local variable array : MyInlineArray [element] : A | provenance | | | CollectionFlow.cs:409:14:409:18 | access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:409:14:409:21 | access to array element | provenance | | -| CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | provenance | | -| CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:427:13:427:13 | access to local variable a : A | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:427:13:427:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:428:13:428:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | CollectionFlow.cs:428:13:428:17 | access to local variable array : A[] [element] : A | provenance | | | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | provenance | | | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:429:14:429:21 | access to array element | provenance | | -| CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | provenance | | -| CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:434:13:434:13 | access to local variable a : A | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:434:13:434:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:435:17:435:17 | access to local variable l : List [element] : A | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | CollectionFlow.cs:435:17:435:17 | access to local variable l : List [element] : A | provenance | | | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | provenance | | | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | CollectionFlow.cs:436:14:436:17 | access to indexer | provenance | | -| CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | provenance | | -| CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:447:13:447:13 | access to local variable a : A | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:447:13:447:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:448:13:448:16 | access to local variable temp : A[] [element] : A | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | CollectionFlow.cs:448:13:448:16 | access to local variable temp : A[] [element] : A | provenance | | | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | provenance | | -| CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:449:13:449:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:449:13:449:17 | access to local variable array : A[] [element] : A | provenance | | | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:450:14:450:21 | access to array element | provenance | | -| CollectionFlow.cs:487:17:487:23 | object creation of type A : A | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | provenance | | -| CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:487:13:487:13 | access to local variable a : A | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:487:17:487:23 | object creation of type A : A | CollectionFlow.cs:487:13:487:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:488:17:488:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:488:17:488:20 | access to local variable span : Span [element] : A | provenance | | | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | provenance | | | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | CollectionFlow.cs:489:14:489:20 | access to indexer | provenance | | -| CollectionFlow.cs:494:17:494:23 | object creation of type A : A | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | provenance | | -| CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:494:13:494:13 | access to local variable a : A | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:494:17:494:23 | object creation of type A : A | CollectionFlow.cs:494:13:494:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:495:17:495:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:495:17:495:20 | access to local variable span : Span [element] : A | provenance | | | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | provenance | | +| CollectionFlow.cs:496:13:496:15 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | provenance | | | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | provenance | | -| CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | provenance | | +| CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | CollectionFlow.cs:496:13:496:15 | access to local variable arr : T[] [element] : A | provenance | | | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:497:14:497:19 | access to array element | provenance | | -| CollectionFlow.cs:502:17:502:23 | object creation of type A : A | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:502:13:502:13 | access to local variable a : A | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:502:17:502:23 | object creation of type A : A | CollectionFlow.cs:502:13:502:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:504:14:504:19 | access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:504:14:504:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:504:14:504:22 | access to indexer | provenance | | -| CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | CollectionFlow.cs:510:9:510:14 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:509:13:509:18 | access to local variable source : Span [element] : A | CollectionFlow.cs:510:9:510:14 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | CollectionFlow.cs:509:13:509:18 | access to local variable source : Span [element] : A | provenance | | | CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | provenance | | | CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | provenance | | | CollectionFlow.cs:509:42:509:48 | object creation of type A : A | CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | provenance | | | CollectionFlow.cs:510:9:510:14 | access to local variable source : Span [element] : A | CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:511:14:511:19 | access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:511:14:511:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:511:14:511:22 | access to indexer | provenance | | -| CollectionFlow.cs:516:17:516:23 | object creation of type A : A | CollectionFlow.cs:517:60:517:60 | access to local variable a : A | provenance | | -| CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | CollectionFlow.cs:518:14:518:17 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:516:13:516:13 | access to local variable a : A | CollectionFlow.cs:517:60:517:60 | access to local variable a : A | provenance | | +| CollectionFlow.cs:516:17:516:23 | object creation of type A : A | CollectionFlow.cs:516:13:516:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:517:25:517:28 | access to local variable span : ReadOnlySpan [element] : A | CollectionFlow.cs:518:14:518:17 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | CollectionFlow.cs:517:25:517:28 | access to local variable span : ReadOnlySpan [element] : A | provenance | | | CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | provenance | | | CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | provenance | | | CollectionFlow.cs:517:60:517:60 | access to local variable a : A | CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | provenance | | @@ -337,7 +381,9 @@ nodes | CollectionFlow.cs:36:63:36:66 | access to parameter args : A[] [element] : A | semmle.label | access to parameter args : A[] [element] : A | | CollectionFlow.cs:36:63:36:66 | access to parameter args : null [element] : A | semmle.label | access to parameter args : null [element] : A | | CollectionFlow.cs:36:63:36:69 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:40:13:40:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:40:17:40:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | @@ -345,7 +391,9 @@ nodes | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:44:14:44:23 | call to method First | semmle.label | call to method First | | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:58:13:58:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:58:17:58:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | | CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | semmle.label | { ..., ... } : CollectionFlow [field As, element] : A | | CollectionFlow.cs:59:45:59:55 | { ..., ... } : A[] [element] : A | semmle.label | { ..., ... } : A[] [element] : A | | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -357,6 +405,7 @@ nodes | CollectionFlow.cs:62:14:62:24 | call to method First | semmle.label | call to method First | | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:76:13:76:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:76:17:76:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | | CollectionFlow.cs:78:18:78:18 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -365,6 +414,7 @@ nodes | CollectionFlow.cs:80:18:80:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:81:14:81:23 | call to method First | semmle.label | call to method First | | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:96:13:96:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:96:17:96:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:98:19:98:19 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -373,7 +423,9 @@ nodes | CollectionFlow.cs:100:22:100:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:101:14:101:28 | call to method ListFirst | semmle.label | call to method ListFirst | | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:115:13:115:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:115:17:115:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | semmle.label | object creation of type List : List [element] : A | | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | @@ -381,6 +433,7 @@ nodes | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:119:14:119:28 | call to method ListFirst | semmle.label | call to method ListFirst | | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:132:13:132:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:132:17:132:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:134:18:134:18 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -389,6 +442,7 @@ nodes | CollectionFlow.cs:136:22:136:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:137:14:137:28 | call to method ListFirst | semmle.label | call to method ListFirst | | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:151:13:151:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:151:17:151:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | semmle.label | [post] access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:153:19:153:19 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -401,7 +455,9 @@ nodes | CollectionFlow.cs:157:29:157:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:158:14:158:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | | CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:174:13:174:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:174:17:174:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | @@ -413,7 +469,9 @@ nodes | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:180:14:180:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:195:13:195:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:195:17:195:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | @@ -425,7 +483,9 @@ nodes | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:201:14:201:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:217:13:217:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:217:17:217:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | @@ -436,7 +496,9 @@ nodes | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:222:14:222:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:236:13:236:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:236:17:236:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | @@ -447,26 +509,33 @@ nodes | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:241:14:241:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:255:13:255:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:255:17:255:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:256:13:256:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:257:22:257:22 | SSA def(x) : A | semmle.label | SSA def(x) : A | | CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:258:18:258:18 | access to local variable x | semmle.label | access to local variable x | +| CollectionFlow.cs:270:13:270:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:270:17:270:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:271:13:271:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:272:13:272:22 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | semmle.label | call to method GetEnumerator : IEnumerator [property Current] : A | | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | | CollectionFlow.cs:274:18:274:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:287:13:287:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:287:17:287:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:289:9:289:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:290:13:290:22 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | | CollectionFlow.cs:290:26:290:29 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : A | | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | | CollectionFlow.cs:292:18:292:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:306:13:306:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:306:17:306:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | semmle.label | [post] access to local variable list : List [element, property Key] : A | | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | semmle.label | object creation of type KeyValuePair : KeyValuePair [property Key] : A | @@ -478,6 +547,7 @@ nodes | CollectionFlow.cs:328:32:328:38 | element : A | semmle.label | element : A | | CollectionFlow.cs:328:44:328:48 | [post] access to parameter array : A[] [element] : A | semmle.label | [post] access to parameter array : A[] [element] : A | | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:332:13:332:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:332:17:332:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | | CollectionFlow.cs:334:23:334:23 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -489,6 +559,7 @@ nodes | CollectionFlow.cs:350:34:350:40 | element : A | semmle.label | element : A | | CollectionFlow.cs:350:46:350:49 | [post] access to parameter list : List [element] : A | semmle.label | [post] access to parameter list : List [element] : A | | CollectionFlow.cs:350:55:350:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:354:13:354:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:354:17:354:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:356:23:356:23 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -503,44 +574,59 @@ nodes | CollectionFlow.cs:376:20:376:38 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | | CollectionFlow.cs:376:28:376:38 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:376:30:376:36 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:406:13:406:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:406:17:406:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:408:9:408:13 | [post] access to local variable array : MyInlineArray [element] : A | semmle.label | [post] access to local variable array : MyInlineArray [element] : A | | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:409:14:409:18 | access to local variable array : MyInlineArray [element] : A | semmle.label | access to local variable array : MyInlineArray [element] : A | | CollectionFlow.cs:409:14:409:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:427:13:427:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:427:17:427:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:428:13:428:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:429:14:429:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:434:13:434:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:434:17:434:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:435:17:435:17 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | | CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | semmle.label | [...] : List [element] : A | | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | | CollectionFlow.cs:436:14:436:17 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:447:13:447:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:447:17:447:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:448:13:448:16 | access to local variable temp : A[] [element] : A | semmle.label | access to local variable temp : A[] [element] : A | | CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:449:13:449:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | semmle.label | .. access to local variable temp : A[] [element] : A | | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:450:14:450:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:487:13:487:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:487:17:487:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:488:17:488:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:489:14:489:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:494:13:494:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:494:17:494:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:495:17:495:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:496:13:496:15 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | semmle.label | call to method ToArray : T[] [element] : A | | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | | CollectionFlow.cs:497:14:497:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:502:13:502:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:502:17:502:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:504:14:504:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | | CollectionFlow.cs:504:14:504:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:509:13:509:18 | access to local variable source : Span [element] : A | semmle.label | access to local variable source : Span [element] : A | | CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | | CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | | CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | @@ -549,7 +635,9 @@ nodes | CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | | CollectionFlow.cs:511:14:511:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | | CollectionFlow.cs:511:14:511:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:516:13:516:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:516:17:516:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:517:25:517:28 | access to local variable span : ReadOnlySpan [element] : A | semmle.label | access to local variable span : ReadOnlySpan [element] : A | | CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | semmle.label | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | | CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | | CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | diff --git a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected index 70faa61bd73..47c418c803e 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected @@ -2,13 +2,15 @@ testFailures edges | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:5:29:5:45 | call to method Source : Object | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | provenance | | -| Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | +| Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | +| Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | Constructors.cs:15:18:15:19 | access to field s1 | provenance | | | Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:21:29:21:45 | call to method Source : Object | Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | provenance | | -| Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | +| Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | +| Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | Constructors.cs:33:18:33:19 | this access : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:33:18:33:19 | this access : C_with_ctor [field s1] : Object | Constructors.cs:33:18:33:19 | access to field s1 | provenance | | @@ -21,21 +23,27 @@ edges | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | provenance | | | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | this access : C2 [field Obj21] : Object | provenance | | | Constructors.cs:50:32:50:36 | this access : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | access to field Obj21 : Object | provenance | | -| Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:24 | SSA def(o22param) : Object | provenance | | -| Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:19 | SSA def(o1) : Object | provenance | | +| Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:20 | access to parameter o22param : Object | provenance | | +| Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:14 | access to parameter o1 : Object | provenance | | | Constructors.cs:62:41:62:41 | o : Object | Constructors.cs:64:37:64:37 | access to parameter o : Object | provenance | | | Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | provenance | | -| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | provenance | | -| Constructors.cs:70:17:70:33 | call to method Source : Object | Constructors.cs:71:25:71:25 | access to local variable o : Object | provenance | | -| Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | provenance | | +| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object | provenance | | +| Constructors.cs:70:13:70:13 | access to local variable o : Object | Constructors.cs:71:25:71:25 | access to local variable o : Object | provenance | | +| Constructors.cs:70:17:70:33 | call to method Source : Object | Constructors.cs:70:13:70:13 | access to local variable o : Object | provenance | | +| Constructors.cs:71:13:71:14 | access to local variable c1 : C1 [field Obj] : Object | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | provenance | | +| Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | Constructors.cs:71:13:71:14 | access to local variable c1 : C1 [field Obj] : Object | provenance | | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | provenance | | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | provenance | | | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | Constructors.cs:72:14:72:19 | access to field Obj | provenance | | -| Constructors.cs:77:19:77:35 | call to method Source : Object | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | provenance | | -| Constructors.cs:78:19:78:35 | call to method Source : Object | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | provenance | | -| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | Constructors.cs:80:14:80:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | -| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | -| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | +| Constructors.cs:77:13:77:15 | access to local variable o21 : Object | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | provenance | | +| Constructors.cs:77:19:77:35 | call to method Source : Object | Constructors.cs:77:13:77:15 | access to local variable o21 : Object | provenance | | +| Constructors.cs:78:13:78:15 | access to local variable o22 : Object | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | provenance | | +| Constructors.cs:78:19:78:35 | call to method Source : Object | Constructors.cs:78:13:78:15 | access to local variable o22 : Object | provenance | | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:80:14:80:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | +| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | Constructors.cs:44:28:44:35 | o21param : Object | provenance | | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | provenance | | | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | Constructors.cs:44:45:44:52 | o22param : Object | provenance | | @@ -45,28 +53,65 @@ edges | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:81:14:81:21 | access to property Obj22 | provenance | | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | provenance | | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:82:14:82:21 | access to property Obj23 | provenance | | -| Constructors.cs:91:21:91:37 | call to method Source : Object | Constructors.cs:92:19:92:23 | access to local variable taint : Object | provenance | | +| Constructors.cs:91:13:91:17 | access to local variable taint : Object | Constructors.cs:92:19:92:23 | access to local variable taint : Object | provenance | | +| Constructors.cs:91:21:91:37 | call to method Source : Object | Constructors.cs:91:13:91:17 | access to local variable taint : Object | provenance | | | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:52:35:52:35 | o : Object | provenance | | | Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:93:14:93:21 | access to property Obj22 | provenance | | -| Constructors.cs:99:21:99:37 | call to method Source : Object | Constructors.cs:100:25:100:29 | access to local variable taint : Object | provenance | | +| Constructors.cs:99:13:99:17 | access to local variable taint : Object | Constructors.cs:100:25:100:29 | access to local variable taint : Object | provenance | | +| Constructors.cs:99:21:99:37 | call to method Source : Object | Constructors.cs:99:13:99:17 | access to local variable taint : Object | provenance | | | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:62:41:62:41 | o : Object | provenance | | | Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:101:14:101:21 | access to property Obj22 | provenance | | | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | access to parameter o31param : Object | provenance | | -| Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | provenance | | -| Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | provenance | | +| Constructors.cs:111:13:111:15 | access to local variable o31 : Object | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | provenance | | +| Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:111:13:111:15 | access to local variable o31 : Object | provenance | | +| Constructors.cs:112:13:112:14 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | provenance | | +| Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | Constructors.cs:112:13:112:14 | access to local variable c3 : C3 [parameter o31param] : Object | provenance | | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | Constructors.cs:104:28:104:35 | o31param : Object | provenance | | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | provenance | | | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | provenance | | | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | provenance | | +| Constructors.cs:121:26:121:28 | oc1 : Object | Constructors.cs:123:20:123:22 | access to parameter oc1 : Object | provenance | | +| Constructors.cs:121:38:121:40 | oc2 : Object | Constructors.cs:124:20:124:22 | access to parameter oc2 : Object | provenance | | +| Constructors.cs:123:20:123:22 | access to parameter oc1 : Object | Constructors.cs:123:13:123:16 | [post] this access : C4 [property Obj1] : Object | provenance | | +| Constructors.cs:124:20:124:22 | access to parameter oc2 : Object | Constructors.cs:124:13:124:16 | [post] this access : C4 [property Obj2] : Object | provenance | | +| Constructors.cs:130:13:130:14 | access to local variable o1 : Object | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | provenance | | +| Constructors.cs:130:18:130:34 | call to method Source : Object | Constructors.cs:130:13:130:14 | access to local variable o1 : Object | provenance | | +| Constructors.cs:131:13:131:14 | access to local variable o2 : Object | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | provenance | | +| Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:131:13:131:14 | access to local variable o2 : Object | provenance | | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | provenance | | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | provenance | | +| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj1] : Object | provenance | | +| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj2] : Object | provenance | | +| Constructors.cs:132:25:132:26 | access to local variable o1 : Object | Constructors.cs:121:26:121:28 | oc1 : Object | provenance | | +| Constructors.cs:132:25:132:26 | access to local variable o1 : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | provenance | | +| Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:121:38:121:40 | oc2 : Object | provenance | | +| Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | provenance | | +| Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | provenance | | +| Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | provenance | | +| Constructors.cs:141:13:141:14 | access to local variable o1 : Object | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | provenance | | +| Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:141:13:141:14 | access to local variable o1 : Object | provenance | | +| Constructors.cs:142:13:142:14 | access to local variable o2 : Object | Constructors.cs:143:29:143:30 | access to local variable o2 : Object | provenance | | +| Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:142:13:142:14 | access to local variable o2 : Object | provenance | | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | provenance | | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | provenance | | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | provenance | | +| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | provenance | | nodes | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object | | Constructors.cs:5:29:5:45 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | semmle.label | access to local variable c : C_no_ctor [field s1] : Object | | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | semmle.label | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | semmle.label | access to local variable c : C_no_ctor [field s1] : Object | | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | semmle.label | this : C_no_ctor [field s1] : Object | @@ -74,6 +119,7 @@ nodes | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | semmle.label | this access : C_no_ctor [field s1] : Object | | Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | semmle.label | [post] this access : C_with_ctor [field s1] : Object | | Constructors.cs:21:29:21:45 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | semmle.label | access to local variable c : C_with_ctor [field s1] : Object | | Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | semmle.label | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | semmle.label | access to local variable c : C_with_ctor [field s1] : Object | | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | semmle.label | this : C_with_ctor [field s1] : Object | @@ -93,19 +139,25 @@ nodes | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | semmle.label | this : C2 [field Obj21] : Object | | Constructors.cs:50:32:50:36 | this access : C2 [field Obj21] : Object | semmle.label | this access : C2 [field Obj21] : Object | | Constructors.cs:52:35:52:35 | o : Object | semmle.label | o : Object | -| Constructors.cs:54:13:54:24 | SSA def(o22param) : Object | semmle.label | SSA def(o22param) : Object | +| Constructors.cs:54:13:54:20 | access to parameter o22param : Object | semmle.label | access to parameter o22param : Object | | Constructors.cs:57:54:57:55 | o2 : Object | semmle.label | o2 : Object | -| Constructors.cs:59:13:59:19 | SSA def(o1) : Object | semmle.label | SSA def(o1) : Object | +| Constructors.cs:59:13:59:14 | access to parameter o1 : Object | semmle.label | access to parameter o1 : Object | | Constructors.cs:62:41:62:41 | o : Object | semmle.label | o : Object | -| Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | semmle.label | SSA def(o22param) : Object | +| Constructors.cs:64:27:64:34 | access to parameter o22param : Object | semmle.label | access to parameter o22param : Object | | Constructors.cs:64:37:64:37 | access to parameter o : Object | semmle.label | access to parameter o : Object | +| Constructors.cs:70:13:70:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Constructors.cs:70:17:70:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:71:13:71:14 | access to local variable c1 : C1 [field Obj] : Object | semmle.label | access to local variable c1 : C1 [field Obj] : Object | | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | semmle.label | object creation of type C1 : C1 [field Obj] : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | semmle.label | access to local variable c1 : C1 [field Obj] : Object | | Constructors.cs:72:14:72:19 | access to field Obj | semmle.label | access to field Obj | +| Constructors.cs:77:13:77:15 | access to local variable o21 : Object | semmle.label | access to local variable o21 : Object | | Constructors.cs:77:19:77:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:78:13:78:15 | access to local variable o22 : Object | semmle.label | access to local variable o22 : Object | | Constructors.cs:78:19:78:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | semmle.label | access to local variable c2 : C2 [field Obj21] : Object | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | semmle.label | object creation of type C2 : C2 [field Obj21] : Object | | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | semmle.label | object creation of type C2 : C2 [parameter o22param] : Object | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | semmle.label | access to local variable o21 : Object | @@ -116,11 +168,13 @@ nodes | Constructors.cs:81:14:81:21 | access to property Obj22 | semmle.label | access to property Obj22 | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | semmle.label | access to local variable c2 : C2 [field Obj21] : Object | | Constructors.cs:82:14:82:21 | access to property Obj23 | semmle.label | access to property Obj23 | +| Constructors.cs:91:13:91:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | Constructors.cs:91:21:91:37 | call to method Source : Object | semmle.label | call to method Source : Object | | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:92:19:92:23 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:93:14:93:21 | access to property Obj22 | semmle.label | access to property Obj22 | +| Constructors.cs:99:13:99:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | Constructors.cs:99:21:99:37 | call to method Source : Object | semmle.label | call to method Source : Object | | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:100:25:100:29 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | @@ -129,24 +183,66 @@ nodes | Constructors.cs:104:28:104:35 | o31param : Object | semmle.label | o31param : Object | | Constructors.cs:106:32:106:39 | access to parameter o31param : Object | semmle.label | access to parameter o31param : Object | | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | semmle.label | this : C3 [parameter o31param] : Object | +| Constructors.cs:111:13:111:15 | access to local variable o31 : Object | semmle.label | access to local variable o31 : Object | | Constructors.cs:111:19:111:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:112:13:112:14 | access to local variable c3 : C3 [parameter o31param] : Object | semmle.label | access to local variable c3 : C3 [parameter o31param] : Object | | Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | semmle.label | object creation of type C3 : C3 [parameter o31param] : Object | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | semmle.label | access to local variable o31 : Object | | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | semmle.label | access to local variable c3 : C3 [parameter o31param] : Object | | Constructors.cs:113:14:113:21 | access to property Obj31 | semmle.label | access to property Obj31 | +| Constructors.cs:121:26:121:28 | oc1 : Object | semmle.label | oc1 : Object | +| Constructors.cs:121:38:121:40 | oc2 : Object | semmle.label | oc2 : Object | +| Constructors.cs:123:13:123:16 | [post] this access : C4 [property Obj1] : Object | semmle.label | [post] this access : C4 [property Obj1] : Object | +| Constructors.cs:123:20:123:22 | access to parameter oc1 : Object | semmle.label | access to parameter oc1 : Object | +| Constructors.cs:124:13:124:16 | [post] this access : C4 [property Obj2] : Object | semmle.label | [post] this access : C4 [property Obj2] : Object | +| Constructors.cs:124:20:124:22 | access to parameter oc2 : Object | semmle.label | access to parameter oc2 : Object | +| Constructors.cs:130:13:130:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Constructors.cs:130:18:130:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:131:13:131:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Constructors.cs:131:18:131:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj1] : Object | semmle.label | access to local variable c4 : C4 [property Obj1] : Object | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj2] : Object | semmle.label | access to local variable c4 : C4 [property Obj2] : Object | +| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | semmle.label | object creation of type C4 : C4 [property Obj1] : Object | +| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | semmle.label | object creation of type C4 : C4 [property Obj2] : Object | +| Constructors.cs:132:25:132:26 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Constructors.cs:132:29:132:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | semmle.label | access to local variable c4 : C4 [property Obj1] : Object | +| Constructors.cs:133:14:133:20 | access to property Obj1 | semmle.label | access to property Obj1 | +| Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | semmle.label | access to local variable c4 : C4 [property Obj2] : Object | +| Constructors.cs:134:14:134:20 | access to property Obj2 | semmle.label | access to property Obj2 | +| Constructors.cs:137:29:137:32 | Obj1 : Object | semmle.label | Obj1 : Object | +| Constructors.cs:137:42:137:45 | Obj2 : Object | semmle.label | Obj2 : Object | +| Constructors.cs:141:13:141:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Constructors.cs:141:18:141:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:142:13:142:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Constructors.cs:142:18:142:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj1] : Object | semmle.label | access to local variable r1 : R1 [property Obj1] : Object | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | semmle.label | object creation of type R1 : R1 [property Obj1] : Object | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | semmle.label | object creation of type R1 : R1 [property Obj2] : Object | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | semmle.label | access to local variable r1 : R1 [property Obj1] : Object | +| Constructors.cs:144:14:144:20 | access to property Obj1 | semmle.label | access to property Obj1 | +| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | +| Constructors.cs:145:14:145:20 | access to property Obj2 | semmle.label | access to property Obj2 | subpaths -| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:19 | SSA def(o1) : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | +| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:14 | access to parameter o1 : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | Constructors.cs:44:28:44:35 | o21param : Object | Constructors.cs:46:23:46:27 | [post] this access : C2 [field Obj21] : Object | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | Constructors.cs:44:45:44:52 | o22param : Object | Constructors.cs:44:45:44:52 | o22param : Object | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | Constructors.cs:81:14:81:21 | access to property Obj22 | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | access to field Obj21 : Object | Constructors.cs:82:14:82:21 | access to property Obj23 | -| Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:24 | SSA def(o22param) : Object | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | +| Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:20 | access to parameter o22param : Object | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | Constructors.cs:93:14:93:21 | access to property Obj22 | -| Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:62:41:62:41 | o : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | +| Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:62:41:62:41 | o : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | Constructors.cs:101:14:101:21 | access to property Obj22 | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | Constructors.cs:104:28:104:35 | o31param : Object | Constructors.cs:104:28:104:35 | o31param : Object | Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | access to parameter o31param : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | +| Constructors.cs:132:25:132:26 | access to local variable o1 : Object | Constructors.cs:121:26:121:28 | oc1 : Object | Constructors.cs:123:13:123:16 | [post] this access : C4 [property Obj1] : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | +| Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:121:38:121:40 | oc2 : Object | Constructors.cs:124:13:124:16 | [post] this access : C4 [property Obj2] : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | #select | Constructors.cs:15:18:15:19 | access to field s1 | Constructors.cs:5:29:5:45 | call to method Source : Object | Constructors.cs:15:18:15:19 | access to field s1 | $@ | Constructors.cs:5:29:5:45 | call to method Source : Object | call to method Source : Object | | Constructors.cs:33:18:33:19 | access to field s1 | Constructors.cs:21:29:21:45 | call to method Source : Object | Constructors.cs:33:18:33:19 | access to field s1 | $@ | Constructors.cs:21:29:21:45 | call to method Source : Object | call to method Source : Object | @@ -157,3 +253,7 @@ subpaths | Constructors.cs:93:14:93:21 | access to property Obj22 | Constructors.cs:91:21:91:37 | call to method Source : Object | Constructors.cs:93:14:93:21 | access to property Obj22 | $@ | Constructors.cs:91:21:91:37 | call to method Source : Object | call to method Source : Object | | Constructors.cs:101:14:101:21 | access to property Obj22 | Constructors.cs:99:21:99:37 | call to method Source : Object | Constructors.cs:101:14:101:21 | access to property Obj22 | $@ | Constructors.cs:99:21:99:37 | call to method Source : Object | call to method Source : Object | | Constructors.cs:113:14:113:21 | access to property Obj31 | Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | $@ | Constructors.cs:111:19:111:35 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:133:14:133:20 | access to property Obj1 | Constructors.cs:130:18:130:34 | call to method Source : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | $@ | Constructors.cs:130:18:130:34 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:134:14:134:20 | access to property Obj2 | Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | $@ | Constructors.cs:131:18:131:34 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:144:14:144:20 | access to property Obj1 | Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | $@ | Constructors.cs:141:18:141:34 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:145:14:145:20 | access to property Obj2 | Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | $@ | Constructors.cs:142:18:142:35 | call to method Source : Object | call to method Source : Object | diff --git a/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs b/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs index f8a75953d08..9eae5079d84 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs +++ b/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs @@ -113,6 +113,38 @@ public class Constructors Sink(c3.Obj31); // $ hasValueFlow=6 } + public class C4 + { + public object Obj1 { get; init; } + public object Obj2 { get; } + + public C4(object oc1, object oc2) + { + Obj1 = oc1; + Obj2 = oc2; + } + } + + public void M6() + { + var o1 = Source(7); + var o2 = Source(8); + var c4 = new C4(o1, o2); + Sink(c4.Obj1); // $ hasValueFlow=7 + Sink(c4.Obj2); // $ hasValueFlow=8 + } + + public record R1(object Obj1, object Obj2); + + public void M7() + { + var o1 = Source(9); + var o2 = Source(10); + var r1 = new R1(o1, o2); + Sink(r1.Obj1); // $ hasValueFlow=9 + Sink(r1.Obj2); // $ hasValueFlow=10 + } + public static void Sink(object o) { } public static T Source(object source) => throw null; diff --git a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql index 729d19f6d1e..1ff95c93b22 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql @@ -1,7 +1,10 @@ import csharp +private import semmle.code.csharp.controlflow.internal.PreSsa /** "Naive" def-use implementation. */ -predicate defReaches(AssignableDefinition def, LocalScopeVariable v, ControlFlow::Node cfn) { +predicate defReaches( + AssignableDefinition def, PreSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn +) { def.getTarget() = v and cfn = def.getAControlFlowNode().getASuccessor() or exists(ControlFlow::Node mid | defReaches(def, v, mid) | diff --git a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql index e83eba4dd7c..79e0e318e7a 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql @@ -1,8 +1,10 @@ import csharp +private import semmle.code.csharp.controlflow.internal.PreSsa /** "Naive" parameter-use implementation. */ predicate parameterReaches(Parameter p, ControlFlow::Node cfn) { - cfn = p.getCallable().getEntryPoint().getASuccessor() + cfn = p.getCallable().getEntryPoint().getASuccessor() and + p instanceof PreSsa::SimpleLocalScopeVariable or exists(ControlFlow::Node mid | parameterReaches(p, mid) | not mid = diff --git a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql index e09c3d15caa..c32fc80c782 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql @@ -1,7 +1,10 @@ import csharp +private import semmle.code.csharp.controlflow.internal.PreSsa /** "Naive" use-use implementation. */ -predicate useReaches(LocalScopeVariableRead read, LocalScopeVariable v, ControlFlow::Node cfn) { +predicate useReaches( + LocalScopeVariableRead read, PreSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn +) { read.getTarget() = v and cfn = read.getAControlFlowNode().getASuccessor() or exists(ControlFlow::Node mid | useReaches(read, v, mid) | diff --git a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected index a64ed809a80..c6a600f068a 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected @@ -1,12 +1,16 @@ invalidModelRow edges -| ExternalFlow.cs:9:27:9:38 | object creation of type Object : Object | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | provenance | | +| ExternalFlow.cs:9:20:9:23 | access to local variable arg1 : Object | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | provenance | | +| ExternalFlow.cs:9:27:9:38 | object creation of type Object : Object | ExternalFlow.cs:9:20:9:23 | access to local variable arg1 : Object | provenance | | | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | ExternalFlow.cs:10:18:10:33 | call to method StepArgRes | provenance | | -| ExternalFlow.cs:15:29:15:40 | object creation of type Object : Object | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | provenance | | -| ExternalFlow.cs:16:30:16:41 | object creation of type Object : Object | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | provenance | | +| ExternalFlow.cs:15:20:15:25 | access to local variable argIn1 : Object | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | provenance | | +| ExternalFlow.cs:15:29:15:40 | object creation of type Object : Object | ExternalFlow.cs:15:20:15:25 | access to local variable argIn1 : Object | provenance | | +| ExternalFlow.cs:16:20:16:26 | access to local variable argOut1 : Object | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | provenance | | +| ExternalFlow.cs:16:30:16:41 | object creation of type Object : Object | ExternalFlow.cs:16:20:16:26 | access to local variable argOut1 : Object | provenance | | | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | ExternalFlow.cs:17:32:17:38 | [post] access to local variable argOut1 : Object | provenance | | | ExternalFlow.cs:17:32:17:38 | [post] access to local variable argOut1 : Object | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | provenance | | -| ExternalFlow.cs:23:27:23:38 | object creation of type Object : Object | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | provenance | | +| ExternalFlow.cs:23:20:23:23 | access to local variable arg2 : Object | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | provenance | | +| ExternalFlow.cs:23:27:23:38 | object creation of type Object : Object | ExternalFlow.cs:23:20:23:23 | access to local variable arg2 : Object | provenance | | | ExternalFlow.cs:24:13:24:29 | [post] this access : D | ExternalFlow.cs:25:18:25:21 | this access | provenance | | | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | ExternalFlow.cs:24:13:24:29 | [post] this access : D | provenance | | | ExternalFlow.cs:30:13:30:16 | [post] this access : D [field Field] : Object | ExternalFlow.cs:31:18:31:21 | this access : D [field Field] : Object | provenance | | @@ -30,23 +34,29 @@ edges | ExternalFlow.cs:55:18:55:21 | this access : D [element] : Object | ExternalFlow.cs:55:18:55:41 | call to method StepElementGetter | provenance | | | ExternalFlow.cs:60:35:60:35 | o : Object | ExternalFlow.cs:60:47:60:47 | access to parameter o | provenance | | | ExternalFlow.cs:60:64:60:75 | object creation of type Object : Object | ExternalFlow.cs:60:35:60:35 | o : Object | provenance | | -| ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | ExternalFlow.cs:66:18:66:18 | access to local variable o | provenance | | +| ExternalFlow.cs:65:17:65:17 | access to local variable o : Object | ExternalFlow.cs:66:18:66:18 | access to local variable o | provenance | | +| ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | ExternalFlow.cs:65:17:65:17 | access to local variable o : Object | provenance | | | ExternalFlow.cs:65:45:65:56 | object creation of type Object : Object | ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | provenance | | -| ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:71:17:71:20 | access to local variable objs : null [element] : Object | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:71:17:71:20 | access to local variable objs : null [element] : Object | provenance | | | ExternalFlow.cs:71:32:71:43 | object creation of type Object : Object | ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | provenance | | | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | ExternalFlow.cs:72:23:72:23 | o : Object | provenance | | | ExternalFlow.cs:72:23:72:23 | o : Object | ExternalFlow.cs:72:35:72:35 | access to parameter o | provenance | | -| ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | provenance | | +| ExternalFlow.cs:77:17:77:20 | access to local variable objs : T[] [element] : Object | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | provenance | | +| ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | ExternalFlow.cs:77:17:77:20 | access to local variable objs : T[] [element] : Object | provenance | | | ExternalFlow.cs:77:46:77:57 | object creation of type Object : Object | ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | provenance | | | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | ExternalFlow.cs:78:18:78:24 | access to array element | provenance | | -| ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:83:17:83:20 | access to local variable objs : null [element] : Object | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:83:17:83:20 | access to local variable objs : null [element] : Object | provenance | | | ExternalFlow.cs:83:32:83:43 | object creation of type Object : Object | ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | provenance | | -| ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | provenance | | +| ExternalFlow.cs:84:17:84:21 | access to local variable objs2 : T[] [element] : Object | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | provenance | | +| ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | ExternalFlow.cs:84:17:84:21 | access to local variable objs2 : T[] [element] : Object | provenance | | | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | provenance | | | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | ExternalFlow.cs:85:18:85:25 | access to array element | provenance | | -| ExternalFlow.cs:90:21:90:34 | object creation of type String : String | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | provenance | | -| ExternalFlow.cs:91:19:91:19 | access to local variable s : String | ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | provenance | | -| ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | ExternalFlow.cs:92:18:92:18 | (...) ... | provenance | | +| ExternalFlow.cs:90:17:90:17 | access to local variable s : String | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | provenance | | +| ExternalFlow.cs:90:21:90:34 | object creation of type String : String | ExternalFlow.cs:90:17:90:17 | access to local variable s : String | provenance | | +| ExternalFlow.cs:91:19:91:19 | access to local variable s : String | ExternalFlow.cs:91:30:91:30 | Int32 i : Int32 | provenance | | +| ExternalFlow.cs:91:30:91:30 | Int32 i : Int32 | ExternalFlow.cs:92:18:92:18 | (...) ... | provenance | | | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:103:16:103:17 | access to local variable d1 : D [field Field] : Object | provenance | | | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:104:18:104:19 | access to local variable d1 : D [field Field] : Object | provenance | | | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | provenance | | @@ -56,31 +66,42 @@ edges | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f : F [field MyField] : Object | ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | provenance | | | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f : F [field MyField] : Object | provenance | | | ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | ExternalFlow.cs:112:18:112:25 | access to property MyProp | provenance | | -| ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | provenance | | +| ExternalFlow.cs:117:17:117:17 | access to local variable a : null [element] : Object | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | provenance | | +| ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | ExternalFlow.cs:117:17:117:17 | access to local variable a : null [element] : Object | provenance | | | ExternalFlow.cs:117:36:117:47 | object creation of type Object : Object | ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | provenance | | -| ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | provenance | | +| ExternalFlow.cs:118:17:118:17 | access to local variable b : null [element] : Object | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | provenance | | +| ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | ExternalFlow.cs:118:17:118:17 | access to local variable b : null [element] : Object | provenance | | | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | provenance | | | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | ExternalFlow.cs:120:18:120:21 | access to array element | provenance | | -| ExternalFlow.cs:205:22:205:33 | object creation of type Object : Object | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | provenance | | +| ExternalFlow.cs:205:17:205:18 | access to local variable o2 : Object | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | provenance | | +| ExternalFlow.cs:205:22:205:33 | object creation of type Object : Object | ExternalFlow.cs:205:17:205:18 | access to local variable o2 : Object | provenance | | | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | ExternalFlow.cs:206:18:206:40 | call to method MixedFlowArgs | provenance | | -| ExternalFlow.cs:211:22:211:33 | object creation of type Object : Object | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | provenance | | +| ExternalFlow.cs:211:17:211:18 | access to local variable o1 : Object | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | provenance | | +| ExternalFlow.cs:211:22:211:33 | object creation of type Object : Object | ExternalFlow.cs:211:17:211:18 | access to local variable o1 : Object | provenance | | | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | ExternalFlow.cs:212:18:212:54 | call to method GeneratedFlowWithGeneratedNeutral | provenance | | -| ExternalFlow.cs:244:21:244:28 | object creation of type HC : HC | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | provenance | | +| ExternalFlow.cs:244:17:244:17 | access to local variable h : HC | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | provenance | | +| ExternalFlow.cs:244:21:244:28 | object creation of type HC : HC | ExternalFlow.cs:244:17:244:17 | access to local variable h : HC | provenance | | +| ExternalFlow.cs:245:17:245:17 | access to local variable o : HC | ExternalFlow.cs:246:18:246:18 | access to local variable o | provenance | | | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | provenance | | -| ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | ExternalFlow.cs:246:18:246:18 | access to local variable o | provenance | | +| ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | ExternalFlow.cs:245:17:245:17 | access to local variable o : HC | provenance | | | ExternalFlow.cs:262:13:262:13 | [post] access to parameter a : MyInlineArray [element] : Object | ExternalFlow.cs:263:30:263:30 | access to parameter a : MyInlineArray [element] : Object | provenance | | | ExternalFlow.cs:262:20:262:31 | object creation of type Object : Object | ExternalFlow.cs:262:13:262:13 | [post] access to parameter a : MyInlineArray [element] : Object | provenance | | -| ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | ExternalFlow.cs:264:18:264:18 | access to local variable b | provenance | | +| ExternalFlow.cs:263:17:263:17 | access to local variable b : Object | ExternalFlow.cs:264:18:264:18 | access to local variable b | provenance | | +| ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | ExternalFlow.cs:263:17:263:17 | access to local variable b : Object | provenance | | | ExternalFlow.cs:263:30:263:30 | access to parameter a : MyInlineArray [element] : Object | ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | provenance | | nodes +| ExternalFlow.cs:9:20:9:23 | access to local variable arg1 : Object | semmle.label | access to local variable arg1 : Object | | ExternalFlow.cs:9:27:9:38 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:10:18:10:33 | call to method StepArgRes | semmle.label | call to method StepArgRes | | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | semmle.label | access to local variable arg1 : Object | +| ExternalFlow.cs:15:20:15:25 | access to local variable argIn1 : Object | semmle.label | access to local variable argIn1 : Object | | ExternalFlow.cs:15:29:15:40 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:16:20:16:26 | access to local variable argOut1 : Object | semmle.label | access to local variable argOut1 : Object | | ExternalFlow.cs:16:30:16:41 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | semmle.label | access to local variable argIn1 : Object | | ExternalFlow.cs:17:32:17:38 | [post] access to local variable argOut1 : Object | semmle.label | [post] access to local variable argOut1 : Object | | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | semmle.label | access to local variable argOut1 | +| ExternalFlow.cs:23:20:23:23 | access to local variable arg2 : Object | semmle.label | access to local variable arg2 : Object | | ExternalFlow.cs:23:27:23:38 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:24:13:24:29 | [post] this access : D | semmle.label | [post] this access : D | | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | semmle.label | access to local variable arg2 : Object | @@ -112,27 +133,33 @@ nodes | ExternalFlow.cs:60:35:60:35 | o : Object | semmle.label | o : Object | | ExternalFlow.cs:60:47:60:47 | access to parameter o | semmle.label | access to parameter o | | ExternalFlow.cs:60:64:60:75 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:65:17:65:17 | access to local variable o : Object | semmle.label | access to local variable o : Object | | ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | semmle.label | call to method Apply : Object | | ExternalFlow.cs:65:45:65:56 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:66:18:66:18 | access to local variable o | semmle.label | access to local variable o | +| ExternalFlow.cs:71:17:71:20 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:71:32:71:43 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:72:23:72:23 | o : Object | semmle.label | o : Object | | ExternalFlow.cs:72:35:72:35 | access to parameter o | semmle.label | access to parameter o | +| ExternalFlow.cs:77:17:77:20 | access to local variable objs : T[] [element] : Object | semmle.label | access to local variable objs : T[] [element] : Object | | ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | semmle.label | call to method Map : T[] [element] : Object | | ExternalFlow.cs:77:46:77:57 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | semmle.label | access to local variable objs : T[] [element] : Object | | ExternalFlow.cs:78:18:78:24 | access to array element | semmle.label | access to array element | +| ExternalFlow.cs:83:17:83:20 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:83:32:83:43 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:84:17:84:21 | access to local variable objs2 : T[] [element] : Object | semmle.label | access to local variable objs2 : T[] [element] : Object | | ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | semmle.label | call to method Map : T[] [element] : Object | | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | semmle.label | access to local variable objs2 : T[] [element] : Object | | ExternalFlow.cs:85:18:85:25 | access to array element | semmle.label | access to array element | +| ExternalFlow.cs:90:17:90:17 | access to local variable s : String | semmle.label | access to local variable s : String | | ExternalFlow.cs:90:21:90:34 | object creation of type String : String | semmle.label | object creation of type String : String | | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | semmle.label | access to local variable s : String | -| ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | semmle.label | SSA def(i) : Int32 | +| ExternalFlow.cs:91:30:91:30 | Int32 i : Int32 | semmle.label | Int32 i : Int32 | | ExternalFlow.cs:92:18:92:18 | (...) ... | semmle.label | (...) ... | | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | semmle.label | [post] access to local variable d1 : D [field Field] : Object | | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | @@ -145,24 +172,31 @@ nodes | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | semmle.label | access to local variable f : F [field MyField] : Object | | ExternalFlow.cs:112:18:112:25 | access to property MyProp | semmle.label | access to property MyProp | +| ExternalFlow.cs:117:17:117:17 | access to local variable a : null [element] : Object | semmle.label | access to local variable a : null [element] : Object | | ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:117:36:117:47 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:118:17:118:17 | access to local variable b : null [element] : Object | semmle.label | access to local variable b : null [element] : Object | | ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | semmle.label | call to method Reverse : null [element] : Object | | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | semmle.label | access to local variable a : null [element] : Object | | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | semmle.label | access to local variable b : null [element] : Object | | ExternalFlow.cs:120:18:120:21 | access to array element | semmle.label | access to array element | +| ExternalFlow.cs:205:17:205:18 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | ExternalFlow.cs:205:22:205:33 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:206:18:206:40 | call to method MixedFlowArgs | semmle.label | call to method MixedFlowArgs | | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| ExternalFlow.cs:211:17:211:18 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | ExternalFlow.cs:211:22:211:33 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:212:18:212:54 | call to method GeneratedFlowWithGeneratedNeutral | semmle.label | call to method GeneratedFlowWithGeneratedNeutral | | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| ExternalFlow.cs:244:17:244:17 | access to local variable h : HC | semmle.label | access to local variable h : HC | | ExternalFlow.cs:244:21:244:28 | object creation of type HC : HC | semmle.label | object creation of type HC : HC | +| ExternalFlow.cs:245:17:245:17 | access to local variable o : HC | semmle.label | access to local variable o : HC | | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | semmle.label | access to local variable h : HC | | ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | semmle.label | call to method ExtensionMethod : HC | | ExternalFlow.cs:246:18:246:18 | access to local variable o | semmle.label | access to local variable o | | ExternalFlow.cs:262:13:262:13 | [post] access to parameter a : MyInlineArray [element] : Object | semmle.label | [post] access to parameter a : MyInlineArray [element] : Object | | ExternalFlow.cs:262:20:262:31 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:263:17:263:17 | access to local variable b : Object | semmle.label | access to local variable b : Object | | ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | semmle.label | call to method GetFirst : Object | | ExternalFlow.cs:263:30:263:30 | access to parameter a : MyInlineArray [element] : Object | semmle.label | access to parameter a : MyInlineArray [element] : Object | | ExternalFlow.cs:264:18:264:18 | access to local variable b | semmle.label | access to local variable b | diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected index b5c1624c251..f6f6da0109c 100644 --- a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected @@ -1,9 +1,13 @@ testFailures edges -| A.cs:5:17:5:28 | call to method Source : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | -| A.cs:5:17:5:28 | call to method Source : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | -| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | -| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | +| A.cs:5:13:5:13 | access to local variable c : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | +| A.cs:5:13:5:13 | access to local variable c : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | +| A.cs:5:17:5:28 | call to method Source : C | A.cs:5:13:5:13 | access to local variable c : C | provenance | | +| A.cs:5:17:5:28 | call to method Source : C | A.cs:5:13:5:13 | access to local variable c : C | provenance | | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | +| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:6:13:6:13 | access to local variable b : B [field c] : C | provenance | | +| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:6:13:6:13 | access to local variable b : B [field c] : C | provenance | | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | provenance | | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | provenance | | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:147:32:147:32 | c : C | provenance | | @@ -28,16 +32,20 @@ edges | A.cs:15:21:15:34 | call to method Source : C | A.cs:15:15:15:35 | object creation of type B : B [field c] : C | provenance | | | A.cs:15:21:15:34 | call to method Source : C | A.cs:141:20:141:20 | c : C | provenance | | | A.cs:15:21:15:34 | call to method Source : C | A.cs:141:20:141:20 | c : C | provenance | | -| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | -| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:42:29:42:29 | c : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:42:29:42:29 | c : C2 | provenance | | | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:17 | access to field c | provenance | | | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:17 | access to field c | provenance | | -| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | -| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:31:29:31:41 | call to method Source : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | provenance | | | A.cs:31:29:31:41 | call to method Source : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | provenance | | | A.cs:31:29:31:41 | call to method Source : C2 | A.cs:36:33:36:33 | c : C2 | provenance | | @@ -46,8 +54,10 @@ edges | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | A.cs:33:14:33:17 | access to field c | provenance | | | A.cs:36:33:36:33 | c : C2 | A.cs:38:29:38:29 | access to parameter c : C2 | provenance | | | A.cs:36:33:36:33 | c : C2 | A.cs:38:29:38:29 | access to parameter c : C2 | provenance | | -| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | -| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | +| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:42:29:42:29 | c : C2 | provenance | | @@ -60,8 +70,10 @@ edges | A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:47:13:47:14 | [post] access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:145:27:145:27 | c : C2 | provenance | | | A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:145:27:145:27 | c : C2 | provenance | | -| A.cs:55:17:55:28 | call to method Source : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | -| A.cs:55:17:55:28 | call to method Source : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | +| A.cs:55:13:55:13 | access to local variable a : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | +| A.cs:55:13:55:13 | access to local variable a : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | +| A.cs:55:17:55:28 | call to method Source : A | A.cs:55:13:55:13 | access to local variable a : A | provenance | | +| A.cs:55:17:55:28 | call to method Source : A | A.cs:55:13:55:13 | access to local variable a : A | provenance | | | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | A.cs:58:12:58:13 | access to local variable c1 : C1 [field a] : A | provenance | | | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | A.cs:58:12:58:13 | access to local variable c1 : C1 [field a] : A | provenance | | | A.cs:57:16:57:16 | access to local variable a : A | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | provenance | | @@ -104,12 +116,18 @@ edges | A.cs:98:22:98:43 | ... ? ... : ... : B [field c] : C | A.cs:98:13:98:16 | [post] this access : D [field b, field c] : C | provenance | | | A.cs:98:30:98:43 | call to method Source : B | A.cs:98:22:98:43 | ... ? ... : ... : B | provenance | | | A.cs:98:30:98:43 | call to method Source : B | A.cs:98:22:98:43 | ... ? ... : ... : B | provenance | | -| A.cs:104:17:104:30 | call to method Source : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | -| A.cs:104:17:104:30 | call to method Source : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | +| A.cs:104:13:104:13 | access to local variable b : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | +| A.cs:104:13:104:13 | access to local variable b : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | +| A.cs:104:17:104:30 | call to method Source : B | A.cs:104:13:104:13 | access to local variable b : B | provenance | | +| A.cs:104:17:104:30 | call to method Source : B | A.cs:104:13:104:13 | access to local variable b : B | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:105:13:105:13 | access to local variable d : D [field b] : B | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:105:13:105:13 | access to local variable d : D [field b] : B | provenance | | | A.cs:105:23:105:23 | [post] access to local variable b : B [field c] : C | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | provenance | | | A.cs:105:23:105:23 | [post] access to local variable b : B [field c] : C | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | provenance | | | A.cs:105:23:105:23 | access to local variable b : B | A.cs:95:20:95:20 | b : B | provenance | | @@ -124,24 +142,32 @@ edges | A.cs:107:14:107:16 | access to field b : B [field c] : C | A.cs:107:14:107:18 | access to field c | provenance | | | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | A.cs:108:14:108:16 | access to field c | provenance | | | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | A.cs:108:14:108:16 | access to field c | provenance | | -| A.cs:113:17:113:29 | call to method Source : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | -| A.cs:113:17:113:29 | call to method Source : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | -| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | -| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:113:13:113:13 | access to local variable b : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | +| A.cs:113:13:113:13 | access to local variable b : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | +| A.cs:113:17:113:29 | call to method Source : B | A.cs:113:13:113:13 | access to local variable b : B | provenance | | +| A.cs:113:17:113:29 | call to method Source : B | A.cs:113:13:113:13 | access to local variable b : B | provenance | | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:157:25:157:28 | head : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:157:25:157:28 | head : B | provenance | | -| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | -| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:157:38:157:41 | next : MyList [field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:157:38:157:41 | next : MyList [field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | provenance | | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | provenance | | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:157:38:157:41 | next : MyList [field next, field head] : B | provenance | | @@ -152,14 +178,20 @@ edges | A.cs:119:14:119:20 | access to field next : MyList [field next, field head] : B | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | provenance | | | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | A.cs:119:14:119:30 | access to field head | provenance | | | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | A.cs:119:14:119:30 | access to field head | provenance | | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | provenance | | | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:23 | access to field head | provenance | | | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:23 | access to field head | provenance | | | A.cs:141:20:141:20 | c : C | A.cs:143:22:143:22 | access to parameter c : C | provenance | | @@ -204,16 +236,22 @@ edges | A.cs:160:25:160:28 | access to parameter next : MyList [field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field head] : B | provenance | | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field next, field head] : B | provenance | | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field next, field head] : B | provenance | | -| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | -| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | -| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | -| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:5:13:5:13 | access to local variable e : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | +| B.cs:5:13:5:13 | access to local variable e : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | +| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:5:13:5:13 | access to local variable e : Elem | provenance | | +| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:5:13:5:13 | access to local variable e : Elem | provenance | | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:29:26:29:27 | e1 : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:29:26:29:27 | e1 : Elem | provenance | | -| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | -| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | provenance | | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | provenance | | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem1] : Elem | provenance | | @@ -222,16 +260,22 @@ edges | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | provenance | | | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | B.cs:8:14:8:26 | access to field elem1 | provenance | | | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | B.cs:8:14:8:26 | access to field elem1 | provenance | | -| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | -| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | -| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | -| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:14:13:14:13 | access to local variable e : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | +| B.cs:14:13:14:13 | access to local variable e : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | +| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:14:13:14:13 | access to local variable e : Elem | provenance | | +| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:14:13:14:13 | access to local variable e : Elem | provenance | | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:29:35:29:36 | e2 : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:29:35:29:36 | e2 : Elem | provenance | | -| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | -| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | provenance | | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | provenance | | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem2] : Elem | provenance | | @@ -272,14 +316,22 @@ edges | C.cs:7:37:7:51 | call to method Source : Elem | C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | provenance | | | C.cs:8:30:8:44 | call to method Source : Elem | C.cs:28:14:28:15 | access to property s6 | provenance | | | C.cs:8:30:8:44 | call to method Source : Elem | C.cs:28:14:28:15 | access to property s6 | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | C.cs:21:17:21:18 | this : C [field s1] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | C.cs:21:17:21:18 | this : C [field s1] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | C.cs:21:17:21:18 | this : C [field s2] : Elem | provenance | | @@ -348,22 +400,28 @@ edges | D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:15:9:15:11 | value : Object | provenance | | | D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | provenance | | | D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | provenance | | -| D.cs:29:17:29:33 | call to method Source : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | -| D.cs:29:17:29:33 | call to method Source : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | -| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | -| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:29:13:29:13 | access to local variable o : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | +| D.cs:29:13:29:13 | access to local variable o : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | +| D.cs:29:17:29:33 | call to method Source : Object | D.cs:29:13:29:13 | access to local variable o : Object | provenance | | +| D.cs:29:17:29:33 | call to method Source : Object | D.cs:29:13:29:13 | access to local variable o : Object | provenance | | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:18:28:18:29 | o1 : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:18:28:18:29 | o1 : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | provenance | | | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:23 | access to property AutoProp | provenance | | | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:23 | access to property AutoProp | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | | D.cs:37:26:37:42 | call to method Source : Object | D.cs:18:39:18:40 | o2 : Object | provenance | | | D.cs:37:26:37:42 | call to method Source : Object | D.cs:18:39:18:40 | o2 : Object | provenance | | | D.cs:37:26:37:42 | call to method Source : Object | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | provenance | | @@ -378,12 +436,14 @@ edges | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | provenance | | | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:26 | access to property ComplexProp | provenance | | | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:26 | access to property ComplexProp | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | | D.cs:43:32:43:48 | call to method Source : Object | D.cs:18:50:18:51 | o3 : Object | provenance | | | D.cs:43:32:43:48 | call to method Source : Object | D.cs:18:50:18:51 | o3 : Object | provenance | | | D.cs:43:32:43:48 | call to method Source : Object | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | provenance | | @@ -404,10 +464,14 @@ edges | E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | provenance | | | E.cs:11:21:11:21 | access to parameter o : Object | E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | provenance | | | E.cs:11:21:11:21 | access to parameter o : Object | E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | provenance | | -| E.cs:22:17:22:33 | call to method Source : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | -| E.cs:22:17:22:33 | call to method Source : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | -| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | -| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:22:13:22:13 | access to local variable o : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | +| E.cs:22:13:22:13 | access to local variable o : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | +| E.cs:22:17:22:33 | call to method Source : Object | E.cs:22:13:22:13 | access to local variable o : Object | provenance | | +| E.cs:22:17:22:33 | call to method Source : Object | E.cs:22:13:22:13 | access to local variable o : Object | provenance | | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | provenance | | | E.cs:23:25:23:25 | access to local variable o : Object | E.cs:8:29:8:29 | o : Object | provenance | | | E.cs:23:25:23:25 | access to local variable o : Object | E.cs:8:29:8:29 | o : Object | provenance | | | E.cs:23:25:23:25 | access to local variable o : Object | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | provenance | | @@ -418,8 +482,10 @@ edges | E.cs:43:46:43:46 | o : Object | E.cs:46:22:46:22 | access to parameter o : Object | provenance | | | E.cs:46:22:46:22 | access to parameter o : Object | E.cs:46:9:46:9 | [post] access to parameter s : RefS [field RefField] : Object | provenance | | | E.cs:46:22:46:22 | access to parameter o : Object | E.cs:46:9:46:9 | [post] access to parameter s : RefS [field RefField] : Object | provenance | | -| E.cs:54:21:54:37 | call to method Source : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | -| E.cs:54:21:54:37 | call to method Source : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | +| E.cs:54:13:54:17 | access to local variable taint : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | +| E.cs:54:13:54:17 | access to local variable taint : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | +| E.cs:54:21:54:37 | call to method Source : Object | E.cs:54:13:54:17 | access to local variable taint : Object | provenance | | +| E.cs:54:21:54:37 | call to method Source : Object | E.cs:54:13:54:17 | access to local variable taint : Object | provenance | | | E.cs:55:23:55:26 | [post] access to local variable refs : RefS [field RefField] : Object | E.cs:57:14:57:17 | access to local variable refs : RefS [field RefField] : Object | provenance | | | E.cs:55:23:55:26 | [post] access to local variable refs : RefS [field RefField] : Object | E.cs:57:14:57:17 | access to local variable refs : RefS [field RefField] : Object | provenance | | | E.cs:55:29:55:33 | access to local variable taint : Object | E.cs:43:46:43:46 | o : Object | provenance | | @@ -440,46 +506,62 @@ edges | F.cs:6:65:6:66 | access to parameter o1 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field1] : Object | provenance | | | F.cs:6:78:6:79 | access to parameter o2 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field2] : Object | provenance | | | F.cs:6:78:6:79 | access to parameter o2 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field2] : Object | provenance | | -| F.cs:10:17:10:33 | call to method Source : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | -| F.cs:10:17:10:33 | call to method Source : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | -| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | -| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:10:13:10:13 | access to local variable o : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | +| F.cs:10:13:10:13 | access to local variable o : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | +| F.cs:10:17:10:33 | call to method Source : Object | F.cs:10:13:10:13 | access to local variable o : Object | provenance | | +| F.cs:10:17:10:33 | call to method Source : Object | F.cs:10:13:10:13 | access to local variable o : Object | provenance | | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:6:28:6:29 | o1 : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:6:28:6:29 | o1 : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | provenance | | | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:21 | access to field Field1 | provenance | | | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:21 | access to field Field1 | provenance | | -| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | -| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:6:39:6:40 | o2 : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:6:39:6:40 | o2 : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | provenance | | | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:21 | access to field Field2 | provenance | | | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:21 | access to field Field2 | provenance | | -| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | -| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | provenance | | | F.cs:19:32:19:48 | call to method Source : Object | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | provenance | | | F.cs:19:32:19:48 | call to method Source : Object | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | provenance | | | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:21 | access to field Field1 | provenance | | | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:21 | access to field Field1 | provenance | | -| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | -| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | provenance | | | F.cs:23:32:23:48 | call to method Source : Object | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | provenance | | | F.cs:23:32:23:48 | call to method Source : Object | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | provenance | | | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:21 | access to field Field2 | provenance | | | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:21 | access to field Field2 | provenance | | -| F.cs:30:17:30:33 | call to method Source : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | -| F.cs:30:17:30:33 | call to method Source : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | -| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | -| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:30:13:30:13 | access to local variable o : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | +| F.cs:30:13:30:13 | access to local variable o : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | +| F.cs:30:17:30:33 | call to method Source : Object | F.cs:30:13:30:13 | access to local variable o : Object | provenance | | +| F.cs:30:17:30:33 | call to method Source : Object | F.cs:30:13:30:13 | access to local variable o : Object | provenance | | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | | F.cs:32:27:32:27 | access to local variable o : Object | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | | F.cs:32:27:32:27 | access to local variable o : Object | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:16 | access to property X | provenance | | | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:16 | access to property X | provenance | | -| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | -| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | +| G.cs:7:14:7:14 | access to local variable e : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | +| G.cs:7:14:7:14 | access to local variable e : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | +| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:7:14:7:14 | access to local variable e : Elem | provenance | | +| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:7:14:7:14 | access to local variable e : Elem | provenance | | | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:9:9:9:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -488,8 +570,10 @@ edges | G.cs:9:23:9:23 | access to local variable e : Elem | G.cs:9:9:9:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | provenance | | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | -| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | -| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | +| G.cs:15:14:15:14 | access to local variable e : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | +| G.cs:15:14:15:14 | access to local variable e : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | +| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:15:14:15:14 | access to local variable e : Elem | provenance | | +| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:15:14:15:14 | access to local variable e : Elem | provenance | | | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:17:9:17:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -500,8 +584,10 @@ edges | G.cs:17:24:17:24 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | provenance | | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | -| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | -| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | +| G.cs:23:14:23:14 | access to local variable e : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | +| G.cs:23:14:23:14 | access to local variable e : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | +| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:23:14:23:14 | access to local variable e : Elem | provenance | | +| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:23:14:23:14 | access to local variable e : Elem | provenance | | | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:25:9:25:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -510,8 +596,10 @@ edges | G.cs:25:28:25:28 | access to local variable e : Elem | G.cs:25:9:25:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | provenance | | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | -| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | -| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | +| G.cs:31:14:31:14 | access to local variable e : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | +| G.cs:31:14:31:14 | access to local variable e : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | +| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:31:14:31:14 | access to local variable e : Elem | provenance | | +| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:31:14:31:14 | access to local variable e : Elem | provenance | | | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:34:18:34:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:34:18:34:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:33:9:33:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -532,8 +620,10 @@ edges | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:39:14:39:35 | call to method GetElem | provenance | | | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | provenance | | | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | provenance | | -| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | -| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | +| G.cs:44:14:44:14 | access to local variable e : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | +| G.cs:44:14:44:14 | access to local variable e : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | +| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:44:14:44:14 | access to local variable e : Elem | provenance | | +| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:44:14:44:14 | access to local variable e : Elem | provenance | | | G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | provenance | | | G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | provenance | | | G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | G.cs:47:9:47:13 | this access : G [field boxfield, field Box1, field Elem] : Elem | provenance | | @@ -576,8 +666,10 @@ edges | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:23:20:23:36 | call to method Source : Object | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:23:20:23:36 | call to method Source : Object | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | -| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | -| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | provenance | | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:13:15:13:15 | a : A [field FieldA] : Object | provenance | | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:13:15:13:15 | a : A [field FieldA] : Object | provenance | | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | provenance | | @@ -604,8 +696,10 @@ edges | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:43:20:43:36 | call to method Source : Object | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:43:20:43:36 | call to method Source : Object | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | -| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | -| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | provenance | | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | provenance | | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | provenance | | @@ -672,8 +766,10 @@ edges | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:112:20:112:36 | call to method Source : Object | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:112:20:112:36 | call to method Source : Object | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | -| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | -| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:102:23:102:23 | a : A [field FieldA] : Object | provenance | | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:102:23:102:23 | a : A [field FieldA] : Object | provenance | | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | provenance | | @@ -708,16 +804,20 @@ edges | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:33:19:33:19 | a : A [field FieldA] : A | provenance | | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | provenance | | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | provenance | | -| H.cs:147:17:147:39 | call to method Through : A | H.cs:148:14:148:14 | access to local variable a | provenance | | -| H.cs:147:17:147:39 | call to method Through : A | H.cs:148:14:148:14 | access to local variable a | provenance | | +| H.cs:147:13:147:13 | access to local variable a : A | H.cs:148:14:148:14 | access to local variable a | provenance | | +| H.cs:147:13:147:13 | access to local variable a : A | H.cs:148:14:148:14 | access to local variable a | provenance | | +| H.cs:147:17:147:39 | call to method Through : A | H.cs:147:13:147:13 | access to local variable a : A | provenance | | +| H.cs:147:17:147:39 | call to method Through : A | H.cs:147:13:147:13 | access to local variable a : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:147:17:147:39 | call to method Through : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:147:17:147:39 | call to method Through : A | provenance | | | H.cs:153:32:153:32 | o : Object | H.cs:156:20:156:20 | access to parameter o : Object | provenance | | | H.cs:153:32:153:32 | o : Object | H.cs:156:20:156:20 | access to parameter o : Object | provenance | | -| H.cs:155:17:155:30 | call to method Source : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | -| H.cs:155:17:155:30 | call to method Source : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | +| H.cs:155:13:155:13 | access to local variable b : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | +| H.cs:155:13:155:13 | access to local variable b : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | +| H.cs:155:17:155:30 | call to method Source : B | H.cs:155:13:155:13 | access to local variable b : B | provenance | | +| H.cs:155:17:155:30 | call to method Source : B | H.cs:155:13:155:13 | access to local variable b : B | provenance | | | H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:156:9:156:9 | access to local variable b : B | H.cs:157:20:157:20 | access to local variable b : B | provenance | | @@ -730,8 +830,10 @@ edges | H.cs:157:20:157:20 | access to local variable b : B | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA] : B | provenance | | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | provenance | | -| H.cs:163:17:163:35 | call to method Source : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | -| H.cs:163:17:163:35 | call to method Source : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | +| H.cs:163:13:163:13 | access to local variable o : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | +| H.cs:163:13:163:13 | access to local variable o : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | +| H.cs:163:17:163:35 | call to method Source : Object | H.cs:163:13:163:13 | access to local variable o : Object | provenance | | +| H.cs:163:17:163:35 | call to method Source : Object | H.cs:163:13:163:13 | access to local variable o : Object | provenance | | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA] : B | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | provenance | | @@ -740,10 +842,14 @@ edges | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | provenance | | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | -| H.cs:165:17:165:27 | (...) ... : B | H.cs:166:14:166:14 | access to local variable b | provenance | | -| H.cs:165:17:165:27 | (...) ... : B | H.cs:166:14:166:14 | access to local variable b | provenance | | -| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | -| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B | H.cs:166:14:166:14 | access to local variable b | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B | H.cs:166:14:166:14 | access to local variable b | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:17:165:27 | (...) ... : B | H.cs:165:13:165:13 | access to local variable b : B | provenance | | +| H.cs:165:17:165:27 | (...) ... : B | H.cs:165:13:165:13 | access to local variable b : B | provenance | | +| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | H.cs:165:20:165:27 | access to field FieldA : B | provenance | | @@ -760,8 +866,10 @@ edges | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | provenance | | | I.cs:7:18:7:34 | call to method Source : Object | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | provenance | | | I.cs:7:18:7:34 | call to method Source : Object | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | provenance | | -| I.cs:13:17:13:33 | call to method Source : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | -| I.cs:13:17:13:33 | call to method Source : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | +| I.cs:13:13:13:13 | access to local variable o : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | +| I.cs:13:13:13:13 | access to local variable o : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | +| I.cs:13:17:13:33 | call to method Source : Object | I.cs:13:13:13:13 | access to local variable o : Object | provenance | | +| I.cs:13:17:13:33 | call to method Source : Object | I.cs:13:13:13:13 | access to local variable o : Object | provenance | | | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:16:9:16:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:16:9:16:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:15:20:15:20 | access to local variable o : Object | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | provenance | | @@ -772,18 +880,24 @@ edges | I.cs:17:9:17:9 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:21 | access to field Field1 | provenance | | | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:21 | access to field Field1 | provenance | | -| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | -| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:21 | access to field Field1 | provenance | | | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:21 | access to field Field1 | provenance | | -| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | -| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:21 | access to field Field1 | provenance | | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:21 | access to field Field1 | provenance | | -| I.cs:31:13:31:29 | call to method Source : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | -| I.cs:31:13:31:29 | call to method Source : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | +| I.cs:31:9:31:9 | access to local variable o : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | +| I.cs:31:9:31:9 | access to local variable o : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | +| I.cs:31:13:31:29 | call to method Source : Object | I.cs:31:9:31:9 | access to local variable o : Object | provenance | | +| I.cs:31:13:31:29 | call to method Source : Object | I.cs:31:9:31:9 | access to local variable o : Object | provenance | | | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:33:9:33:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:33:9:33:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:32:20:32:20 | access to local variable o : Object | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | provenance | | @@ -806,102 +920,156 @@ edges | J.cs:14:66:14:70 | access to parameter field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | provenance | | | J.cs:14:73:14:76 | access to parameter prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | provenance | | | J.cs:14:73:14:76 | access to parameter prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | provenance | | -| J.cs:21:17:21:33 | call to method Source : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | -| J.cs:21:17:21:33 | call to method Source : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:21:13:21:13 | access to local variable o : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | +| J.cs:21:13:21:13 | access to local variable o : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | +| J.cs:21:17:21:33 | call to method Source : Object | J.cs:21:13:21:13 | access to local variable o : Object | provenance | | +| J.cs:21:17:21:33 | call to method Source : Object | J.cs:21:13:21:13 | access to local variable o : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | provenance | | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | provenance | | | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:21 | access to property Prop1 | provenance | | | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:21 | access to property Prop1 | provenance | | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:21 | access to property Prop1 | provenance | | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:21 | access to property Prop1 | provenance | | -| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | -| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | | J.cs:30:36:30:52 | call to method Source : Object | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | provenance | | | J.cs:30:36:30:52 | call to method Source : Object | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | provenance | | | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:21 | access to property Prop1 | provenance | | | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:21 | access to property Prop1 | provenance | | | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:21 | access to property Prop2 | provenance | | | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:21 | access to property Prop2 | provenance | | -| J.cs:41:17:41:33 | call to method Source : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | -| J.cs:41:17:41:33 | call to method Source : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:41:13:41:13 | access to local variable o : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | +| J.cs:41:13:41:13 | access to local variable o : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | +| J.cs:41:17:41:33 | call to method Source : Object | J.cs:41:13:41:13 | access to local variable o : Object | provenance | | +| J.cs:41:17:41:33 | call to method Source : Object | J.cs:41:13:41:13 | access to local variable o : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | provenance | | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | provenance | | | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:21 | access to property Prop1 | provenance | | | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:21 | access to property Prop1 | provenance | | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:21 | access to property Prop1 | provenance | | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:21 | access to property Prop1 | provenance | | -| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | -| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | | J.cs:50:36:50:52 | call to method Source : Object | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | provenance | | | J.cs:50:36:50:52 | call to method Source : Object | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | provenance | | | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:21 | access to property Prop1 | provenance | | | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:21 | access to property Prop1 | provenance | | | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:21 | access to property Prop2 | provenance | | | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:21 | access to property Prop2 | provenance | | -| J.cs:61:17:61:33 | call to method Source : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | -| J.cs:61:17:61:33 | call to method Source : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:61:13:61:13 | access to local variable o : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | +| J.cs:61:13:61:13 | access to local variable o : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | +| J.cs:61:17:61:33 | call to method Source : Object | J.cs:61:13:61:13 | access to local variable o : Object | provenance | | +| J.cs:61:17:61:33 | call to method Source : Object | J.cs:61:13:61:13 | access to local variable o : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | provenance | | +| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | provenance | | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:21 | access to field Field | provenance | | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:21 | access to field Field | provenance | | -| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | -| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | | J.cs:68:35:68:51 | call to method Source : Object | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | provenance | | | J.cs:68:35:68:51 | call to method Source : Object | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | provenance | | | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:21 | access to field Field | provenance | | | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:21 | access to field Field | provenance | | | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:20 | access to property Prop | provenance | | | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:20 | access to property Prop | provenance | | -| J.cs:79:17:79:33 | call to method Source : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | -| J.cs:79:17:79:33 | call to method Source : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:79:13:79:13 | access to local variable o : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | +| J.cs:79:13:79:13 | access to local variable o : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | +| J.cs:79:17:79:33 | call to method Source : Object | J.cs:79:13:79:13 | access to local variable o : Object | provenance | | +| J.cs:79:17:79:33 | call to method Source : Object | J.cs:79:13:79:13 | access to local variable o : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | provenance | | +| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | provenance | | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:20 | access to property Prop | provenance | | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:20 | access to property Prop | provenance | | -| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | -| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | | J.cs:86:36:86:52 | call to method Source : Object | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | provenance | | | J.cs:86:36:86:52 | call to method Source : Object | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | provenance | | | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:21 | access to field Field | provenance | | | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:21 | access to field Field | provenance | | | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:20 | access to property Prop | provenance | | | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:20 | access to property Prop | provenance | | -| J.cs:97:17:97:33 | call to method Source : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | -| J.cs:97:17:97:33 | call to method Source : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:97:13:97:13 | access to local variable o : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | +| J.cs:97:13:97:13 | access to local variable o : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | +| J.cs:97:17:97:33 | call to method Source : Object | J.cs:97:13:97:13 | access to local variable o : Object | provenance | | +| J.cs:97:17:97:33 | call to method Source : Object | J.cs:97:13:97:13 | access to local variable o : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | provenance | | | J.cs:99:28:99:28 | access to local variable o : Object | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | | J.cs:99:28:99:28 | access to local variable o : Object | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:17 | access to property X | provenance | | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:17 | access to property X | provenance | | -| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | -| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | | J.cs:105:32:105:48 | call to method Source : Object | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | provenance | | | J.cs:105:32:105:48 | call to method Source : Object | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | provenance | | | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | J.cs:106:14:106:17 | access to property X | provenance | | @@ -917,8 +1085,12 @@ edges | J.cs:125:14:125:17 | access to array element : Int32 | J.cs:125:14:125:17 | (...) ... | provenance | | | J.cs:125:14:125:17 | access to array element : Int32 | J.cs:125:14:125:17 | (...) ... | provenance | | nodes +| A.cs:5:13:5:13 | access to local variable c : C | semmle.label | access to local variable c : C | +| A.cs:5:13:5:13 | access to local variable c : C | semmle.label | access to local variable c : C | | A.cs:5:17:5:28 | call to method Source : C | semmle.label | call to method Source : C | | A.cs:5:17:5:28 | call to method Source : C | semmle.label | call to method Source : C | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | | A.cs:6:17:6:25 | call to method Make : B [field c] : C | semmle.label | call to method Make : B [field c] : C | | A.cs:6:17:6:25 | call to method Make : B [field c] : C | semmle.label | call to method Make : B [field c] : C | | A.cs:6:24:6:24 | access to local variable c : C | semmle.label | access to local variable c : C | @@ -941,6 +1113,8 @@ nodes | A.cs:15:15:15:35 | object creation of type B : B [field c] : C | semmle.label | object creation of type B : B [field c] : C | | A.cs:15:21:15:34 | call to method Source : C | semmle.label | call to method Source : C | | A.cs:15:21:15:34 | call to method Source : C | semmle.label | call to method Source : C | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:22:25:22:37 | call to method Source : C2 | semmle.label | call to method Source : C2 | @@ -949,6 +1123,8 @@ nodes | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:24:14:24:17 | access to field c | semmle.label | access to field c | | A.cs:24:14:24:17 | access to field c | semmle.label | access to field c | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | semmle.label | call to method SetOnBWrap : B [field c] : C2 | | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | semmle.label | call to method SetOnBWrap : B [field c] : C2 | | A.cs:31:29:31:41 | call to method Source : C2 | semmle.label | call to method Source : C2 | @@ -959,6 +1135,8 @@ nodes | A.cs:33:14:33:17 | access to field c | semmle.label | access to field c | | A.cs:36:33:36:33 | c : C2 | semmle.label | c : C2 | | A.cs:36:33:36:33 | c : C2 | semmle.label | c : C2 | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:38:29:38:29 | access to parameter c : C2 | semmle.label | access to parameter c : C2 | @@ -973,6 +1151,8 @@ nodes | A.cs:47:20:47:20 | access to parameter c : C2 | semmle.label | access to parameter c : C2 | | A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:55:13:55:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| A.cs:55:13:55:13 | access to local variable a : A | semmle.label | access to local variable a : A | | A.cs:55:17:55:28 | call to method Source : A | semmle.label | call to method Source : A | | A.cs:55:17:55:28 | call to method Source : A | semmle.label | call to method Source : A | | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | semmle.label | [post] access to local variable c1 : C1 [field a] : A | @@ -1019,8 +1199,14 @@ nodes | A.cs:98:22:98:43 | ... ? ... : ... : B [field c] : C | semmle.label | ... ? ... : ... : B [field c] : C | | A.cs:98:30:98:43 | call to method Source : B | semmle.label | call to method Source : B | | A.cs:98:30:98:43 | call to method Source : B | semmle.label | call to method Source : B | +| A.cs:104:13:104:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| A.cs:104:13:104:13 | access to local variable b : B | semmle.label | access to local variable b : B | | A.cs:104:17:104:30 | call to method Source : B | semmle.label | call to method Source : B | | A.cs:104:17:104:30 | call to method Source : B | semmle.label | call to method Source : B | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | semmle.label | access to local variable d : D [field b, field c] : C | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | semmle.label | access to local variable d : D [field b, field c] : C | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | semmle.label | access to local variable d : D [field b] : B | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | semmle.label | access to local variable d : D [field b] : B | | A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | semmle.label | object creation of type D : D [field b, field c] : C | | A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | semmle.label | object creation of type D : D [field b, field c] : C | | A.cs:105:17:105:29 | object creation of type D : D [field b] : B | semmle.label | object creation of type D : D [field b] : B | @@ -1043,16 +1229,24 @@ nodes | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | | A.cs:108:14:108:16 | access to field c | semmle.label | access to field c | | A.cs:108:14:108:16 | access to field c | semmle.label | access to field c | +| A.cs:113:13:113:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| A.cs:113:13:113:13 | access to local variable b : B | semmle.label | access to local variable b : B | | A.cs:113:17:113:29 | call to method Source : B | semmle.label | call to method Source : B | | A.cs:113:17:113:29 | call to method Source : B | semmle.label | call to method Source : B | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | semmle.label | object creation of type MyList : MyList [field head] : B | | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | semmle.label | object creation of type MyList : MyList [field head] : B | | A.cs:114:29:114:29 | access to local variable b : B | semmle.label | access to local variable b : B | | A.cs:114:29:114:29 | access to local variable b : B | semmle.label | access to local variable b : B | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | semmle.label | access to local variable l2 : MyList [field next, field head] : B | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | semmle.label | access to local variable l2 : MyList [field next, field head] : B | | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field head] : B | | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field head] : B | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | semmle.label | access to local variable l3 : MyList [field next, field next, field head] : B | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | semmle.label | access to local variable l3 : MyList [field next, field next, field head] : B | | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field next, field head] : B | | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field next, field head] : B | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | semmle.label | access to local variable l2 : MyList [field next, field head] : B | @@ -1065,6 +1259,12 @@ nodes | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | semmle.label | access to field next : MyList [field head] : B | | A.cs:119:14:119:30 | access to field head | semmle.label | access to field head | | A.cs:119:14:119:30 | access to field head | semmle.label | access to field head | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field next, field head] : B | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field next, field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | semmle.label | access to local variable l : MyList [field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | semmle.label | access to local variable l : MyList [field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field next, field head] : B | @@ -1137,12 +1337,18 @@ nodes | A.cs:160:25:160:28 | access to parameter next : MyList [field head] : B | semmle.label | access to parameter next : MyList [field head] : B | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | semmle.label | access to parameter next : MyList [field next, field head] : B | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | semmle.label | access to parameter next : MyList [field next, field head] : B | +| B.cs:5:13:5:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:5:13:5:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:5:17:5:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | | B.cs:5:17:5:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | semmle.label | access to local variable b1 : Box1 [field elem1] : Elem | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | semmle.label | access to local variable b1 : Box1 [field elem1] : Elem | | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem1] : Elem | | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem1] : Elem | | B.cs:6:27:6:27 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:6:27:6:27 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem1] : Elem | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem1] : Elem | | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | semmle.label | access to local variable b1 : Box1 [field elem1] : Elem | @@ -1153,12 +1359,18 @@ nodes | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | semmle.label | access to field box1 : Box1 [field elem1] : Elem | | B.cs:8:14:8:26 | access to field elem1 | semmle.label | access to field elem1 | | B.cs:8:14:8:26 | access to field elem1 | semmle.label | access to field elem1 | +| B.cs:14:13:14:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:14:13:14:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:14:17:14:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | | B.cs:14:17:14:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | semmle.label | access to local variable b1 : Box1 [field elem2] : Elem | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | semmle.label | access to local variable b1 : Box1 [field elem2] : Elem | | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem2] : Elem | | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem2] : Elem | | B.cs:15:33:15:33 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:15:33:15:33 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem2] : Elem | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem2] : Elem | | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | semmle.label | access to local variable b1 : Box1 [field elem2] : Elem | @@ -1209,6 +1421,14 @@ nodes | C.cs:7:37:7:51 | call to method Source : Elem | semmle.label | call to method Source : Elem | | C.cs:8:30:8:44 | call to method Source : Elem | semmle.label | call to method Source : Elem | | C.cs:8:30:8:44 | call to method Source : Elem | semmle.label | call to method Source : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | semmle.label | access to local variable c : C [field s1] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | semmle.label | access to local variable c : C [field s1] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | semmle.label | access to local variable c : C [field s2] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | semmle.label | access to local variable c : C [field s2] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | semmle.label | access to local variable c : C [field s3] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | semmle.label | access to local variable c : C [field s3] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | semmle.label | access to local variable c : C [property s5] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | semmle.label | access to local variable c : C [property s5] : Elem | | C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | semmle.label | object creation of type C : C [field s1] : Elem | | C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | semmle.label | object creation of type C : C [field s1] : Elem | | C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | semmle.label | object creation of type C : C [field s2] : Elem | @@ -1305,8 +1525,12 @@ nodes | D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | semmle.label | access to local variable ret : D [field trivialPropField] : Object | | D.cs:24:16:24:18 | access to local variable ret : D [property AutoProp] : Object | semmle.label | access to local variable ret : D [property AutoProp] : Object | | D.cs:24:16:24:18 | access to local variable ret : D [property AutoProp] : Object | semmle.label | access to local variable ret : D [property AutoProp] : Object | +| D.cs:29:13:29:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| D.cs:29:13:29:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | D.cs:29:17:29:33 | call to method Source : Object | semmle.label | call to method Source : Object | | D.cs:29:17:29:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | semmle.label | access to local variable d : D [property AutoProp] : Object | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | semmle.label | access to local variable d : D [property AutoProp] : Object | | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | semmle.label | call to method Create : D [property AutoProp] : Object | | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | semmle.label | call to method Create : D [property AutoProp] : Object | | D.cs:31:24:31:24 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1315,6 +1539,8 @@ nodes | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | semmle.label | access to local variable d : D [property AutoProp] : Object | | D.cs:32:14:32:23 | access to property AutoProp | semmle.label | access to property AutoProp | | D.cs:32:14:32:23 | access to property AutoProp | semmle.label | access to property AutoProp | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:37:26:37:42 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1331,6 +1557,8 @@ nodes | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:41:14:41:26 | access to property ComplexProp | semmle.label | access to property ComplexProp | | D.cs:41:14:41:26 | access to property ComplexProp | semmle.label | access to property ComplexProp | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:43:32:43:48 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1355,8 +1583,12 @@ nodes | E.cs:11:21:11:21 | access to parameter o : Object | semmle.label | access to parameter o : Object | | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | semmle.label | access to local variable ret : S [field Field] : Object | | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | semmle.label | access to local variable ret : S [field Field] : Object | +| E.cs:22:13:22:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| E.cs:22:13:22:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | E.cs:22:17:22:33 | call to method Source : Object | semmle.label | call to method Source : Object | | E.cs:22:17:22:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | semmle.label | access to local variable s : S [field Field] : Object | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | semmle.label | access to local variable s : S [field Field] : Object | | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | semmle.label | call to method CreateS : S [field Field] : Object | | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | semmle.label | call to method CreateS : S [field Field] : Object | | E.cs:23:25:23:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1371,6 +1603,8 @@ nodes | E.cs:46:9:46:9 | [post] access to parameter s : RefS [field RefField] : Object | semmle.label | [post] access to parameter s : RefS [field RefField] : Object | | E.cs:46:22:46:22 | access to parameter o : Object | semmle.label | access to parameter o : Object | | E.cs:46:22:46:22 | access to parameter o : Object | semmle.label | access to parameter o : Object | +| E.cs:54:13:54:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | +| E.cs:54:13:54:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | E.cs:54:21:54:37 | call to method Source : Object | semmle.label | call to method Source : Object | | E.cs:54:21:54:37 | call to method Source : Object | semmle.label | call to method Source : Object | | E.cs:55:23:55:26 | [post] access to local variable refs : RefS [field RefField] : Object | semmle.label | [post] access to local variable refs : RefS [field RefField] : Object | @@ -1397,8 +1631,12 @@ nodes | F.cs:6:65:6:66 | access to parameter o1 : Object | semmle.label | access to parameter o1 : Object | | F.cs:6:78:6:79 | access to parameter o2 : Object | semmle.label | access to parameter o2 : Object | | F.cs:6:78:6:79 | access to parameter o2 : Object | semmle.label | access to parameter o2 : Object | +| F.cs:10:13:10:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| F.cs:10:13:10:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | F.cs:10:17:10:33 | call to method Source : Object | semmle.label | call to method Source : Object | | F.cs:10:17:10:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | semmle.label | call to method Create : F [field Field1] : Object | | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | semmle.label | call to method Create : F [field Field1] : Object | | F.cs:11:24:11:24 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1407,6 +1645,8 @@ nodes | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:12:14:12:21 | access to field Field1 | semmle.label | access to field Field1 | | F.cs:12:14:12:21 | access to field Field1 | semmle.label | access to field Field1 | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | semmle.label | call to method Create : F [field Field2] : Object | | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | semmle.label | call to method Create : F [field Field2] : Object | | F.cs:15:26:15:42 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1415,6 +1655,8 @@ nodes | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:17:14:17:21 | access to field Field2 | semmle.label | access to field Field2 | | F.cs:17:14:17:21 | access to field Field2 | semmle.label | access to field Field2 | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | semmle.label | { ..., ... } : F [field Field1] : Object | | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | semmle.label | { ..., ... } : F [field Field1] : Object | | F.cs:19:32:19:48 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1423,6 +1665,8 @@ nodes | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:20:14:20:21 | access to field Field1 | semmle.label | access to field Field1 | | F.cs:20:14:20:21 | access to field Field1 | semmle.label | access to field Field1 | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | semmle.label | { ..., ... } : F [field Field2] : Object | | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | semmle.label | { ..., ... } : F [field Field2] : Object | | F.cs:23:32:23:48 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1431,8 +1675,12 @@ nodes | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:25:14:25:21 | access to field Field2 | semmle.label | access to field Field2 | | F.cs:25:14:25:21 | access to field Field2 | semmle.label | access to field Field2 | +| F.cs:30:13:30:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| F.cs:30:13:30:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | F.cs:30:17:30:33 | call to method Source : Object | semmle.label | call to method Source : Object | | F.cs:30:17:30:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a : <>__AnonType0 [property X] : Object | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a : <>__AnonType0 [property X] : Object | | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | F.cs:32:27:32:27 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1441,6 +1689,8 @@ nodes | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a : <>__AnonType0 [property X] : Object | | F.cs:33:14:33:16 | access to property X | semmle.label | access to property X | | F.cs:33:14:33:16 | access to property X | semmle.label | access to property X | +| G.cs:7:14:7:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:7:14:7:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:7:18:7:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:7:18:7:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1451,6 +1701,8 @@ nodes | G.cs:9:23:9:23 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:15:14:15:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:15:14:15:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:15:18:15:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:15:18:15:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1461,6 +1713,8 @@ nodes | G.cs:17:24:17:24 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:23:14:23:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:23:14:23:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:23:18:23:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:23:18:23:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1471,6 +1725,8 @@ nodes | G.cs:25:28:25:28 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:31:14:31:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:31:14:31:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:31:18:31:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:31:18:31:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1489,6 +1745,8 @@ nodes | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | semmle.label | call to method GetBox1 : Box1 [field Elem] : Elem | | G.cs:39:14:39:35 | call to method GetElem | semmle.label | call to method GetElem | | G.cs:39:14:39:35 | call to method GetElem | semmle.label | call to method GetElem | +| G.cs:44:14:44:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:44:14:44:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:44:18:44:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:44:18:44:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | @@ -1543,6 +1801,8 @@ nodes | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:23:20:23:36 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:23:20:23:36 | call to method Source : Object | semmle.label | call to method Source : Object | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | semmle.label | access to local variable clone : A [field FieldA] : Object | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | semmle.label | access to local variable clone : A [field FieldA] : Object | | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | semmle.label | call to method Clone : A [field FieldA] : Object | | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | semmle.label | call to method Clone : A [field FieldA] : Object | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | @@ -1575,6 +1835,8 @@ nodes | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:43:20:43:36 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:43:20:43:36 | call to method Source : Object | semmle.label | call to method Source : Object | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | semmle.label | call to method Transform : B [field FieldB] : Object | | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | semmle.label | call to method Transform : B [field FieldB] : Object | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | @@ -1645,6 +1907,8 @@ nodes | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:112:20:112:36 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:112:20:112:36 | call to method Source : Object | semmle.label | call to method Source : Object | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | semmle.label | call to method TransformWrap : B [field FieldB] : Object | | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | semmle.label | call to method TransformWrap : B [field FieldB] : Object | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | @@ -1681,6 +1945,8 @@ nodes | H.cs:142:16:142:34 | access to field FieldB : A | semmle.label | access to field FieldB : A | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | semmle.label | access to local variable a : A [field FieldA] : A | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | semmle.label | access to local variable a : A [field FieldA] : A | +| H.cs:147:13:147:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| H.cs:147:13:147:13 | access to local variable a : A | semmle.label | access to local variable a : A | | H.cs:147:17:147:39 | call to method Through : A | semmle.label | call to method Through : A | | H.cs:147:17:147:39 | call to method Through : A | semmle.label | call to method Through : A | | H.cs:147:25:147:38 | call to method Source : A | semmle.label | call to method Source : A | @@ -1689,6 +1955,8 @@ nodes | H.cs:148:14:148:14 | access to local variable a | semmle.label | access to local variable a | | H.cs:153:32:153:32 | o : Object | semmle.label | o : Object | | H.cs:153:32:153:32 | o : Object | semmle.label | o : Object | +| H.cs:155:13:155:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| H.cs:155:13:155:13 | access to local variable b : B | semmle.label | access to local variable b : B | | H.cs:155:17:155:30 | call to method Source : B | semmle.label | call to method Source : B | | H.cs:155:17:155:30 | call to method Source : B | semmle.label | call to method Source : B | | H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | semmle.label | [post] access to local variable b : B [field FieldB] : Object | @@ -1705,6 +1973,8 @@ nodes | H.cs:157:20:157:20 | access to local variable b : B | semmle.label | access to local variable b : B | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:163:13:163:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| H.cs:163:13:163:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | H.cs:163:17:163:35 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:163:17:163:35 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | semmle.label | [post] access to local variable a : A [field FieldA, field FieldB] : Object | @@ -1713,6 +1983,10 @@ nodes | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA] : B | semmle.label | [post] access to local variable a : A [field FieldA] : B | | H.cs:164:22:164:22 | access to local variable o : Object | semmle.label | access to local variable o : Object | | H.cs:164:22:164:22 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| H.cs:165:13:165:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| H.cs:165:13:165:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:165:17:165:27 | (...) ... : B | semmle.label | (...) ... : B | | H.cs:165:17:165:27 | (...) ... : B | semmle.label | (...) ... : B | | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | semmle.label | (...) ... : B [field FieldB] : Object | @@ -1735,6 +2009,8 @@ nodes | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | semmle.label | [post] this access : I [field Field1] : Object | | I.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| I.cs:13:13:13:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| I.cs:13:13:13:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | I.cs:13:17:13:33 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:13:17:13:33 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | semmle.label | [post] access to local variable i : I [field Field1] : Object | @@ -1749,6 +2025,8 @@ nodes | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:18:14:18:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:18:14:18:21 | access to field Field1 | semmle.label | access to field Field1 | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | semmle.label | object creation of type I : I [field Field1] : Object | | I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | semmle.label | object creation of type I : I [field Field1] : Object | | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | @@ -1757,12 +2035,16 @@ nodes | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:23:14:23:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:23:14:23:21 | access to field Field1 | semmle.label | access to field Field1 | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | semmle.label | [pre-initializer] object creation of type I : I [field Field1] : Object | | I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | semmle.label | [pre-initializer] object creation of type I : I [field Field1] : Object | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:27:14:27:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:27:14:27:21 | access to field Field1 | semmle.label | access to field Field1 | +| I.cs:31:9:31:9 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| I.cs:31:9:31:9 | access to local variable o : Object | semmle.label | access to local variable o : Object | | I.cs:31:13:31:29 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:31:13:31:29 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | semmle.label | [post] access to local variable i : I [field Field1] : Object | @@ -1781,6 +2063,10 @@ nodes | I.cs:40:14:40:14 | access to parameter i : I [field Field1] : Object | semmle.label | access to parameter i : I [field Field1] : Object | | I.cs:40:14:40:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:40:14:40:21 | access to field Field1 | semmle.label | access to field Field1 | +| J.cs:6:40:6:44 | Prop1 : Object | semmle.label | Prop1 : Object | +| J.cs:6:40:6:44 | Prop1 : Object | semmle.label | Prop1 : Object | +| J.cs:8:42:8:46 | Prop1 : Object | semmle.label | Prop1 : Object | +| J.cs:8:42:8:46 | Prop1 : Object | semmle.label | Prop1 : Object | | J.cs:14:26:14:30 | field : Object | semmle.label | field : Object | | J.cs:14:26:14:30 | field : Object | semmle.label | field : Object | | J.cs:14:40:14:43 | prop : Object | semmle.label | prop : Object | @@ -1793,8 +2079,12 @@ nodes | J.cs:14:66:14:70 | access to parameter field : Object | semmle.label | access to parameter field : Object | | J.cs:14:73:14:76 | access to parameter prop : Object | semmle.label | access to parameter prop : Object | | J.cs:14:73:14:76 | access to parameter prop : Object | semmle.label | access to parameter prop : Object | +| J.cs:21:13:21:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:21:13:21:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:21:17:21:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:21:17:21:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r1 : RecordClass [property Prop1] : Object | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r1 : RecordClass [property Prop1] : Object | | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | semmle.label | object creation of type RecordClass : RecordClass [property Prop1] : Object | | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | semmle.label | object creation of type RecordClass : RecordClass [property Prop1] : Object | | J.cs:22:34:22:34 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1803,10 +2093,16 @@ nodes | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r1 : RecordClass [property Prop1] : Object | | J.cs:23:14:23:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:23:14:23:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | | J.cs:27:14:27:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:27:14:27:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop1] : Object | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop1] : Object | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop2] : Object | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop2] : Object | | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | semmle.label | ... with { ... } : RecordClass [property Prop2] : Object | | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | semmle.label | ... with { ... } : RecordClass [property Prop2] : Object | | J.cs:30:36:30:52 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1819,8 +2115,12 @@ nodes | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop2] : Object | | J.cs:32:14:32:21 | access to property Prop2 | semmle.label | access to property Prop2 | | J.cs:32:14:32:21 | access to property Prop2 | semmle.label | access to property Prop2 | +| J.cs:41:13:41:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:41:13:41:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:41:17:41:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:41:17:41:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r1 : RecordStruct [property Prop1] : Object | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r1 : RecordStruct [property Prop1] : Object | | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | semmle.label | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | semmle.label | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | | J.cs:42:35:42:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1829,10 +2129,16 @@ nodes | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r1 : RecordStruct [property Prop1] : Object | | J.cs:43:14:43:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:43:14:43:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | | J.cs:47:14:47:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:47:14:47:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop1] : Object | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop1] : Object | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop2] : Object | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop2] : Object | | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | semmle.label | ... with { ... } : RecordStruct [property Prop2] : Object | | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | semmle.label | ... with { ... } : RecordStruct [property Prop2] : Object | | J.cs:50:36:50:52 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1845,16 +2151,26 @@ nodes | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop2] : Object | | J.cs:52:14:52:21 | access to property Prop2 | semmle.label | access to property Prop2 | | J.cs:52:14:52:21 | access to property Prop2 | semmle.label | access to property Prop2 | +| J.cs:61:13:61:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:61:13:61:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:61:17:61:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:61:17:61:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | semmle.label | access to local variable s1 : Struct [field Field] : Object | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | semmle.label | access to local variable s1 : Struct [field Field] : Object | | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | semmle.label | object creation of type Struct : Struct [field Field] : Object | | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | semmle.label | object creation of type Struct : Struct [field Field] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:62:29:62:29 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | | J.cs:65:14:65:21 | access to field Field | semmle.label | access to field Field | | J.cs:65:14:65:21 | access to field Field | semmle.label | access to field Field | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | semmle.label | ... with { ... } : Struct [property Prop] : Object | | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | semmle.label | ... with { ... } : Struct [property Prop] : Object | | J.cs:68:35:68:51 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1867,16 +2183,26 @@ nodes | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:70:14:70:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:70:14:70:20 | access to property Prop | semmle.label | access to property Prop | +| J.cs:79:13:79:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:79:13:79:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:79:17:79:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:79:17:79:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | semmle.label | access to local variable s1 : Struct [property Prop] : Object | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | semmle.label | access to local variable s1 : Struct [property Prop] : Object | | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | semmle.label | object creation of type Struct : Struct [property Prop] : Object | | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | semmle.label | object creation of type Struct : Struct [property Prop] : Object | | J.cs:80:35:80:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:80:35:80:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | | J.cs:84:14:84:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:84:14:84:20 | access to property Prop | semmle.label | access to property Prop | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | semmle.label | ... with { ... } : Struct [field Field] : Object | | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | semmle.label | ... with { ... } : Struct [field Field] : Object | | J.cs:86:36:86:52 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1889,16 +2215,26 @@ nodes | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:88:14:88:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:88:14:88:20 | access to property Prop | semmle.label | access to property Prop | +| J.cs:97:13:97:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:97:13:97:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:97:17:97:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:97:17:97:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a1 : <>__AnonType0 [property X] : Object | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a1 : <>__AnonType0 [property X] : Object | | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | J.cs:99:28:99:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:99:28:99:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | | J.cs:102:14:102:17 | access to property X | semmle.label | access to property X | | J.cs:102:14:102:17 | access to property X | semmle.label | access to property X | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property X] : Object | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property X] : Object | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property Y] : Object | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property Y] : Object | | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | semmle.label | ... with { ... } : <>__AnonType0 [property Y] : Object | | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | semmle.label | ... with { ... } : <>__AnonType0 [property Y] : Object | | J.cs:105:32:105:48 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -2022,6 +2358,10 @@ subpaths | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | H.cs:142:16:142:34 | access to field FieldB : A | H.cs:147:17:147:39 | call to method Through : A | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | diff --git a/csharp/ql/test/library-tests/dataflow/global/Capture.cs b/csharp/ql/test/library-tests/dataflow/global/Capture.cs index bfa0da36c90..be7ebe9cde6 100644 --- a/csharp/ql/test/library-tests/dataflow/global/Capture.cs +++ b/csharp/ql/test/library-tests/dataflow/global/Capture.cs @@ -111,10 +111,12 @@ class Capture string sink40 = ""; void CaptureOutMultipleLambdas() { - RunAction(() => { + RunAction(() => + { sink40 = "taint source"; }); - RunAction(() => { + RunAction(() => + { nonSink0 = "not tainted"; }); }; @@ -197,10 +199,159 @@ class Capture Check(nonSink0); } + void M1(string s) + { + Action a = () => + { + Check(s); + }; + a(); + } + + void M2() => M1("taint source"); + + Action M3(string s) + { + return () => + { + Check(s); + }; + } + + void M4() => M3("taint source")(); + + void M5() => RunAction(M3("taint source")); + + void M6() + { + List xs = new List { 0, 1, 2 }; + var x = "taint source"; + xs.ForEach(_ => + { + Check(x); + x = "taint source"; + }); + Check(x); + } + + public string Field; + + void M7() + { + var c = new Capture(); + c.Field = "taint source"; + + Action a = () => + { + Check(c.Field); + c.Field = "taint source"; + }; + a(); + + Check(c.Field); + } + + void M7(bool b) + { + var c = new Capture(); + if (b) + { + c = null; + } + + Action a = () => + { + c.Field = "taint source"; + }; + a(); + + Check(c.Field); + } + + void M8() + { + RunAction(x => Check(x), "taint source"); + } + + void M9() + { + var x = "taint source"; + + Action middle = () => + { + Action inner = () => + { + Check(x); + x = "taint source"; + }; + inner(); + }; + + middle(); + + Check(x); + } + + void M10() + { + this.Field = "taint source"; + + Action a = () => + { + Check(this.Field); + this.Field = "taint source"; + }; + a(); + + Check(this.Field); + } + + void M11() + { + var x = "taint source"; + Check(x); + x = "safe"; + Check(x); + + Action a = () => + { + x = "taint source"; + Check(x); + x = "safe"; + Check(x); + }; + a(); + } + + void M12() + { + var x = "taint source"; + + void CapturedLocalFunction() => Check(x); // missing flow from line 328 + + void CapturingLocalFunction() => CapturedLocalFunction(); + } + + void M13() + { + var x = "taint source"; + + Action capturedLambda = () => Check(x); + + Action capturingLambda = () => capturedLambda(); + + capturingLambda(); + } + static void Check(T x) { } static void RunAction(Action a) { a.Invoke(); } + + static void RunAction(Action a, T x) + { + a(x); + } } diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected index c57da19dc66..427dbd7a7af 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected @@ -5,13 +5,29 @@ | Capture.cs:72:15:72:20 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | +| Capture.cs:206:19:206:19 | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | +| Capture.cs:231:19:231:19 | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | +| Capture.cs:273:30:273:30 | access to parameter x | +| Capture.cs:284:23:284:23 | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | +| Capture.cs:301:19:301:28 | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | +| Capture.cs:312:15:312:15 | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected index 4d549939f1c..0ed28a45b04 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected @@ -1,43 +1,183 @@ edges -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | provenance | | | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:61:36:61:42 | access to parameter tainted : String | provenance | | -| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | Capture.cs:11:26:11:32 | access to parameter tainted : String | provenance | | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | Capture.cs:20:30:20:36 | access to parameter tainted : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | | Capture.cs:61:36:61:42 | access to parameter tainted : String | Capture.cs:50:50:50:55 | sink39 : String | provenance | | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | -| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:35 | SSA def(sink30) : String | provenance | | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | -| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:39 | SSA def(sink31) : String | provenance | | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | -| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:35 | SSA def(sink32) : String | provenance | | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | -| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:39 | SSA def(sink40) : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:168:25:168:31 | access to parameter tainted : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:194:25:194:31 | access to parameter tainted : String | provenance | | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | provenance | | -| Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | provenance | | -| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:194:22:194:32 | call to local function Id : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | +| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | provenance | | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | +| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | provenance | | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | provenance | | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | +| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | provenance | | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | provenance | | +| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:170:25:170:31 | access to parameter tainted : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:196:25:196:31 | access to parameter tainted : String | provenance | | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | provenance | | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | provenance | | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | Capture.cs:163:15:163:20 | access to local variable sink36 | provenance | | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | Capture.cs:162:13:162:18 | access to local variable sink36 : String | provenance | | +| Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | provenance | | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | Capture.cs:197:15:197:20 | access to local variable sink38 | provenance | | +| Capture.cs:196:22:196:32 | call to local function Id : String | Capture.cs:196:13:196:18 | access to local variable sink38 : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:196:22:196:32 | call to local function Id : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | provenance | | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:202:20:202:20 | s : String | provenance | | +| Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | Capture.cs:246:19:246:25 | access to field Field | provenance | | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:21 | access to field Field | provenance | | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | Capture.cs:268:15:268:21 | access to field Field | provenance | | +| Capture.cs:273:19:273:19 | x : String | Capture.cs:273:30:273:30 | access to parameter x | provenance | | +| Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:353:45:353:45 | x : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | Capture.cs:301:19:301:28 | access to field Field | provenance | | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | Capture.cs:306:15:306:24 | access to field Field | provenance | | +| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | +| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | +| Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | Capture.cs:330:47:330:47 | access to local variable x | provenance | | +| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | +| Capture.cs:353:45:353:45 | x : String | Capture.cs:355:11:355:11 | access to parameter x : String | provenance | | +| Capture.cs:355:11:355:11 | access to parameter x : String | Capture.cs:273:19:273:19 | x : String | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | @@ -107,98 +247,119 @@ edges | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | GlobalDataFlow.cs:396:52:396:52 | x : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:427:9:427:11 | value : String | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | provenance | | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | provenance | | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | provenance | | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | provenance | | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | +| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | provenance | | | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | provenance | | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | +| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | +| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | provenance | | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | provenance | | -| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | +| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | provenance | | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | provenance | | -| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | -| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | provenance | | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | provenance | | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | provenance | | -| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | provenance | | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | provenance | | -| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | -| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | provenance | | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | provenance | | | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | provenance | | | GlobalDataFlow.cs:215:71:215:71 | x : String | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | provenance | | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | +| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | provenance | | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | +| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | provenance | | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | provenance | | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | provenance | | -| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | provenance | | -| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | -| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | provenance | | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | provenance | | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | provenance | | @@ -210,21 +371,22 @@ edges | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | GlobalDataFlow.cs:285:15:285:24 | access to parameter sinkParam6 | provenance | | | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | provenance | | | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | provenance | | -| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | provenance | | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | provenance | | -| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | provenance | | +| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | provenance | | +| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | provenance | | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | provenance | | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | provenance | | | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | provenance | | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | provenance | | -| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | provenance | | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | provenance | | -| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | provenance | | +| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | provenance | | +| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | @@ -245,19 +407,25 @@ edges | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:57:37:57:37 | x : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:278:26:278:35 | sinkParam5 : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | provenance | | -| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | +| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | provenance | | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | provenance | | -| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | provenance | | -| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | +| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | provenance | | | GlobalDataFlow.cs:466:53:466:55 | arg : String | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | provenance | | | GlobalDataFlow.cs:469:21:469:21 | s : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | provenance | | | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | GlobalDataFlow.cs:469:21:469:21 | s : String | provenance | | @@ -303,15 +471,16 @@ edges | GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | | | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:21 | access to field field | provenance | | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | provenance | | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | -| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | provenance | | @@ -329,51 +498,190 @@ edges | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | provenance | | -| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | +| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | | nodes | Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | semmle.label | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | semmle.label | access to local variable sink27 : String | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | semmle.label | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | semmle.label | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | semmle.label | M(...) : M [captured tainted] : String | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | semmle.label | access to local variable sink28 : String | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:21:23:21:28 | access to local variable sink28 | semmle.label | access to local variable sink28 | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | semmle.label | access to local function M : M [captured tainted] : String | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | semmle.label | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | semmle.label | access to local variable sink29 : String | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:30:19:30:24 | access to local variable sink29 | semmle.label | access to local variable sink29 | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | semmle.label | access to local variable captureIn3 : Func [captured tainted] : String | | Capture.cs:50:50:50:55 | sink39 : String | semmle.label | sink39 : String | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | | Capture.cs:57:27:57:32 | access to parameter sink39 | semmle.label | access to parameter sink39 | | Capture.cs:61:36:61:42 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | semmle.label | SSA def(sink30) : String | | Capture.cs:69:22:69:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | semmle.label | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | | Capture.cs:72:15:72:20 | access to local variable sink30 | semmle.label | access to local variable sink30 | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | semmle.label | SSA def(sink31) : String | | Capture.cs:79:26:79:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | semmle.label | [post] access to local function M : M [captured sink31] : String | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | semmle.label | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | | Capture.cs:84:15:84:20 | access to local variable sink31 | semmle.label | access to local variable sink31 | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | semmle.label | SSA def(sink32) : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | semmle.label | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | semmle.label | SSA def(sink40) : String | -| Capture.cs:115:26:115:39 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:122:15:122:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | -| Capture.cs:125:25:125:31 | tainted : String | semmle.label | tainted : String | -| Capture.cs:133:15:133:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | -| Capture.cs:161:15:161:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:169:15:169:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | -| Capture.cs:188:26:188:26 | s : String | semmle.label | s : String | -| Capture.cs:191:20:191:22 | call to local function M : String | semmle.label | call to local function M : String | -| Capture.cs:194:22:194:32 | call to local function Id : String | semmle.label | call to local function Id : String | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:195:15:195:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | semmle.label | [post] (...) => ... : (...) => ... [captured sink40] : String | +| Capture.cs:116:26:116:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | semmle.label | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | +| Capture.cs:124:15:124:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | +| Capture.cs:127:25:127:31 | tainted : String | semmle.label | tainted : String | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | semmle.label | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | semmle.label | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | semmle.label | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | +| Capture.cs:135:15:135:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | semmle.label | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | semmle.label | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | semmle.label | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | +| Capture.cs:147:15:147:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | semmle.label | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | semmle.label | access to local variable captureThrough3 : Func [captured tainted] : String | +| Capture.cs:156:15:156:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | semmle.label | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | semmle.label | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | +| Capture.cs:163:15:163:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | +| Capture.cs:166:37:166:37 | p : String | semmle.label | p : String | +| Capture.cs:168:22:168:22 | access to parameter p : String | semmle.label | access to parameter p : String | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | semmle.label | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:171:15:171:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | +| Capture.cs:190:26:190:26 | s : String | semmle.label | s : String | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | semmle.label | M(...) : M [captured s] : String | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | semmle.label | access to local function M : M [captured s] : String | +| Capture.cs:193:20:193:22 | call to local function M : String | semmle.label | call to local function M : String | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | +| Capture.cs:196:22:196:32 | call to local function Id : String | semmle.label | call to local function Id : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:197:15:197:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:202:20:202:20 | s : String | semmle.label | s : String | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | +| Capture.cs:206:19:206:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | semmle.label | access to local variable a : Action [captured s] : String | +| Capture.cs:211:21:211:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:213:22:213:22 | s : String | semmle.label | s : String | +| Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | +| Capture.cs:217:19:217:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:221:21:221:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:228:17:228:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | semmle.label | [post] (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:231:19:231:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:232:17:232:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:234:15:234:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:242:19:242:32 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured c, field Field] : String | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:246:19:246:25 | access to field Field | semmle.label | access to field Field | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:247:23:247:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | semmle.label | access to local variable a : Action [captured c, field Field] : String | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:251:15:251:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:264:23:264:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:268:15:268:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:273:19:273:19 | x : String | semmle.label | x : String | +| Capture.cs:273:30:273:30 | access to parameter x | semmle.label | access to parameter x | +| Capture.cs:273:34:273:47 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:278:17:278:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:284:23:284:23 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:285:21:285:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | semmle.label | [post] access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | semmle.label | access to local variable inner : Action [captured x] : String | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | semmle.label | [post] access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | semmle.label | access to local variable middle : Action [captured x] : String | +| Capture.cs:292:15:292:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:297:22:297:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:301:19:301:28 | access to field Field | semmle.label | access to field Field | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:302:26:302:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | semmle.label | access to local variable a : Action [captured this in M10, field Field] : String | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:306:15:306:24 | access to field Field | semmle.label | access to field Field | +| Capture.cs:311:17:311:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:312:15:312:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:318:17:318:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:319:19:319:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:328:17:328:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | semmle.label | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | +| Capture.cs:330:47:330:47 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | semmle.label | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | +| Capture.cs:337:17:337:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:339:45:339:45 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | semmle.label | access to local variable capturedLambda : (...) => ... [captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | semmle.label | a : (...) => ... [captured s] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | semmle.label | [post] access to parameter a : (...) => ... [captured sink40] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | semmle.label | access to parameter a : (...) => ... [captured s] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | +| Capture.cs:353:45:353:45 | x : String | semmle.label | x : String | +| Capture.cs:355:11:355:11 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | semmle.label | access to field SinkField0 | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | semmle.label | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | @@ -391,19 +699,22 @@ nodes | GlobalDataFlow.cs:57:46:57:46 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | semmle.label | call to method Return : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | semmle.label | access to local variable sink0 | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | semmle.label | (...) ... : String | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | semmle.label | call to method Invoke : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | semmle.label | access to local variable sink1 | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | semmle.label | SSA def(sink2) : String | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | semmle.label | access to local variable sink2 | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | semmle.label | SSA def(sink3) : String | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | semmle.label | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | @@ -412,18 +723,21 @@ nodes | GlobalDataFlow.cs:81:79:81:79 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | semmle.label | access to local variable sink13 | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | semmle.label | access to local variable sink14 | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | semmle.label | access to local variable sink15 | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | semmle.label | access to local variable sink16 : String | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | @@ -433,31 +747,40 @@ nodes | GlobalDataFlow.cs:138:40:138:40 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | semmle.label | access to local variable sink4 | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | semmle.label | access to local variable sink5 : String | | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | semmle.label | access to local variable sink5 | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | semmle.label | access to local variable sink6 : String | | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | semmle.label | call to method Out : String | | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | semmle.label | access to local variable sink6 | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | semmle.label | SSA def(sink7) : String | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | semmle.label | access to local variable sink7 : String | | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | semmle.label | access to local variable sink7 | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | semmle.label | SSA def(sink8) : String | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | semmle.label | access to local variable sink8 : String | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | semmle.label | access to local variable sink8 | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | semmle.label | access to local variable sink12 : String | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | semmle.label | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | semmle.label | access to local variable sink12 | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | semmle.label | access to local variable sink23 : String | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | semmle.label | call to method TaintedParam : String | | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | semmle.label | access to local variable sink23 | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | semmle.label | access to local variable sink9 : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | semmle.label | access to local variable sink9 | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | semmle.label | access to local variable sink10 : String | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | semmle.label | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | semmle.label | access to property Value : String | | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | semmle.label | access to local variable sink10 | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | semmle.label | access to local variable sink19 : String | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | semmle.label | access to property OutProperty : String | | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | semmle.label | access to local variable sink19 | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | semmle.label | array creation of type String[] : null [element] : String | | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | semmle.label | call to method AsQueryable : IQueryable [element] : String | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | @@ -466,23 +789,29 @@ nodes | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | semmle.label | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | semmle.label | access to local variable sink24 : String | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | semmle.label | access to local variable sink24 | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | semmle.label | access to local variable sink25 : String | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | semmle.label | call to method Select : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | semmle.label | access to local variable sink25 | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | semmle.label | access to local variable sink26 : String | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | semmle.label | access to local variable sink26 | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | semmle.label | access to local variable sink41 : String | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | semmle.label | access to property Result : String | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | semmle.label | access to local variable sink41 | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | semmle.label | access to local variable sink42 : String | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | semmle.label | await ... : String | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | semmle.label | access to local variable sink42 | @@ -502,15 +831,16 @@ nodes | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | semmle.label | sinkParam7 : String | | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | semmle.label | access to parameter sinkParam7 | | GlobalDataFlow.cs:298:26:298:26 | x : String | semmle.label | x : String | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | semmle.label | access to local variable y : String | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | semmle.label | x0 : String | | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | semmle.label | access to parameter x0 : String | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | semmle.label | ... ? ... : ... : String | | GlobalDataFlow.cs:304:32:304:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:310:32:310:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | semmle.label | sinkParam8 : String | | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | semmle.label | access to parameter sinkParam8 | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | semmle.label | sinkParam9 : String | @@ -518,9 +848,9 @@ nodes | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | semmle.label | sinkParam11 : String | | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | semmle.label | access to parameter sinkParam11 | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | semmle.label | x : String | @@ -543,17 +873,23 @@ nodes | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:401:39:401:45 | tainted : String | semmle.label | tainted : String | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | semmle.label | access to local variable sink11 | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:427:9:427:11 | value : String | semmle.label | value : String | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | semmle.label | access to local variable sink20 : String | | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | semmle.label | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | semmle.label | access to local variable sink45 : String | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | semmle.label | call to method GetResult : String | | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | semmle.label | access to local variable sink45 | @@ -604,11 +940,12 @@ nodes | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:547:15:547:21 | access to field field | semmle.label | access to field field | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | semmle.label | e : null [element] : String | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | semmle.label | access to parameter e : null [element] : String | | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | semmle.label | [b (line 3): false] call to method Return : String | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | semmle.label | [b (line 3): true] call to method Return : String | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | semmle.label | [b (line 3): false] access to parameter tainted : String | @@ -627,6 +964,8 @@ nodes | Splitting.cs:24:28:24:34 | tainted : String | semmle.label | tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | semmle.label | [b (line 24): false] dynamic access to element : String | | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | semmle.label | [b (line 24): true] dynamic access to element : String | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | @@ -634,17 +973,22 @@ nodes | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | semmle.label | [b (line 24): false] access to local variable x | | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | semmle.label | [b (line 24): true] access to local variable x | | Splitting.cs:34:19:34:19 | access to local variable x | semmle.label | access to local variable x | +| Splitting.cs:39:13:39:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String | | Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s | +| Splitting.cs:48:13:48:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String | | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | subpaths -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | Capture.cs:194:22:194:32 | call to local function Id : String | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | Capture.cs:196:22:196:32 | call to local function Id : String | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | @@ -665,6 +1009,13 @@ subpaths | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | [b (line 24): true] access to local variable x | | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | [b (line 3): false] access to local variable x | | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | [b (line 3): true] access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:246:19:246:25 | access to field Field | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:268:15:268:21 | access to field Field | access to field Field | +| Capture.cs:301:19:301:28 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:301:19:301:28 | access to field Field | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | access to field SinkField0 | | GlobalDataFlow.cs:491:15:491:22 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:491:15:491:22 | access to field field | access to field field | | GlobalDataFlow.cs:492:15:492:22 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:492:15:492:22 | access to field field | access to field field | @@ -705,14 +1056,14 @@ subpaths | Capture.cs:72:15:72:20 | access to local variable sink30 | Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:72:15:72:20 | access to local variable sink30 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:84:15:84:20 | access to local variable sink31 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:93:15:93:20 | access to local variable sink32 | access to local variable sink32 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:161:15:161:20 | access to local variable sink36 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:195:15:195:20 | access to local variable sink38 | access to local variable sink38 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:163:15:163:20 | access to local variable sink36 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:197:15:197:20 | access to local variable sink38 | access to local variable sink38 | | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | access to local variable sink4 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:122:15:122:20 | access to local variable sink40 | access to local variable sink40 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:124:15:124:20 | access to local variable sink40 | access to local variable sink40 | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | access to local variable sink41 | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | access to local variable sink42 | | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | access to local variable sink45 | @@ -721,8 +1072,21 @@ subpaths | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | access to local variable sink7 | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | access to local variable sink8 | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | access to local variable sink9 | +| Capture.cs:231:19:231:19 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:231:19:231:19 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | +| Capture.cs:284:23:284:23 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:284:23:284:23 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | +| Capture.cs:312:15:312:15 | access to local variable x | Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:47:330:47 | access to local variable x | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:45:339:45 | access to local variable x | access to local variable x | | Splitting.cs:11:19:11:19 | access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:11:19:11:19 | access to local variable x | access to local variable x | | Splitting.cs:34:19:34:19 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:34:19:34:19 | access to local variable x | access to local variable x | +| Capture.cs:206:19:206:19 | access to parameter s | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:206:19:206:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | GlobalDataFlow.cs:473:28:473:41 | "taint source" : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | access to parameter s | | Capture.cs:57:27:57:32 | access to parameter sink39 | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:57:27:57:32 | access to parameter sink39 | access to parameter sink39 | | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | access to parameter sinkParam0 | @@ -737,5 +1101,6 @@ subpaths | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | access to parameter sinkParam7 | | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | access to parameter sinkParam8 | | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | access to parameter sinkParam9 | +| Capture.cs:273:30:273:30 | access to parameter x | Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:273:30:273:30 | access to parameter x | access to parameter x | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | access to property SinkProperty0 | | Splitting.cs:21:21:21:33 | call to method Return | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:21:21:21:33 | call to method Return | call to method Return | diff --git a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected index bfe1895663c..ff1e94029b4 100644 --- a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected +++ b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected @@ -1,22 +1,20 @@ +| Capture.cs:5:7:5:13 | call to constructor Object | normal | Capture.cs:5:7:5:13 | call to constructor Object | | Capture.cs:33:9:33:40 | call to method Select | normal | Capture.cs:33:9:33:40 | call to method Select | | Capture.cs:33:9:33:50 | call to method ToArray | normal | Capture.cs:33:9:33:50 | call to method ToArray | -| Capture.cs:71:9:71:21 | call to local function CaptureOut1 | captured sink30 | Capture.cs:71:9:71:21 | SSA call def(sink30) | -| Capture.cs:83:9:83:21 | [transitive] call to local function CaptureOut2 | captured sink31 | Capture.cs:83:9:83:21 | SSA call def(sink31) | -| Capture.cs:92:9:92:41 | [transitive] call to method Select | captured sink32 | Capture.cs:92:9:92:41 | SSA call def(sink32) | | Capture.cs:92:9:92:41 | call to method Select | normal | Capture.cs:92:9:92:41 | call to method Select | | Capture.cs:92:9:92:51 | call to method ToArray | normal | Capture.cs:92:9:92:51 | call to method ToArray | -| Capture.cs:121:9:121:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured nonSink0 | Capture.cs:121:9:121:35 | SSA call def(nonSink0) | -| Capture.cs:121:9:121:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured sink40 | Capture.cs:121:9:121:35 | SSA call def(sink40) | -| Capture.cs:132:9:132:25 | call to local function CaptureThrough1 | captured sink33 | Capture.cs:132:9:132:25 | SSA call def(sink33) | -| Capture.cs:144:9:144:25 | [transitive] call to local function CaptureThrough2 | captured sink34 | Capture.cs:144:9:144:25 | SSA call def(sink34) | -| Capture.cs:153:9:153:45 | [transitive] call to method Select | captured sink35 | Capture.cs:153:9:153:45 | SSA call def(sink35) | -| Capture.cs:153:9:153:45 | call to method Select | normal | Capture.cs:153:9:153:45 | call to method Select | -| Capture.cs:153:9:153:55 | call to method ToArray | normal | Capture.cs:153:9:153:55 | call to method ToArray | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 | normal | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 | -| Capture.cs:168:9:168:32 | call to local function CaptureThrough5 | captured sink37 | Capture.cs:168:9:168:32 | SSA call def(sink37) | -| Capture.cs:191:20:191:22 | call to local function M | normal | Capture.cs:191:20:191:22 | call to local function M | -| Capture.cs:194:22:194:32 | call to local function Id | normal | Capture.cs:194:22:194:32 | call to local function Id | -| Capture.cs:196:20:196:25 | call to local function Id | normal | Capture.cs:196:20:196:25 | call to local function Id | +| Capture.cs:155:9:155:45 | call to method Select | normal | Capture.cs:155:9:155:45 | call to method Select | +| Capture.cs:155:9:155:55 | call to method ToArray | normal | Capture.cs:155:9:155:55 | call to method ToArray | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 | normal | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 | +| Capture.cs:193:20:193:22 | call to local function M | normal | Capture.cs:193:20:193:22 | call to local function M | +| Capture.cs:196:22:196:32 | call to local function Id | normal | Capture.cs:196:22:196:32 | call to local function Id | +| Capture.cs:198:20:198:25 | call to local function Id | normal | Capture.cs:198:20:198:25 | call to local function Id | +| Capture.cs:221:18:221:35 | call to method M3 | normal | Capture.cs:221:18:221:35 | call to method M3 | +| Capture.cs:223:28:223:45 | call to method M3 | normal | Capture.cs:223:28:223:45 | call to method M3 | +| Capture.cs:227:24:227:48 | object creation of type List | normal | Capture.cs:227:24:227:48 | object creation of type List | +| Capture.cs:241:17:241:29 | object creation of type Capture | normal | Capture.cs:241:17:241:29 | object creation of type Capture | +| Capture.cs:256:17:256:29 | object creation of type Capture | normal | Capture.cs:256:17:256:29 | object creation of type Capture | +| GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | normal | GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | normal | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | @@ -40,10 +38,10 @@ | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 | | GlobalDataFlow.cs:73:29:73:64 | call to method GetMethod | normal | GlobalDataFlow.cs:73:29:73:64 | call to method GetMethod | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke | normal | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke | -| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) | -| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) | -| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) | -| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) | +| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 | +| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 | +| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 | +| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven | normal | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven | | GlobalDataFlow.cs:81:22:81:93 | call to method First | normal | GlobalDataFlow.cs:81:22:81:93 | call to method First | | GlobalDataFlow.cs:83:22:83:87 | call to method Select | normal | GlobalDataFlow.cs:83:22:83:87 | call to method Select | @@ -55,25 +53,25 @@ | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate | normal | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate | normal | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate | | GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | normal | GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | -| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) | -| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) | +| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 | +| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 | | GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | normal | GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | -| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) | -| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) | +| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 | +| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 | | GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | normal | GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | -| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | out parameter 3 | GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) | -| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | ref parameter 3 | GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) | +| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | out parameter 3 | GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b | +| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | ref parameter 3 | GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b | | GlobalDataFlow.cs:104:24:104:33 | call to method Return | normal | GlobalDataFlow.cs:104:24:104:33 | call to method Return | | GlobalDataFlow.cs:106:28:106:63 | call to method GetMethod | normal | GlobalDataFlow.cs:106:28:106:63 | call to method GetMethod | | GlobalDataFlow.cs:106:28:106:103 | call to method Invoke | normal | GlobalDataFlow.cs:106:28:106:103 | call to method Invoke | -| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:108:27:108:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:108:27:108:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | out parameter 2 | GlobalDataFlow.cs:110:41:110:48 | SSA def(nonSink0) | -| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | ref parameter 2 | GlobalDataFlow.cs:110:41:110:48 | SSA def(nonSink0) | -| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:112:27:112:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:112:27:112:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:114:30:114:34 | SSA def(sink1) | -| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:114:30:114:34 | SSA def(sink1) | +| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:108:27:108:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:108:27:108:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | out parameter 2 | GlobalDataFlow.cs:110:41:110:48 | access to local variable nonSink0 | +| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | ref parameter 2 | GlobalDataFlow.cs:110:41:110:48 | access to local variable nonSink0 | +| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:112:27:112:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:112:27:112:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:114:30:114:34 | access to local variable sink1 | +| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:114:30:114:34 | access to local variable sink1 | | GlobalDataFlow.cs:116:20:116:86 | call to method SelectEven | normal | GlobalDataFlow.cs:116:20:116:86 | call to method SelectEven | | GlobalDataFlow.cs:116:20:116:94 | call to method First | normal | GlobalDataFlow.cs:116:20:116:94 | call to method First | | GlobalDataFlow.cs:118:20:118:82 | call to method Select | normal | GlobalDataFlow.cs:118:20:118:82 | call to method Select | @@ -86,11 +84,11 @@ | GlobalDataFlow.cs:126:20:126:109 | call to method Aggregate | normal | GlobalDataFlow.cs:126:20:126:109 | call to method Aggregate | | GlobalDataFlow.cs:128:20:128:107 | call to method Aggregate | normal | GlobalDataFlow.cs:128:20:128:107 | call to method Aggregate | | GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | normal | GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | -| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:131:38:131:45 | SSA def(nonSink2) | -| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:131:38:131:45 | SSA def(nonSink2) | +| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:131:38:131:45 | access to local variable nonSink2 | +| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:131:38:131:45 | access to local variable nonSink2 | | GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | normal | GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | -| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:134:37:134:44 | SSA def(nonSink3) | -| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:134:37:134:44 | SSA def(nonSink3) | +| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:134:37:134:44 | access to local variable nonSink3 | +| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:134:37:134:44 | access to local variable nonSink3 | | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc | normal | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc | | GlobalDataFlow.cs:139:21:139:34 | delegate call | normal | GlobalDataFlow.cs:139:21:139:34 | delegate call | | GlobalDataFlow.cs:143:20:143:36 | delegate call | normal | GlobalDataFlow.cs:143:20:143:36 | delegate call | @@ -98,18 +96,18 @@ | GlobalDataFlow.cs:151:20:151:40 | call to method ApplyFunc | normal | GlobalDataFlow.cs:151:20:151:40 | call to method ApplyFunc | | GlobalDataFlow.cs:153:20:153:44 | call to method ApplyFunc | normal | GlobalDataFlow.cs:153:20:153:44 | call to method ApplyFunc | | GlobalDataFlow.cs:157:21:157:25 | call to method Out | normal | GlobalDataFlow.cs:157:21:157:25 | call to method Out | -| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | out parameter 0 | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) | -| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | ref parameter 0 | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) | -| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | out parameter 0 | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) | -| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | ref parameter 0 | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) | +| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | out parameter 0 | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 | +| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | ref parameter 0 | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 | +| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | out parameter 0 | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 | +| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | ref parameter 0 | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield | normal | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield | | GlobalDataFlow.cs:165:22:165:39 | call to method First | normal | GlobalDataFlow.cs:165:22:165:39 | call to method First | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam | normal | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam | | GlobalDataFlow.cs:171:20:171:27 | call to method NonOut | normal | GlobalDataFlow.cs:171:20:171:27 | call to method NonOut | -| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | out parameter 0 | GlobalDataFlow.cs:173:23:173:30 | SSA def(nonSink0) | -| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | ref parameter 0 | GlobalDataFlow.cs:173:23:173:30 | SSA def(nonSink0) | -| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | out parameter 0 | GlobalDataFlow.cs:175:23:175:30 | SSA def(nonSink0) | -| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | ref parameter 0 | GlobalDataFlow.cs:175:23:175:30 | SSA def(nonSink0) | +| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | out parameter 0 | GlobalDataFlow.cs:173:23:173:30 | access to local variable nonSink0 | +| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | ref parameter 0 | GlobalDataFlow.cs:173:23:173:30 | access to local variable nonSink0 | +| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | out parameter 0 | GlobalDataFlow.cs:175:23:175:30 | access to local variable nonSink0 | +| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | ref parameter 0 | GlobalDataFlow.cs:175:23:175:30 | access to local variable nonSink0 | | GlobalDataFlow.cs:177:20:177:32 | call to method NonOutYield | normal | GlobalDataFlow.cs:177:20:177:32 | call to method NonOutYield | | GlobalDataFlow.cs:177:20:177:40 | call to method First | normal | GlobalDataFlow.cs:177:20:177:40 | call to method First | | GlobalDataFlow.cs:179:20:179:44 | call to method NonTaintedParam | normal | GlobalDataFlow.cs:179:20:179:44 | call to method NonTaintedParam | @@ -147,17 +145,20 @@ | GlobalDataFlow.cs:249:24:249:34 | access to property Result | normal | GlobalDataFlow.cs:249:24:249:34 | access to property Result | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | normal | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | | GlobalDataFlow.cs:389:16:389:19 | delegate call | normal | GlobalDataFlow.cs:389:16:389:19 | delegate call | +| GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | normal | GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | | GlobalDataFlow.cs:448:22:448:65 | call to method Join | normal | GlobalDataFlow.cs:448:22:448:65 | call to method Join | | GlobalDataFlow.cs:451:23:451:65 | call to method Join | normal | GlobalDataFlow.cs:451:23:451:65 | call to method Join | | GlobalDataFlow.cs:457:20:457:49 | call to method Run | normal | GlobalDataFlow.cs:457:20:457:49 | call to method Run | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | normal | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | normal | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | normal | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | +| GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | normal | GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | +| GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | normal | GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | normal | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | @@ -165,6 +166,7 @@ | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:558:44:558:47 | delegate call | normal | GlobalDataFlow.cs:558:44:558:47 | delegate call | +| GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | normal | GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | normal | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | @@ -178,6 +180,7 @@ | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | normal | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | +| Splitting.cs:1:7:1:15 | call to constructor Object | normal | Splitting.cs:1:7:1:15 | call to constructor Object | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | | Splitting.cs:20:22:20:30 | call to method Return | normal | Splitting.cs:20:22:20:30 | call to method Return | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected index 9a2ea6bd3da..61ffecc4760 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected @@ -5,13 +5,29 @@ | Capture.cs:72:15:72:20 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | +| Capture.cs:206:19:206:19 | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | +| Capture.cs:231:19:231:19 | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | +| Capture.cs:273:30:273:30 | access to parameter x | +| Capture.cs:284:23:284:23 | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | +| Capture.cs:301:19:301:28 | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | +| Capture.cs:312:15:312:15 | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected index ace244f6961..9ccbaf82517 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected @@ -1,43 +1,183 @@ edges -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | provenance | | | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:61:36:61:42 | access to parameter tainted : String | provenance | | -| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | Capture.cs:11:26:11:32 | access to parameter tainted : String | provenance | | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | Capture.cs:20:30:20:36 | access to parameter tainted : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | | Capture.cs:61:36:61:42 | access to parameter tainted : String | Capture.cs:50:50:50:55 | sink39 : String | provenance | | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | -| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:35 | SSA def(sink30) : String | provenance | | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | -| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:39 | SSA def(sink31) : String | provenance | | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | -| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:35 | SSA def(sink32) : String | provenance | | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | -| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:39 | SSA def(sink40) : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:168:25:168:31 | access to parameter tainted : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:194:25:194:31 | access to parameter tainted : String | provenance | | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | provenance | | -| Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | provenance | | -| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:194:22:194:32 | call to local function Id : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | +| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | provenance | | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | +| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | provenance | | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | provenance | | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | +| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | provenance | | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | provenance | | +| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:170:25:170:31 | access to parameter tainted : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:196:25:196:31 | access to parameter tainted : String | provenance | | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | provenance | | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | provenance | | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | Capture.cs:163:15:163:20 | access to local variable sink36 | provenance | | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | Capture.cs:162:13:162:18 | access to local variable sink36 : String | provenance | | +| Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | provenance | | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | Capture.cs:197:15:197:20 | access to local variable sink38 | provenance | | +| Capture.cs:196:22:196:32 | call to local function Id : String | Capture.cs:196:13:196:18 | access to local variable sink38 : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:196:22:196:32 | call to local function Id : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | provenance | | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:202:20:202:20 | s : String | provenance | | +| Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | Capture.cs:246:19:246:25 | access to field Field | provenance | | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:21 | access to field Field | provenance | | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | Capture.cs:268:15:268:21 | access to field Field | provenance | | +| Capture.cs:273:19:273:19 | x : String | Capture.cs:273:30:273:30 | access to parameter x | provenance | | +| Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:353:45:353:45 | x : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | Capture.cs:301:19:301:28 | access to field Field | provenance | | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | Capture.cs:306:15:306:24 | access to field Field | provenance | | +| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | +| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | +| Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | Capture.cs:330:47:330:47 | access to local variable x | provenance | | +| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | +| Capture.cs:353:45:353:45 | x : String | Capture.cs:355:11:355:11 | access to parameter x : String | provenance | | +| Capture.cs:355:11:355:11 | access to parameter x : String | Capture.cs:273:19:273:19 | x : String | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | @@ -107,115 +247,138 @@ edges | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | GlobalDataFlow.cs:396:52:396:52 | x : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:427:9:427:11 | value : String | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | provenance | | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | provenance | | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | provenance | | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | provenance | | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | +| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | provenance | | | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | provenance | | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | +| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | +| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | provenance | | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | provenance | | -| GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | provenance | | +| GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | provenance | | +| GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | provenance | | | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | provenance | | | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | provenance | | | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | provenance | | -| GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) : Int32 | provenance | | -| GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) : Int32 | GlobalDataFlow.cs:95:15:95:20 | access to local variable sink21 | provenance | | -| GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) : Boolean | provenance | | -| GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) : Boolean | GlobalDataFlow.cs:98:15:98:20 | access to local variable sink22 | provenance | | -| GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) : Int32 | provenance | | -| GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) : Int32 | GlobalDataFlow.cs:101:15:101:21 | access to local variable sink21b | provenance | | +| GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | provenance | | +| GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | GlobalDataFlow.cs:95:15:95:20 | access to local variable sink21 | provenance | | +| GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 : Boolean | provenance | | +| GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 : Boolean | GlobalDataFlow.cs:98:15:98:20 | access to local variable sink22 | provenance | | +| GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b : Int32 | provenance | | +| GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b : Int32 | GlobalDataFlow.cs:101:15:101:21 | access to local variable sink21b | provenance | | | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | provenance | | -| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | +| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | provenance | | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | provenance | | -| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | -| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | provenance | | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | provenance | | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | provenance | | -| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | provenance | | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | provenance | | -| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | -| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | provenance | | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | provenance | | | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | provenance | | | GlobalDataFlow.cs:215:71:215:71 | x : String | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | provenance | | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | +| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | provenance | | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | +| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | provenance | | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | provenance | | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | provenance | | -| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | provenance | | -| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | -| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | provenance | | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | provenance | | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | provenance | | @@ -227,21 +390,22 @@ edges | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | GlobalDataFlow.cs:285:15:285:24 | access to parameter sinkParam6 | provenance | | | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | provenance | | | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | provenance | | -| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | provenance | | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | provenance | | -| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | provenance | | +| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | provenance | | +| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | provenance | | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | provenance | | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | provenance | | | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | provenance | | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | provenance | | -| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | provenance | | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | provenance | | -| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | provenance | | +| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | provenance | | +| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | @@ -262,21 +426,28 @@ edges | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:57:37:57:37 | x : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:278:26:278:35 | sinkParam5 : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | provenance | | -| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | +| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | provenance | | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | provenance | | -| GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | GlobalDataFlow.cs:449:15:449:20 | access to local variable sink44 | provenance | | +| GlobalDataFlow.cs:448:13:448:18 | access to local variable sink44 : String | GlobalDataFlow.cs:449:15:449:20 | access to local variable sink44 | provenance | | +| GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | GlobalDataFlow.cs:448:13:448:18 | access to local variable sink44 : String | provenance | | | GlobalDataFlow.cs:448:51:448:64 | "taint source" : String | GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | provenance | | -| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | provenance | | -| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | +| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | provenance | | | GlobalDataFlow.cs:466:53:466:55 | arg : String | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | provenance | | | GlobalDataFlow.cs:469:21:469:21 | s : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | provenance | | | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | GlobalDataFlow.cs:469:21:469:21 | s : String | provenance | | @@ -322,8 +493,7 @@ edges | GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | | | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:21 | access to field field | provenance | | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | provenance | | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | -| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | provenance | | | GlobalDataFlowStringBuilder.cs:17:64:17:64 | s : String | GlobalDataFlowStringBuilder.cs:19:19:19:19 | access to parameter s : String | provenance | | @@ -335,26 +505,32 @@ edges | GlobalDataFlowStringBuilder.cs:30:31:30:32 | [post] access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:40:20:40:26 | (...) ... : AppendInterpolatedStringHandler | provenance | | | GlobalDataFlowStringBuilder.cs:30:35:30:48 | "taint source" : String | GlobalDataFlowStringBuilder.cs:17:64:17:64 | s : String | provenance | | | GlobalDataFlowStringBuilder.cs:30:35:30:48 | "taint source" : String | GlobalDataFlowStringBuilder.cs:30:31:30:32 | [post] access to local variable sb : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:31:13:31:17 | access to local variable sink0 : String | GlobalDataFlowStringBuilder.cs:32:15:32:19 | access to local variable sink0 | provenance | | | GlobalDataFlowStringBuilder.cs:31:21:31:22 | access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:32:15:32:19 | access to local variable sink0 | provenance | | +| GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:31:13:31:17 | access to local variable sink0 : String | provenance | | | GlobalDataFlowStringBuilder.cs:35:9:35:11 | [post] access to local variable sb1 : StringBuilder | GlobalDataFlowStringBuilder.cs:36:21:36:23 | access to local variable sb1 : StringBuilder | provenance | | | GlobalDataFlowStringBuilder.cs:35:20:35:21 | access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:35:9:35:11 | [post] access to local variable sb1 : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:36:13:36:17 | access to local variable sink1 : String | GlobalDataFlowStringBuilder.cs:37:15:37:19 | access to local variable sink1 | provenance | | | GlobalDataFlowStringBuilder.cs:36:21:36:23 | access to local variable sb1 : StringBuilder | GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:37:15:37:19 | access to local variable sink1 | provenance | | +| GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:36:13:36:17 | access to local variable sink1 : String | provenance | | | GlobalDataFlowStringBuilder.cs:40:9:40:11 | [post] access to local variable sb2 : StringBuilder | GlobalDataFlowStringBuilder.cs:41:21:41:23 | access to local variable sb2 : StringBuilder | provenance | | | GlobalDataFlowStringBuilder.cs:40:20:40:26 | (...) ... : AppendInterpolatedStringHandler | GlobalDataFlowStringBuilder.cs:40:9:40:11 | [post] access to local variable sb2 : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:41:13:41:17 | access to local variable sink2 : String | GlobalDataFlowStringBuilder.cs:42:15:42:19 | access to local variable sink2 | provenance | | | GlobalDataFlowStringBuilder.cs:41:21:41:23 | access to local variable sb2 : StringBuilder | GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:42:15:42:19 | access to local variable sink2 | provenance | | +| GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:41:13:41:17 | access to local variable sink2 : String | provenance | | | GlobalDataFlowStringBuilder.cs:48:43:48:44 | [post] access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:49:21:49:22 | access to local variable sb : StringBuilder | provenance | | | GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | GlobalDataFlowStringBuilder.cs:22:76:22:76 | s : String | provenance | | | GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | GlobalDataFlowStringBuilder.cs:48:43:48:44 | [post] access to local variable sb : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:49:13:49:17 | access to local variable sink3 : String | GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | provenance | | | GlobalDataFlowStringBuilder.cs:49:21:49:22 | access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | provenance | | +| GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:49:13:49:17 | access to local variable sink3 : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | provenance | | @@ -372,51 +548,190 @@ edges | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | provenance | | -| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | +| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | | nodes | Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | semmle.label | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | semmle.label | access to local variable sink27 : String | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | semmle.label | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | semmle.label | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | semmle.label | M(...) : M [captured tainted] : String | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | semmle.label | access to local variable sink28 : String | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:21:23:21:28 | access to local variable sink28 | semmle.label | access to local variable sink28 | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | semmle.label | access to local function M : M [captured tainted] : String | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | semmle.label | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | semmle.label | access to local variable sink29 : String | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:30:19:30:24 | access to local variable sink29 | semmle.label | access to local variable sink29 | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | semmle.label | access to local variable captureIn3 : Func [captured tainted] : String | | Capture.cs:50:50:50:55 | sink39 : String | semmle.label | sink39 : String | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | | Capture.cs:57:27:57:32 | access to parameter sink39 | semmle.label | access to parameter sink39 | | Capture.cs:61:36:61:42 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | semmle.label | SSA def(sink30) : String | | Capture.cs:69:22:69:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | semmle.label | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | | Capture.cs:72:15:72:20 | access to local variable sink30 | semmle.label | access to local variable sink30 | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | semmle.label | SSA def(sink31) : String | | Capture.cs:79:26:79:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | semmle.label | [post] access to local function M : M [captured sink31] : String | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | semmle.label | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | | Capture.cs:84:15:84:20 | access to local variable sink31 | semmle.label | access to local variable sink31 | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | semmle.label | SSA def(sink32) : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | semmle.label | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | semmle.label | SSA def(sink40) : String | -| Capture.cs:115:26:115:39 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:122:15:122:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | -| Capture.cs:125:25:125:31 | tainted : String | semmle.label | tainted : String | -| Capture.cs:133:15:133:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | -| Capture.cs:161:15:161:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:169:15:169:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | -| Capture.cs:188:26:188:26 | s : String | semmle.label | s : String | -| Capture.cs:191:20:191:22 | call to local function M : String | semmle.label | call to local function M : String | -| Capture.cs:194:22:194:32 | call to local function Id : String | semmle.label | call to local function Id : String | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:195:15:195:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | semmle.label | [post] (...) => ... : (...) => ... [captured sink40] : String | +| Capture.cs:116:26:116:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | semmle.label | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | +| Capture.cs:124:15:124:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | +| Capture.cs:127:25:127:31 | tainted : String | semmle.label | tainted : String | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | semmle.label | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | semmle.label | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | semmle.label | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | +| Capture.cs:135:15:135:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | semmle.label | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | semmle.label | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | semmle.label | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | +| Capture.cs:147:15:147:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | semmle.label | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | semmle.label | access to local variable captureThrough3 : Func [captured tainted] : String | +| Capture.cs:156:15:156:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | semmle.label | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | semmle.label | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | +| Capture.cs:163:15:163:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | +| Capture.cs:166:37:166:37 | p : String | semmle.label | p : String | +| Capture.cs:168:22:168:22 | access to parameter p : String | semmle.label | access to parameter p : String | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | semmle.label | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:171:15:171:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | +| Capture.cs:190:26:190:26 | s : String | semmle.label | s : String | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | semmle.label | M(...) : M [captured s] : String | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | semmle.label | access to local function M : M [captured s] : String | +| Capture.cs:193:20:193:22 | call to local function M : String | semmle.label | call to local function M : String | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | +| Capture.cs:196:22:196:32 | call to local function Id : String | semmle.label | call to local function Id : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:197:15:197:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:202:20:202:20 | s : String | semmle.label | s : String | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | +| Capture.cs:206:19:206:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | semmle.label | access to local variable a : Action [captured s] : String | +| Capture.cs:211:21:211:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:213:22:213:22 | s : String | semmle.label | s : String | +| Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | +| Capture.cs:217:19:217:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:221:21:221:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:228:17:228:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | semmle.label | [post] (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:231:19:231:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:232:17:232:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:234:15:234:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:242:19:242:32 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured c, field Field] : String | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:246:19:246:25 | access to field Field | semmle.label | access to field Field | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:247:23:247:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | semmle.label | access to local variable a : Action [captured c, field Field] : String | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:251:15:251:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:264:23:264:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:268:15:268:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:273:19:273:19 | x : String | semmle.label | x : String | +| Capture.cs:273:30:273:30 | access to parameter x | semmle.label | access to parameter x | +| Capture.cs:273:34:273:47 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:278:17:278:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:284:23:284:23 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:285:21:285:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | semmle.label | [post] access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | semmle.label | access to local variable inner : Action [captured x] : String | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | semmle.label | [post] access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | semmle.label | access to local variable middle : Action [captured x] : String | +| Capture.cs:292:15:292:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:297:22:297:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:301:19:301:28 | access to field Field | semmle.label | access to field Field | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:302:26:302:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | semmle.label | access to local variable a : Action [captured this in M10, field Field] : String | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:306:15:306:24 | access to field Field | semmle.label | access to field Field | +| Capture.cs:311:17:311:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:312:15:312:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:318:17:318:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:319:19:319:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:328:17:328:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | semmle.label | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | +| Capture.cs:330:47:330:47 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | semmle.label | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | +| Capture.cs:337:17:337:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:339:45:339:45 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | semmle.label | access to local variable capturedLambda : (...) => ... [captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | semmle.label | a : (...) => ... [captured s] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | semmle.label | [post] access to parameter a : (...) => ... [captured sink40] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | semmle.label | access to parameter a : (...) => ... [captured s] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | +| Capture.cs:353:45:353:45 | x : String | semmle.label | x : String | +| Capture.cs:355:11:355:11 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | semmle.label | access to field SinkField0 | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | semmle.label | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | @@ -434,19 +749,22 @@ nodes | GlobalDataFlow.cs:57:46:57:46 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | semmle.label | call to method Return : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | semmle.label | access to local variable sink0 | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | semmle.label | (...) ... : String | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | semmle.label | call to method Invoke : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | semmle.label | access to local variable sink1 | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | semmle.label | SSA def(sink2) : String | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | semmle.label | access to local variable sink2 | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | semmle.label | SSA def(sink3) : String | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | semmle.label | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | @@ -455,69 +773,83 @@ nodes | GlobalDataFlow.cs:81:79:81:79 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | semmle.label | access to local variable sink13 | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | semmle.label | access to local variable sink14 | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | semmle.label | access to local variable sink15 | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | semmle.label | access to local variable sink16 : String | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | semmle.label | access to local variable sink16 | +| GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | semmle.label | access to local variable sink17 : String | | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | semmle.label | call to method Aggregate : String | | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | semmle.label | access to local variable sink17 | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | semmle.label | call to method Aggregate : String | | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | semmle.label | access to local variable sink18 | | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | -| GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) : Int32 | semmle.label | SSA def(sink21) : Int32 | +| GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | semmle.label | access to local variable sink21 : Int32 | | GlobalDataFlow.cs:95:15:95:20 | access to local variable sink21 | semmle.label | access to local variable sink21 | | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | -| GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) : Boolean | semmle.label | SSA def(sink22) : Boolean | +| GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 : Boolean | semmle.label | access to local variable sink22 : Boolean | | GlobalDataFlow.cs:98:15:98:20 | access to local variable sink22 | semmle.label | access to local variable sink22 | | GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | -| GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) : Int32 | semmle.label | SSA def(sink21b) : Int32 | +| GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b : Int32 | semmle.label | access to local variable sink21b : Int32 | | GlobalDataFlow.cs:101:15:101:21 | access to local variable sink21b | semmle.label | access to local variable sink21b | | GlobalDataFlow.cs:138:40:138:40 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | semmle.label | access to local variable sink4 | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | semmle.label | access to local variable sink5 : String | | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | semmle.label | access to local variable sink5 | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | semmle.label | access to local variable sink6 : String | | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | semmle.label | call to method Out : String | | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | semmle.label | access to local variable sink6 | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | semmle.label | SSA def(sink7) : String | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | semmle.label | access to local variable sink7 : String | | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | semmle.label | access to local variable sink7 | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | semmle.label | SSA def(sink8) : String | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | semmle.label | access to local variable sink8 : String | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | semmle.label | access to local variable sink8 | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | semmle.label | access to local variable sink12 : String | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | semmle.label | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | semmle.label | access to local variable sink12 | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | semmle.label | access to local variable sink23 : String | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | semmle.label | call to method TaintedParam : String | | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | semmle.label | access to local variable sink23 | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | semmle.label | access to local variable sink9 : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | semmle.label | access to local variable sink9 | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | semmle.label | access to local variable sink10 : String | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | semmle.label | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | semmle.label | access to property Value : String | | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | semmle.label | access to local variable sink10 | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | semmle.label | access to local variable sink19 : String | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | semmle.label | access to property OutProperty : String | | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | semmle.label | access to local variable sink19 | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | semmle.label | array creation of type String[] : null [element] : String | | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | semmle.label | call to method AsQueryable : IQueryable [element] : String | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | @@ -526,23 +858,29 @@ nodes | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | semmle.label | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | semmle.label | access to local variable sink24 : String | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | semmle.label | access to local variable sink24 | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | semmle.label | access to local variable sink25 : String | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | semmle.label | call to method Select : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | semmle.label | access to local variable sink25 | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | semmle.label | access to local variable sink26 : String | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | semmle.label | access to local variable sink26 | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | semmle.label | access to local variable sink41 : String | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | semmle.label | access to property Result : String | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | semmle.label | access to local variable sink41 | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | semmle.label | access to local variable sink42 : String | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | semmle.label | await ... : String | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | semmle.label | access to local variable sink42 | @@ -562,15 +900,16 @@ nodes | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | semmle.label | sinkParam7 : String | | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | semmle.label | access to parameter sinkParam7 | | GlobalDataFlow.cs:298:26:298:26 | x : String | semmle.label | x : String | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | semmle.label | access to local variable y : String | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | semmle.label | x0 : String | | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | semmle.label | access to parameter x0 : String | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | semmle.label | ... ? ... : ... : String | | GlobalDataFlow.cs:304:32:304:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:310:32:310:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | semmle.label | sinkParam8 : String | | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | semmle.label | access to parameter sinkParam8 | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | semmle.label | sinkParam9 : String | @@ -578,9 +917,9 @@ nodes | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | semmle.label | sinkParam11 : String | | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | semmle.label | access to parameter sinkParam11 | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | semmle.label | x : String | @@ -603,20 +942,27 @@ nodes | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:401:39:401:45 | tainted : String | semmle.label | tainted : String | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | semmle.label | access to local variable sink11 | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:427:9:427:11 | value : String | semmle.label | value : String | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | semmle.label | access to local variable sink20 : String | | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | semmle.label | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:448:13:448:18 | access to local variable sink44 : String | semmle.label | access to local variable sink44 : String | | GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | semmle.label | call to method Join : String | | GlobalDataFlow.cs:448:51:448:64 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:449:15:449:20 | access to local variable sink44 | semmle.label | access to local variable sink44 | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | semmle.label | access to local variable sink45 : String | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | semmle.label | call to method GetResult : String | | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | semmle.label | access to local variable sink45 | @@ -667,7 +1013,6 @@ nodes | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:547:15:547:21 | access to field field | semmle.label | access to field field | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | semmle.label | e : null [element] : String | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | semmle.label | access to parameter e : null [element] : String | | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | semmle.label | access to local variable x : String | @@ -679,25 +1024,31 @@ nodes | GlobalDataFlowStringBuilder.cs:24:19:24:26 | (...) ... : AppendInterpolatedStringHandler | semmle.label | (...) ... : AppendInterpolatedStringHandler | | GlobalDataFlowStringBuilder.cs:30:31:30:32 | [post] access to local variable sb : StringBuilder | semmle.label | [post] access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:30:35:30:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlowStringBuilder.cs:31:13:31:17 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlowStringBuilder.cs:31:21:31:22 | access to local variable sb : StringBuilder | semmle.label | access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:32:15:32:19 | access to local variable sink0 | semmle.label | access to local variable sink0 | | GlobalDataFlowStringBuilder.cs:35:9:35:11 | [post] access to local variable sb1 : StringBuilder | semmle.label | [post] access to local variable sb1 : StringBuilder | | GlobalDataFlowStringBuilder.cs:35:20:35:21 | access to local variable sb : StringBuilder | semmle.label | access to local variable sb : StringBuilder | +| GlobalDataFlowStringBuilder.cs:36:13:36:17 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | | GlobalDataFlowStringBuilder.cs:36:21:36:23 | access to local variable sb1 : StringBuilder | semmle.label | access to local variable sb1 : StringBuilder | | GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:37:15:37:19 | access to local variable sink1 | semmle.label | access to local variable sink1 | | GlobalDataFlowStringBuilder.cs:40:9:40:11 | [post] access to local variable sb2 : StringBuilder | semmle.label | [post] access to local variable sb2 : StringBuilder | | GlobalDataFlowStringBuilder.cs:40:20:40:26 | (...) ... : AppendInterpolatedStringHandler | semmle.label | (...) ... : AppendInterpolatedStringHandler | +| GlobalDataFlowStringBuilder.cs:41:13:41:17 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlowStringBuilder.cs:41:21:41:23 | access to local variable sb2 : StringBuilder | semmle.label | access to local variable sb2 : StringBuilder | | GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:42:15:42:19 | access to local variable sink2 | semmle.label | access to local variable sink2 | | GlobalDataFlowStringBuilder.cs:48:43:48:44 | [post] access to local variable sb : StringBuilder | semmle.label | [post] access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlowStringBuilder.cs:49:13:49:17 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlowStringBuilder.cs:49:21:49:22 | access to local variable sb : StringBuilder | semmle.label | access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | | Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | semmle.label | [b (line 3): false] call to method Return : String | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | semmle.label | [b (line 3): true] call to method Return : String | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | semmle.label | [b (line 3): false] access to parameter tainted : String | @@ -716,6 +1067,8 @@ nodes | Splitting.cs:24:28:24:34 | tainted : String | semmle.label | tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | semmle.label | [b (line 24): false] dynamic access to element : String | | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | semmle.label | [b (line 24): true] dynamic access to element : String | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | @@ -723,17 +1076,22 @@ nodes | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | semmle.label | [b (line 24): false] access to local variable x | | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | semmle.label | [b (line 24): true] access to local variable x | | Splitting.cs:34:19:34:19 | access to local variable x | semmle.label | access to local variable x | +| Splitting.cs:39:13:39:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String | | Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s | +| Splitting.cs:48:13:48:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String | | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | subpaths -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | Capture.cs:194:22:194:32 | call to local function Id : String | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | Capture.cs:196:22:196:32 | call to local function Id : String | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | @@ -759,13 +1117,34 @@ subpaths | Capture.cs:72:15:72:20 | access to local variable sink30 | Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:72:15:72:20 | access to local variable sink30 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:84:15:84:20 | access to local variable sink31 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:93:15:93:20 | access to local variable sink32 | access to local variable sink32 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:122:15:122:20 | access to local variable sink40 | access to local variable sink40 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:161:15:161:20 | access to local variable sink36 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:195:15:195:20 | access to local variable sink38 | access to local variable sink38 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:124:15:124:20 | access to local variable sink40 | access to local variable sink40 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:163:15:163:20 | access to local variable sink36 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:197:15:197:20 | access to local variable sink38 | access to local variable sink38 | +| Capture.cs:206:19:206:19 | access to parameter s | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:206:19:206:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | +| Capture.cs:231:19:231:19 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:231:19:231:19 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:246:19:246:25 | access to field Field | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:268:15:268:21 | access to field Field | access to field Field | +| Capture.cs:273:30:273:30 | access to parameter x | Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:273:30:273:30 | access to parameter x | access to parameter x | +| Capture.cs:284:23:284:23 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:284:23:284:23 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | +| Capture.cs:301:19:301:28 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:301:19:301:28 | access to field Field | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | +| Capture.cs:312:15:312:15 | access to local variable x | Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:47:330:47 | access to local variable x | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:45:339:45 | access to local variable x | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | access to property SinkProperty0 | | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | access to parameter sinkParam2 | diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected index afb49ad2bce..0e656151f08 100644 --- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,443 +1,535 @@ | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | -| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:17 | SSA def(i) | -| Capture.cs:9:9:12:9 | SSA capture def(i) | Capture.cs:11:17:11:17 | access to local variable i | +| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | -| Capture.cs:15:9:22:9 | this | Capture.cs:21:13:21:18 | this access | -| Capture.cs:17:13:20:13 | SSA capture def(i) | Capture.cs:19:21:19:21 | access to local variable i | | Capture.cs:23:9:23:14 | this access | Capture.cs:34:9:34:14 | this access | -| Capture.cs:25:9:33:9 | this | Capture.cs:32:13:32:18 | this access | -| Capture.cs:27:13:30:13 | SSA capture def(i) | Capture.cs:29:21:29:21 | access to local variable i | -| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:17 | SSA def(i) | +| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:13 | access to local variable i | | Capture.cs:34:9:34:14 | this access | Capture.cs:40:9:40:15 | this access | -| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:17 | SSA def(i) | +| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:13 | access to local variable i | | Capture.cs:40:9:40:15 | this access | Capture.cs:51:9:51:15 | this access | -| Capture.cs:40:9:40:17 | SSA call def(i) | Capture.cs:41:13:41:13 | access to local variable i | -| Capture.cs:43:9:50:9 | this | Capture.cs:49:13:49:19 | this access | -| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:21 | SSA def(i) | +| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:17 | access to local variable i | | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | -| Capture.cs:51:9:51:17 | SSA call def(i) | Capture.cs:52:13:52:13 | access to local variable i | -| Capture.cs:54:9:62:9 | this | Capture.cs:60:13:60:19 | this access | -| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:21 | SSA def(i) | -| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:17 | SSA def(i) | -| Capture.cs:63:9:63:17 | SSA call def(i) | Capture.cs:64:13:64:13 | access to local variable i | +| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | +| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:84:21:84:21 | access to parameter b | +| LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | -| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | +| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | [post] access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | +| LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | -| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | -| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | +| LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | LocalDataFlow.cs:61:15:61:19 | [post] access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | -| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | -| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | +| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | | LocalDataFlow.cs:69:15:69:19 | [post] access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | +| LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | | LocalDataFlow.cs:73:15:73:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | +| LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | -| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | +| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | +| LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | LocalDataFlow.cs:81:15:81:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | +| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): false] access to parameter b | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): true] access to parameter b | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | | LocalDataFlow.cs:84:25:84:27 | [b (line 48): true] "a" | LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | +| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | | LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | -| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | +| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | LocalDataFlow.cs:92:21:92:33 | (...) ... | | LocalDataFlow.cs:93:15:93:19 | [post] access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | +| LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | LocalDataFlow.cs:97:15:97:22 | access to local variable nonSink3 | -| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | +| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:96:24:96:39 | (...) ... | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:35 | ... as ... | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | -| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | +| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | [post] access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | +| LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:37 | ... as ... | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | -| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | +| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | [post] access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | +| LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | -| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | +| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | | LocalDataFlow.cs:108:34:108:38 | [post] access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | LocalDataFlow.cs:160:22:160:27 | access to local variable sink15 | +| LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | LocalDataFlow.cs:112:15:112:20 | access to local variable sink16 | -| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | +| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | | LocalDataFlow.cs:111:37:111:41 | [post] access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | +| LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | LocalDataFlow.cs:114:15:114:20 | access to local variable sink17 | | LocalDataFlow.cs:113:22:113:29 | [post] access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | -| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | +| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | | LocalDataFlow.cs:113:44:113:48 | [post] access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | +| LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | -| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | +| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | | LocalDataFlow.cs:115:36:115:43 | [post] access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | | LocalDataFlow.cs:115:46:115:50 | [post] access to local variable sink9 | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | | LocalDataFlow.cs:116:15:116:20 | [post] access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | +| LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | LocalDataFlow.cs:118:15:118:20 | access to local variable sink19 | -| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | +| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | | LocalDataFlow.cs:117:44:117:51 | [post] access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | LocalDataFlow.cs:120:15:120:20 | access to local variable sink45 | -| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | +| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | | LocalDataFlow.cs:119:33:119:37 | [post] access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | +| LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | -| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | +| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | | LocalDataFlow.cs:122:36:122:40 | [post] access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | LocalDataFlow.cs:124:37:124:42 | access to local variable sink46 | +| LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | -| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | +| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | +| LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | -| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | +| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | (...) ... | | LocalDataFlow.cs:127:15:127:20 | [post] access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | +| LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | -| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | +| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | LocalDataFlow.cs:128:22:128:40 | call to method Copy | | LocalDataFlow.cs:129:15:129:20 | [post] access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | +| LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | -| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | +| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | | LocalDataFlow.cs:130:53:130:70 | { ..., ... } | LocalDataFlow.cs:130:40:130:70 | array creation of type String[] | | LocalDataFlow.cs:131:15:131:20 | [post] access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | +| LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | LocalDataFlow.cs:133:15:133:20 | access to local variable sink52 | -| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | +| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | +| LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | LocalDataFlow.cs:137:15:137:22 | access to local variable nonSink2 | -| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | +| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | | LocalDataFlow.cs:136:32:136:39 | [post] access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | LocalDataFlow.cs:139:15:139:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | +| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | | LocalDataFlow.cs:138:39:138:46 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | -| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | +| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | | LocalDataFlow.cs:141:15:141:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | +| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:143:15:143:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | LocalDataFlow.cs:145:15:145:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | +| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | | LocalDataFlow.cs:144:31:144:38 | [post] access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | +| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | +| LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | LocalDataFlow.cs:149:15:149:23 | access to local variable nonSink14 | -| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | +| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | +| LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | +| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | (...) ... | | LocalDataFlow.cs:151:15:151:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | LocalDataFlow.cs:152:20:152:40 | call to method Copy | | LocalDataFlow.cs:153:15:153:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | +| LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | +| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | | LocalDataFlow.cs:154:51:154:70 | { ..., ... } | LocalDataFlow.cs:154:38:154:70 | array creation of type String[] | | LocalDataFlow.cs:155:15:155:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | +| LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | | LocalDataFlow.cs:157:15:157:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | -| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | +| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | LocalDataFlow.cs:174:22:174:27 | access to local variable sink20 | +| LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | LocalDataFlow.cs:163:15:163:20 | access to local variable sink21 | | LocalDataFlow.cs:162:22:162:26 | [post] access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | -| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | +| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | +| LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | LocalDataFlow.cs:165:15:165:20 | access to local variable sink22 | | LocalDataFlow.cs:164:22:164:26 | [post] access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | -| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | +| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | | LocalDataFlow.cs:164:43:164:44 | 41 | LocalDataFlow.cs:164:35:164:44 | (...) ... | +| LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | LocalDataFlow.cs:169:15:169:22 | access to local variable nonSink7 | | LocalDataFlow.cs:168:20:168:24 | [post] access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | -| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | +| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | | LocalDataFlow.cs:168:33:168:37 | [post] access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | +| LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | +| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | LocalDataFlow.cs:178:20:178:27 | access to local variable nonSink7 | +| LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | LocalDataFlow.cs:175:15:175:20 | access to local variable sink25 | -| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | +| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | +| LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | +| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | +| LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | -| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | +| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | | LocalDataFlow.cs:183:15:183:20 | [post] access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | +| LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | LocalDataFlow.cs:185:15:185:20 | access to local variable sink27 | | LocalDataFlow.cs:184:22:184:27 | [post] access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | -| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | +| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | +| LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | LocalDataFlow.cs:187:15:187:20 | access to local variable sink28 | | LocalDataFlow.cs:186:22:186:27 | [post] access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | -| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | +| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | +| LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | LocalDataFlow.cs:189:15:189:20 | access to local variable sink29 | | LocalDataFlow.cs:188:22:188:27 | [post] access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | -| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | +| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | +| LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | -| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | +| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | [post] access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | +| LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | -| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | +| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | | LocalDataFlow.cs:195:15:195:22 | [post] access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | +| LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | LocalDataFlow.cs:197:15:197:22 | access to local variable nonSink0 | | LocalDataFlow.cs:196:20:196:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | LocalDataFlow.cs:199:15:199:22 | access to local variable nonSink0 | | LocalDataFlow.cs:198:20:198:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | LocalDataFlow.cs:201:15:201:22 | access to local variable nonSink0 | | LocalDataFlow.cs:200:20:200:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | +| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | +| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | +| LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | -| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | +| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | | LocalDataFlow.cs:207:15:207:20 | [post] access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | +| LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | -| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | +| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | [post] access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | +| LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | -| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | +| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | | LocalDataFlow.cs:213:15:213:22 | [post] access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | +| LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | -| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | +| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | | LocalDataFlow.cs:218:30:218:119 | call to method Insert | LocalDataFlow.cs:218:30:218:127 | call to method Clone | | LocalDataFlow.cs:218:30:218:127 | call to method Clone | LocalDataFlow.cs:218:22:218:127 | (...) ... | | LocalDataFlow.cs:219:15:219:20 | [post] access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | +| LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | LocalDataFlow.cs:221:15:221:20 | access to local variable sink48 | | LocalDataFlow.cs:220:22:220:27 | [post] access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | -| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | +| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | +| LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | +| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | | LocalDataFlow.cs:224:28:224:119 | call to method Insert | LocalDataFlow.cs:224:28:224:127 | call to method Clone | | LocalDataFlow.cs:224:28:224:127 | call to method Clone | LocalDataFlow.cs:224:20:224:127 | (...) ... | | LocalDataFlow.cs:225:15:225:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | +| LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | LocalDataFlow.cs:227:15:227:23 | access to local variable nonSink15 | | LocalDataFlow.cs:226:25:226:32 | [post] access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | -| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | +| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | +| LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | -| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | +| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | | LocalDataFlow.cs:231:15:231:20 | [post] access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | +| LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | -| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | +| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | [post] access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | +| LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | -| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | +| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | | LocalDataFlow.cs:235:9:235:14 | [post] access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:235:9:235:33 | call to method AppendLine | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | +| LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | -| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | +| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | | LocalDataFlow.cs:240:15:240:23 | [post] access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | +| LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | | LocalDataFlow.cs:241:20:241:28 | [post] access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | -| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:243:9:243:17 | [post] access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:38 | call to method AppendLine | | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | +| LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AList) | LocalDataFlow.cs:250:22:250:46 | access to property AList | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AString) | LocalDataFlow.cs:248:22:248:48 | access to property AString | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AnInt) | LocalDataFlow.cs:257:20:257:44 | access to property AnInt | -| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | +| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | +| LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | LocalDataFlow.cs:249:15:249:20 | access to local variable sink53 | | LocalDataFlow.cs:248:22:248:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | -| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | +| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | +| LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | LocalDataFlow.cs:251:15:251:20 | access to local variable sink54 | | LocalDataFlow.cs:250:22:250:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:250:22:250:46 | [post] access to property AList | LocalDataFlow.cs:259:20:259:44 | access to property AList | | LocalDataFlow.cs:250:22:250:46 | access to property AList | LocalDataFlow.cs:259:20:259:44 | access to property AList | -| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | +| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | +| LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | LocalDataFlow.cs:255:20:255:41 | access to local variable nonTaintedDataContract | | LocalDataFlow.cs:254:13:254:55 | SSA qualifier def(nonTaintedDataContract.AString) | LocalDataFlow.cs:255:20:255:49 | access to property AString | -| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | +| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | +| LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | LocalDataFlow.cs:256:15:256:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | +| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | LocalDataFlow.cs:258:15:258:22 | access to local variable nonSink2 | | LocalDataFlow.cs:257:20:257:38 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | -| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | +| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | LocalDataFlow.cs:260:15:260:22 | access to local variable nonSink2 | -| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | +| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | LocalDataFlow.cs:264:22:264:35 | access to local variable taintedTextBox | | LocalDataFlow.cs:263:17:263:37 | SSA qualifier def(taintedTextBox.Text) | LocalDataFlow.cs:264:22:264:40 | access to property Text | -| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | +| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | +| LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | LocalDataFlow.cs:265:15:265:20 | access to local variable sink60 | -| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | +| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | +| LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | LocalDataFlow.cs:269:20:269:36 | access to local variable nonTaintedTextBox | | LocalDataFlow.cs:268:17:268:40 | SSA qualifier def(nonTaintedTextBox.Text) | LocalDataFlow.cs:269:20:269:41 | access to property Text | -| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | +| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | +| LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | LocalDataFlow.cs:274:15:274:20 | access to local variable sink69 | -| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | +| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | +| LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | +| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | | LocalDataFlow.cs:278:15:278:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | -| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | +| LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | +| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | +| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | ... = ... | -| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | | LocalDataFlow.cs:282:15:282:20 | [post] access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | +| LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:27 | access to local variable nonSink0 | | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:38 | ... = ... | | LocalDataFlow.cs:286:15:286:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | -| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | String sink71 | | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | LocalDataFlow.cs:290:19:290:24 | access to local variable sink71 | -| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:289:23:289:35 | String sink71 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | String nonSink16 | | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | LocalDataFlow.cs:294:19:294:27 | access to local variable nonSink16 | -| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:293:25:293:40 | String nonSink16 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | String sink72 | | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | LocalDataFlow.cs:300:23:300:28 | access to local variable sink72 | -| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:299:18:299:30 | String sink72 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | String nonSink17 | | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | LocalDataFlow.cs:308:23:308:31 | access to local variable nonSink17 | +| LocalDataFlow.cs:307:18:307:33 | String nonSink17 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | LocalDataFlow.cs:315:15:315:20 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | -| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | +| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | +| LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | LocalDataFlow.cs:316:15:316:20 | access to local variable sink74 | | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | -| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | +| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | | LocalDataFlow.cs:334:28:334:30 | SSA entry def(this.anInt) | LocalDataFlow.cs:334:41:334:45 | access to field anInt | | LocalDataFlow.cs:334:28:334:30 | this | LocalDataFlow.cs:334:41:334:45 | this access | | LocalDataFlow.cs:334:50:334:52 | this | LocalDataFlow.cs:334:56:334:60 | this access | | LocalDataFlow.cs:334:50:334:52 | value | LocalDataFlow.cs:334:64:334:68 | access to parameter value | +| LocalDataFlow.cs:334:64:334:68 | access to parameter value | LocalDataFlow.cs:334:56:334:60 | access to field anInt | | LocalDataFlow.cs:340:41:340:47 | tainted | LocalDataFlow.cs:342:15:342:21 | access to parameter tainted | | LocalDataFlow.cs:345:44:345:53 | nonTainted | LocalDataFlow.cs:347:15:347:24 | access to parameter nonTainted | | LocalDataFlow.cs:350:44:350:44 | x | LocalDataFlow.cs:353:21:353:21 | access to parameter x | | LocalDataFlow.cs:350:67:350:68 | os | LocalDataFlow.cs:356:33:356:34 | access to parameter os | +| LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:17 | access to local variable x1 | | LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:21 | ... = ... | +| LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:29 | access to local variable os2 | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:34 | ... = ... | | LocalDataFlow.cs:361:41:361:44 | args | LocalDataFlow.cs:363:29:363:32 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | [post] access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | +| LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | LocalDataFlow.cs:363:22:363:25 | access to local variable span | +| LocalDataFlow.cs:364:27:364:30 | call to operator implicit conversion | LocalDataFlow.cs:364:23:364:23 | access to local variable x | | LocalDataFlow.cs:367:23:367:24 | b1 | LocalDataFlow.cs:371:13:371:14 | access to parameter b1 | | LocalDataFlow.cs:367:32:367:33 | b2 | LocalDataFlow.cs:374:17:374:18 | access to parameter b2 | +| LocalDataFlow.cs:369:17:369:18 | "" | LocalDataFlow.cs:369:13:369:13 | access to local variable x | +| LocalDataFlow.cs:373:13:373:13 | access to local variable x | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:376:35:376:35 | access to local variable x | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | +| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:13 | access to local variable x | +| LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | +| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x | | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x | | SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S | | SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access | | SSA.cs:5:26:5:32 | tainted | SSA.cs:8:24:8:30 | access to parameter tainted | | SSA.cs:5:42:5:51 | nonTainted | SSA.cs:12:24:12:33 | access to parameter nonTainted | +| SSA.cs:8:13:8:20 | access to local variable ssaSink0 | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | -| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | +| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:20 | access to local variable ssaSink0 | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:58:27:58:33 | access to parameter tainted | | SSA.cs:9:15:9:22 | [post] access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | +| SSA.cs:12:13:12:20 | access to local variable nonSink0 | SSA.cs:12:13:12:33 | SSA def(nonSink0) | | SSA.cs:12:13:12:33 | SSA def(nonSink0) | SSA.cs:13:15:13:22 | access to local variable nonSink0 | -| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:33 | SSA def(nonSink0) | +| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:20 | access to local variable nonSink0 | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:23:13:23:22 | access to parameter nonTainted | | SSA.cs:13:15:13:22 | [post] access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | | SSA.cs:13:15:13:22 | access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | @@ -449,35 +541,41 @@ | SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | +| SSA.cs:22:16:22:23 | access to local variable ssaSink1 | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | +| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:23 | access to local variable ssaSink1 | | SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | +| SSA.cs:24:13:24:20 | access to local variable ssaSink1 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | +| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:20 | access to local variable ssaSink1 | | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 | +| SSA.cs:28:16:28:23 | access to local variable nonSink1 | SSA.cs:28:16:28:28 | SSA def(nonSink1) | | SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:28 | SSA def(nonSink1) | +| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:23 | access to local variable nonSink1 | | SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | +| SSA.cs:30:13:30:20 | access to local variable nonSink1 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | | SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | +| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:20 | access to local variable nonSink1 | | SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:49:24:49:31 | access to local variable nonSink0 | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 | +| SSA.cs:34:16:34:23 | access to local variable ssaSink2 | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | -| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | +| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:23 | access to local variable ssaSink2 | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | +| SSA.cs:37:13:37:20 | access to local variable ssaSink2 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:39:21:39:28 | access to local variable ssaSink2 | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:41:21:41:28 | access to local variable ssaSink2 | -| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | +| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:20 | access to local variable ssaSink2 | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:38:17:38:26 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | @@ -489,15 +587,17 @@ | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 | +| SSA.cs:46:16:46:23 | access to local variable nonSink2 | SSA.cs:46:16:46:28 | SSA def(nonSink2) | | SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | -| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:28 | SSA def(nonSink2) | +| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:23 | access to local variable nonSink2 | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | +| SSA.cs:49:13:49:20 | access to local variable nonSink2 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:51:21:51:28 | access to local variable nonSink2 | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 | -| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | +| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:20 | access to local variable nonSink2 | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:50:17:50:26 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | @@ -508,21 +608,25 @@ | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 | +| SSA.cs:58:16:58:23 | access to local variable ssaSink3 | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | -| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | +| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:23 | access to local variable ssaSink3 | | SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:67:32:67:38 | access to parameter tainted | | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | SSA.cs:60:15:60:22 | access to local variable ssaSink3 | | SSA.cs:59:23:59:30 | [post] access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | +| SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:63:23:63:30 | SSA def(nonSink0) | SSA.cs:64:15:64:22 | access to local variable nonSink0 | | SSA.cs:63:23:63:30 | [post] access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | +| SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:67:9:67:12 | [post] this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:12 | this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:14 | [post] access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:14 | access to field S | SSA.cs:68:23:68:28 | access to field S | +| SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | -| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | +| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | | SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:77:20:77:26 | access to parameter tainted | | SSA.cs:68:23:68:26 | [post] this access | SSA.cs:69:15:69:18 | this access | | SSA.cs:68:23:68:26 | this access | SSA.cs:69:15:69:18 | this access | @@ -530,6 +634,7 @@ | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | SSA.cs:69:15:69:34 | access to field SsaFieldSink0 | | SSA.cs:68:23:68:28 | [post] access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | +| SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:69:15:69:18 | [post] this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:18 | this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:20 | [post] access to field S | SSA.cs:72:9:72:14 | access to field S | @@ -538,22 +643,26 @@ | SSA.cs:72:9:72:12 | this access | SSA.cs:73:23:73:26 | this access | | SSA.cs:72:9:72:14 | [post] access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:14 | access to field S | SSA.cs:73:23:73:28 | access to field S | +| SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | -| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:26 | [post] this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:26 | this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:28 | SSA def(this.S) | SSA.cs:74:15:74:20 | access to field S | | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:74:15:74:37 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:28 | [post] access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | +| SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:74:15:74:18 | [post] this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:18 | this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:20 | [post] access to field S | SSA.cs:80:9:80:14 | access to field S | | SSA.cs:74:15:74:20 | access to field S | SSA.cs:80:9:80:14 | access to field S | +| SSA.cs:77:9:77:16 | access to local variable nonSink0 | SSA.cs:77:9:77:26 | SSA def(nonSink0) | | SSA.cs:77:9:77:26 | SSA def(nonSink0) | SSA.cs:78:21:78:28 | access to local variable nonSink0 | -| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:26 | SSA def(nonSink0) | +| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:16 | access to local variable nonSink0 | | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:80:35:80:41 | access to parameter tainted | | SSA.cs:78:21:78:28 | SSA def(nonSink0) | SSA.cs:79:15:79:22 | access to local variable nonSink0 | +| SSA.cs:78:21:78:28 | access to local variable nonSink0 | SSA.cs:78:21:78:28 | SSA def(nonSink0) | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | @@ -562,18 +671,21 @@ | SSA.cs:80:9:80:12 | this access | SSA.cs:81:21:81:24 | this access | | SSA.cs:80:9:80:14 | [post] access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:9:80:14 | access to field S | SSA.cs:81:21:81:26 | access to field S | +| SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:80:9:80:31 | access to field SsaFieldNonSink0 | | SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:83:35:83:41 | access to parameter tainted | | SSA.cs:81:21:81:24 | [post] this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:24 | this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:26 | SSA def(this.S) | SSA.cs:82:15:82:20 | access to field S | | SSA.cs:81:21:81:26 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:82:15:82:37 | access to field SsaFieldNonSink0 | +| SSA.cs:81:21:81:26 | access to field S | SSA.cs:81:21:81:26 | SSA def(this.S) | | SSA.cs:82:15:82:18 | [post] this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:18 | this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:20 | [post] access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:82:15:82:20 | access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:83:9:83:12 | [post] this access | SSA.cs:84:9:84:14 | this access | | SSA.cs:83:9:83:12 | this access | SSA.cs:84:9:84:14 | this access | -| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | SSA call def(this.S) | SSA.cs:85:15:85:20 | access to field S | | SSA.cs:84:9:84:14 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:85:15:85:37 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | [post] this access | SSA.cs:85:15:85:18 | this access | @@ -582,15 +694,17 @@ | SSA.cs:85:15:85:18 | this access | SSA.cs:114:9:114:12 | this access | | SSA.cs:85:15:85:20 | [post] access to field S | SSA.cs:114:9:114:14 | access to field S | | SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S | +| SSA.cs:88:16:88:23 | access to local variable ssaSink4 | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | -| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | +| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:23 | access to local variable ssaSink4 | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | +| SSA.cs:91:13:91:20 | access to local variable ssaSink4 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:93:21:93:28 | access to local variable ssaSink4 | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 | -| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | +| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:20 | access to local variable ssaSink4 | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:92:17:92:26 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | @@ -604,15 +718,18 @@ | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | SSA.cs:98:15:98:22 | access to local variable ssaSink4 | | SSA.cs:97:23:97:30 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | | SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:101:16:101:23 | access to local variable nonSink3 | SSA.cs:101:16:101:28 | SSA def(nonSink3) | | SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | -| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:28 | SSA def(nonSink3) | +| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:23 | access to local variable nonSink3 | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | +| SSA.cs:104:13:104:20 | access to local variable nonSink3 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:106:21:106:28 | access to local variable nonSink3 | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 | -| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | +| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:20 | access to local variable nonSink3 | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:105:17:105:26 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | @@ -626,6 +743,7 @@ | SSA.cs:110:23:110:30 | SSA def(nonSink3) | SSA.cs:111:15:111:22 | access to local variable nonSink3 | | SSA.cs:110:23:110:30 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | +| SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:117:13:117:16 | this access | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:123:23:123:26 | this access | | SSA.cs:114:9:114:12 | this access | SSA.cs:117:13:117:16 | this access | @@ -634,8 +752,9 @@ | SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | +| SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | -| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | @@ -648,9 +767,10 @@ | SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:119:21:119:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:121:21:121:26 | access to field S | +| SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | -| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | | SSA.cs:118:17:118:26 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:119:21:119:24 | [post] this access | SSA.cs:123:23:123:26 | this access | @@ -674,6 +794,7 @@ | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) | SSA.cs:124:15:124:34 | access to field SsaFieldSink1 | | SSA.cs:123:23:123:28 | [post] access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | +| SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:124:15:124:18 | [post] this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:18 | this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:20 | [post] access to field S | SSA.cs:127:9:127:14 | access to field S | @@ -686,8 +807,9 @@ | SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | +| SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | -| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | | SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:130:13:130:16 | [post] this access | SSA.cs:132:21:132:24 | this access | @@ -698,9 +820,10 @@ | SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:132:21:132:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:134:21:134:26 | access to field S | +| SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | -| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | | SSA.cs:132:21:132:24 | [post] this access | SSA.cs:136:23:136:26 | this access | | SSA.cs:132:21:132:24 | this access | SSA.cs:136:23:136:26 | this access | | SSA.cs:132:21:132:26 | [post] access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | @@ -721,29 +844,38 @@ | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:137:15:137:37 | access to field SsaFieldNonSink0 | | SSA.cs:136:23:136:28 | [post] access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | +| SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:144:34:144:34 | t | SSA.cs:146:13:146:13 | access to parameter t | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:146:13:146:13 | (...) ... | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:149:17:149:17 | access to parameter t | +| SSA.cs:147:13:147:13 | access to parameter t | SSA.cs:147:13:147:26 | SSA def(t) | | SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:26 | SSA def(t) | +| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:13 | access to parameter t | +| SSA.cs:149:13:149:13 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | | SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | +| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:13 | access to parameter t | | SSA.cs:152:36:152:36 | t | SSA.cs:154:13:154:13 | access to parameter t | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:152:17:152:28 | SSA phi(t) | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:154:13:154:13 | (...) ... | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:155:25:155:25 | access to parameter t | | SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:152:17:152:28 | SSA phi(t) | +| SSA.cs:155:25:155:25 | access to parameter t | SSA.cs:155:25:155:25 | SSA def(t) | | SSA.cs:166:10:166:13 | this | SSA.cs:166:19:166:22 | this access | +| SSA.cs:166:28:166:31 | null | SSA.cs:166:19:166:24 | access to field S | | SSA.cs:168:22:168:28 | tainted | SSA.cs:173:24:173:30 | access to parameter tainted | | SSA.cs:168:35:168:35 | i | SSA.cs:171:13:171:13 | access to parameter i | +| SSA.cs:170:16:170:23 | access to local variable ssaSink5 | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | -| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | +| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:23 | access to local variable ssaSink5 | +| SSA.cs:171:13:171:13 | access to parameter i | SSA.cs:171:13:171:15 | SSA def(i) | | SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | +| SSA.cs:173:13:173:20 | access to local variable ssaSink5 | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | -| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | +| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:20 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | | SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i | +| SSA.cs:174:20:174:20 | access to parameter i | SSA.cs:174:20:174:22 | SSA def(i) | | SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | | SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | @@ -752,9 +884,10 @@ | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 | | Splitting.cs:3:18:3:18 | b | Splitting.cs:6:13:6:13 | access to parameter b | | Splitting.cs:3:28:3:34 | tainted | Splitting.cs:5:17:5:23 | access to parameter tainted | +| Splitting.cs:5:13:5:13 | access to local variable x | Splitting.cs:5:13:5:23 | SSA def(x) | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x | -| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:23 | SSA def(x) | +| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:13 | access to local variable x | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b | | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | @@ -763,24 +896,30 @@ | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:17:18:17:18 | b | Splitting.cs:20:13:20:13 | access to parameter b | +| Splitting.cs:19:13:19:13 | access to local variable x | Splitting.cs:19:13:19:18 | SSA def(x) | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | -| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:18 | SSA def(x) | +| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:13 | access to local variable x | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): false] access to parameter b | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): true] access to parameter b | +| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | -| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | +| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:13 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:32:18:32:18 | b | Splitting.cs:35:13:35:13 | access to parameter b | +| Splitting.cs:34:17:34:18 | "" | Splitting.cs:34:13:34:13 | access to local variable x | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | +| Splitting.cs:36:17:36:19 | [b (line 32): true] "a" | Splitting.cs:36:13:36:13 | access to local variable x | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | -| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | -| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | +| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:9 | access to local variable x | +| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:9 | access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | | Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | @@ -793,47 +932,68 @@ | Splitting.cs:39:23:39:25 | [b (line 32): false] "c" | Splitting.cs:39:15:39:25 | [b (line 32): false] ... ? ... : ... | | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): false] (...) ... | | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): true] (...) ... | +| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:21 | [b (line 32): false] ... = ... | +| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:21 | [b (line 32): true] ... = ... | | Splitting.cs:46:18:46:18 | b | Splitting.cs:49:13:49:13 | access to parameter b | +| Splitting.cs:48:13:48:13 | access to local variable x | Splitting.cs:48:13:48:18 | SSA def(x) | | Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x | -| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:18 | SSA def(x) | +| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:13 | access to local variable x | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): false] access to parameter b | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): true] access to parameter b | +| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x | -| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | +| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:13 | access to local variable x | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | -| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | -| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | +| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | +| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | | Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | | Splitting.cs:51:30:51:36 | [b (line 46): true] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | | Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | | Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | +| Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:12 | access to array element | +| Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:12 | access to array element | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | -| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | -| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | +| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | +| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z | | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z | | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x | | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x | -| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | -| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | +| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): false] !... | Splitting.cs:55:9:55:9 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): true] !... | Splitting.cs:55:9:55:9 | access to local variable z | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): false] access to local variable x | | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): true] access to local variable x | -| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | -| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | +| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | +| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | +| Splitting.cs:57:13:57:24 | [b (line 46): false] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | +| Splitting.cs:57:13:57:24 | [b (line 46): true] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y | | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): false] access to local variable s | | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): true] access to local variable s | | UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop | | UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access | +| UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | @@ -935,7 +1095,7 @@ | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | -| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | +| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:13 | access to local variable x | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:31:24:34 | this access | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:3193:24:3198 | this access | | UseUseExplosion.cs:24:13:24:16 | access to property Prop | UseUseExplosion.cs:24:31:24:34 | access to property Prop | diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected index dc8cdffaa36..e1ea6fe13d9 100644 --- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected @@ -1,129 +1,139 @@ | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | -| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:17 | SSA def(i) | -| Capture.cs:9:9:12:9 | SSA capture def(i) | Capture.cs:11:17:11:17 | access to local variable i | +| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | -| Capture.cs:15:9:22:9 | this | Capture.cs:21:13:21:18 | this access | -| Capture.cs:17:13:20:13 | SSA capture def(i) | Capture.cs:19:21:19:21 | access to local variable i | | Capture.cs:23:9:23:14 | this access | Capture.cs:34:9:34:14 | this access | -| Capture.cs:25:9:33:9 | this | Capture.cs:32:13:32:18 | this access | -| Capture.cs:27:13:30:13 | SSA capture def(i) | Capture.cs:29:21:29:21 | access to local variable i | -| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:17 | SSA def(i) | +| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:13 | access to local variable i | | Capture.cs:34:9:34:14 | this access | Capture.cs:40:9:40:15 | this access | -| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:17 | SSA def(i) | +| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:13 | access to local variable i | | Capture.cs:40:9:40:15 | this access | Capture.cs:51:9:51:15 | this access | -| Capture.cs:40:9:40:17 | SSA call def(i) | Capture.cs:41:13:41:13 | access to local variable i | -| Capture.cs:43:9:50:9 | this | Capture.cs:49:13:49:19 | this access | -| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:21 | SSA def(i) | +| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:17 | access to local variable i | | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | -| Capture.cs:51:9:51:17 | SSA call def(i) | Capture.cs:52:13:52:13 | access to local variable i | -| Capture.cs:54:9:62:9 | this | Capture.cs:60:13:60:19 | this access | -| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:21 | SSA def(i) | -| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:17 | SSA def(i) | -| Capture.cs:63:9:63:17 | SSA call def(i) | Capture.cs:64:13:64:13 | access to local variable i | +| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | +| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:84:21:84:21 | access to parameter b | +| LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | -| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | +| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | [post] access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | +| LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | -| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | +| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | ... + ... | -| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:60:9:60:22 | ... + ... | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | LocalDataFlow.cs:61:15:61:19 | [post] access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | ... + ... | -| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | | LocalDataFlow.cs:64:21:64:25 | "abc" | LocalDataFlow.cs:64:9:64:25 | ... + ... | | LocalDataFlow.cs:65:15:65:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:32 | ... + ... | | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | -| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | +| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | | LocalDataFlow.cs:68:29:68:32 | "ok" | LocalDataFlow.cs:68:21:68:32 | ... + ... | | LocalDataFlow.cs:69:15:69:19 | [post] access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | +| LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:36 | ... + ... | -| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | | LocalDataFlow.cs:72:31:72:36 | "test" | LocalDataFlow.cs:72:20:72:36 | ... + ... | | LocalDataFlow.cs:73:15:73:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | +| LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | -| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | +| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | +| LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | LocalDataFlow.cs:81:15:81:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | +| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): false] access to parameter b | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): true] access to parameter b | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | | LocalDataFlow.cs:84:25:84:27 | [b (line 48): true] "a" | LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | +| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | | LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | -| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | +| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | LocalDataFlow.cs:92:21:92:33 | (...) ... | | LocalDataFlow.cs:93:15:93:19 | [post] access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | +| LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | LocalDataFlow.cs:97:15:97:22 | access to local variable nonSink3 | -| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | +| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:96:24:96:39 | (...) ... | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:35 | ... as ... | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | -| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | +| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | [post] access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | +| LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:37 | ... as ... | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | -| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | +| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | [post] access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | +| LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | -| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | +| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | | LocalDataFlow.cs:108:34:108:38 | [post] access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | LocalDataFlow.cs:108:22:108:39 | call to method Parse | | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | LocalDataFlow.cs:160:22:160:27 | access to local variable sink15 | +| LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | LocalDataFlow.cs:112:15:112:20 | access to local variable sink16 | -| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | +| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | | LocalDataFlow.cs:111:37:111:41 | [post] access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | LocalDataFlow.cs:111:22:111:56 | call to method TryParse | | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | +| LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | LocalDataFlow.cs:114:15:114:20 | access to local variable sink17 | | LocalDataFlow.cs:113:22:113:29 | [post] access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | LocalDataFlow.cs:113:22:113:49 | call to method Replace | | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | -| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | +| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | | LocalDataFlow.cs:113:44:113:48 | [post] access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | LocalDataFlow.cs:113:22:113:49 | call to method Replace | | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | +| LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | -| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | +| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | | LocalDataFlow.cs:115:36:115:43 | [post] access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | LocalDataFlow.cs:115:22:115:51 | call to method Format | | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | @@ -132,41 +142,48 @@ | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | | LocalDataFlow.cs:116:15:116:20 | [post] access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | +| LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | LocalDataFlow.cs:118:15:118:20 | access to local variable sink19 | -| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | +| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | LocalDataFlow.cs:117:22:117:52 | call to method Format | | LocalDataFlow.cs:117:44:117:51 | [post] access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | LocalDataFlow.cs:117:22:117:52 | call to method Format | | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | LocalDataFlow.cs:120:15:120:20 | access to local variable sink45 | -| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | +| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | | LocalDataFlow.cs:119:33:119:37 | [post] access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | LocalDataFlow.cs:119:22:119:38 | call to method Parse | | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | +| LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | -| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | +| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | | LocalDataFlow.cs:122:36:122:40 | [post] access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | LocalDataFlow.cs:122:22:122:56 | call to method TryParse | | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | LocalDataFlow.cs:124:37:124:42 | access to local variable sink46 | +| LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | -| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | +| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | | LocalDataFlow.cs:124:37:124:42 | access to local variable sink46 | LocalDataFlow.cs:124:22:124:43 | call to method ToByte | | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | +| LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | -| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | +| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | | LocalDataFlow.cs:126:36:126:37 | "" | LocalDataFlow.cs:126:22:126:46 | call to method Concat | | LocalDataFlow.cs:126:40:126:45 | (...) ... | LocalDataFlow.cs:126:22:126:46 | call to method Concat | | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | (...) ... | | LocalDataFlow.cs:127:15:127:20 | [post] access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | +| LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | -| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | +| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | LocalDataFlow.cs:128:22:128:40 | call to method Copy | | LocalDataFlow.cs:129:15:129:20 | [post] access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | +| LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | -| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | +| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | | LocalDataFlow.cs:130:34:130:37 | ", " | LocalDataFlow.cs:130:22:130:71 | call to method Join | | LocalDataFlow.cs:130:40:130:70 | array creation of type String[] | LocalDataFlow.cs:130:22:130:71 | call to method Join | | LocalDataFlow.cs:130:53:130:70 | { ..., ... } | LocalDataFlow.cs:130:40:130:70 | array creation of type String[] | @@ -175,63 +192,74 @@ | LocalDataFlow.cs:130:67:130:68 | "" | LocalDataFlow.cs:130:53:130:70 | { ..., ... } | | LocalDataFlow.cs:131:15:131:20 | [post] access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | +| LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | LocalDataFlow.cs:133:15:133:20 | access to local variable sink52 | | LocalDataFlow.cs:132:22:132:23 | "" | LocalDataFlow.cs:132:22:132:41 | call to method Insert | -| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | +| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | LocalDataFlow.cs:132:22:132:41 | call to method Insert | +| LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | LocalDataFlow.cs:137:15:137:22 | access to local variable nonSink2 | -| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | +| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | | LocalDataFlow.cs:136:32:136:39 | [post] access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | LocalDataFlow.cs:136:20:136:40 | call to method Parse | | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | LocalDataFlow.cs:139:15:139:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | +| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | | LocalDataFlow.cs:138:39:138:46 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | LocalDataFlow.cs:138:24:138:61 | call to method TryParse | | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:50 | call to method Replace | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | -| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | +| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:50 | call to method Replace | | LocalDataFlow.cs:141:15:141:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | +| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | LocalDataFlow.cs:142:20:142:52 | call to method Format | | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | LocalDataFlow.cs:142:20:142:52 | call to method Format | | LocalDataFlow.cs:143:15:143:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | LocalDataFlow.cs:145:15:145:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | +| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | | LocalDataFlow.cs:144:31:144:38 | [post] access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | LocalDataFlow.cs:144:20:144:39 | call to method Parse | | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | +| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | LocalDataFlow.cs:146:20:146:57 | call to method TryParse | | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | +| LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | LocalDataFlow.cs:149:15:149:23 | access to local variable nonSink14 | -| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | +| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | LocalDataFlow.cs:148:25:148:48 | call to method ToByte | | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | +| LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | +| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | | LocalDataFlow.cs:150:34:150:35 | "" | LocalDataFlow.cs:150:20:150:46 | call to method Concat | | LocalDataFlow.cs:150:38:150:45 | (...) ... | LocalDataFlow.cs:150:20:150:46 | call to method Concat | | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | (...) ... | | LocalDataFlow.cs:151:15:151:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | LocalDataFlow.cs:152:20:152:40 | call to method Copy | | LocalDataFlow.cs:153:15:153:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | +| LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | +| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | | LocalDataFlow.cs:154:32:154:35 | ", " | LocalDataFlow.cs:154:20:154:71 | call to method Join | | LocalDataFlow.cs:154:38:154:70 | array creation of type String[] | LocalDataFlow.cs:154:20:154:71 | call to method Join | | LocalDataFlow.cs:154:51:154:70 | { ..., ... } | LocalDataFlow.cs:154:38:154:70 | array creation of type String[] | @@ -240,116 +268,139 @@ | LocalDataFlow.cs:154:67:154:68 | "" | LocalDataFlow.cs:154:51:154:70 | { ..., ... } | | LocalDataFlow.cs:155:15:155:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | +| LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | | LocalDataFlow.cs:156:20:156:21 | "" | LocalDataFlow.cs:156:20:156:41 | call to method Insert | -| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | LocalDataFlow.cs:156:20:156:41 | call to method Insert | | LocalDataFlow.cs:157:15:157:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | | LocalDataFlow.cs:160:22:160:27 | access to local variable sink15 | LocalDataFlow.cs:160:22:160:32 | ... > ... | -| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | +| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | LocalDataFlow.cs:174:22:174:27 | access to local variable sink20 | +| LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | LocalDataFlow.cs:163:15:163:20 | access to local variable sink21 | | LocalDataFlow.cs:162:22:162:26 | [post] access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | LocalDataFlow.cs:162:22:162:40 | call to method Equals | | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | -| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | +| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | +| LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | LocalDataFlow.cs:165:15:165:20 | access to local variable sink22 | | LocalDataFlow.cs:164:22:164:26 | [post] access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | LocalDataFlow.cs:164:22:164:45 | call to method Equals | | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | -| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | +| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | | LocalDataFlow.cs:164:43:164:44 | 41 | LocalDataFlow.cs:164:35:164:44 | (...) ... | +| LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | LocalDataFlow.cs:169:15:169:22 | access to local variable nonSink7 | | LocalDataFlow.cs:168:20:168:24 | [post] access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | -| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | +| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | | LocalDataFlow.cs:168:33:168:37 | [post] access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | +| LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | +| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | LocalDataFlow.cs:178:20:178:27 | access to local variable nonSink7 | +| LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | LocalDataFlow.cs:175:15:175:20 | access to local variable sink25 | | LocalDataFlow.cs:174:22:174:27 | access to local variable sink20 | LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | -| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | +| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | | LocalDataFlow.cs:174:32:174:36 | false | LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | +| LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink7 | | LocalDataFlow.cs:178:20:178:27 | access to local variable nonSink7 | LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | -| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | +| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | | LocalDataFlow.cs:178:32:178:36 | false | LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | +| LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | -| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | +| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | | LocalDataFlow.cs:183:15:183:20 | [post] access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | +| LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | LocalDataFlow.cs:185:15:185:20 | access to local variable sink27 | | LocalDataFlow.cs:184:22:184:27 | [post] access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | LocalDataFlow.cs:184:22:184:38 | call to method ToString | | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | -| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | +| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | +| LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | LocalDataFlow.cs:187:15:187:20 | access to local variable sink28 | | LocalDataFlow.cs:186:22:186:27 | [post] access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | -| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | +| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | +| LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | LocalDataFlow.cs:189:15:189:20 | access to local variable sink29 | | LocalDataFlow.cs:188:22:188:27 | [post] access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | LocalDataFlow.cs:188:22:188:33 | access to property Query | | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | -| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | +| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | +| LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | -| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | +| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | [post] access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | +| LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | -| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | +| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | | LocalDataFlow.cs:195:15:195:22 | [post] access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | +| LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | LocalDataFlow.cs:197:15:197:22 | access to local variable nonSink0 | | LocalDataFlow.cs:196:20:196:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:38 | call to method ToString | | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | LocalDataFlow.cs:199:15:199:22 | access to local variable nonSink0 | | LocalDataFlow.cs:198:20:198:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | LocalDataFlow.cs:201:15:201:22 | access to local variable nonSink0 | | LocalDataFlow.cs:200:20:200:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:33 | access to property Query | | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | +| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | -| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | +| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | +| LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | -| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | +| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | | LocalDataFlow.cs:207:15:207:20 | [post] access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | +| LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | -| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | +| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | [post] access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | +| LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | -| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | +| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | | LocalDataFlow.cs:213:15:213:22 | [post] access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | +| LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | -| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | -| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | +| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | LocalDataFlow.cs:218:30:218:48 | call to method Substring | | LocalDataFlow.cs:218:30:218:48 | call to method Substring | LocalDataFlow.cs:218:30:218:67 | call to method ToLowerInvariant | | LocalDataFlow.cs:218:30:218:67 | call to method ToLowerInvariant | LocalDataFlow.cs:218:30:218:77 | call to method ToUpper | @@ -362,14 +413,16 @@ | LocalDataFlow.cs:218:117:218:118 | "" | LocalDataFlow.cs:218:30:218:119 | call to method Insert | | LocalDataFlow.cs:219:15:219:20 | [post] access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | +| LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | LocalDataFlow.cs:221:15:221:20 | access to local variable sink48 | | LocalDataFlow.cs:220:22:220:27 | [post] access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | LocalDataFlow.cs:220:22:220:39 | call to method Normalize | | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | | LocalDataFlow.cs:220:22:220:39 | call to method Normalize | LocalDataFlow.cs:220:22:220:52 | call to method Remove | -| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | +| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | +| LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | +| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:48 | call to method Substring | | LocalDataFlow.cs:224:28:224:48 | call to method Substring | LocalDataFlow.cs:224:28:224:67 | call to method ToLowerInvariant | | LocalDataFlow.cs:224:28:224:67 | call to method ToLowerInvariant | LocalDataFlow.cs:224:28:224:77 | call to method ToUpper | @@ -382,40 +435,46 @@ | LocalDataFlow.cs:224:117:224:118 | "" | LocalDataFlow.cs:224:28:224:119 | call to method Insert | | LocalDataFlow.cs:225:15:225:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | +| LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | LocalDataFlow.cs:227:15:227:23 | access to local variable nonSink15 | | LocalDataFlow.cs:226:25:226:32 | [post] access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:44 | call to method Normalize | | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | | LocalDataFlow.cs:226:25:226:44 | call to method Normalize | LocalDataFlow.cs:226:25:226:57 | call to method Remove | -| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | +| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | +| LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | -| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | +| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | | LocalDataFlow.cs:231:15:231:20 | [post] access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | +| LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | LocalDataFlow.cs:232:22:232:38 | call to method ToString | -| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | +| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | [post] access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | +| LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | -| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | +| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | | LocalDataFlow.cs:234:40:234:41 | "" | LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | | LocalDataFlow.cs:235:9:235:14 | [post] access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:235:9:235:33 | call to method AppendLine | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | LocalDataFlow.cs:235:9:235:14 | [post] access to local variable sink36 | | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | LocalDataFlow.cs:235:9:235:33 | call to method AppendLine | +| LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | -| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | +| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | | LocalDataFlow.cs:240:15:240:23 | [post] access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | +| LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | | LocalDataFlow.cs:241:20:241:28 | [post] access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:39 | call to method ToString | | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | -| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:243:9:243:17 | [post] access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | @@ -423,16 +482,19 @@ | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | LocalDataFlow.cs:243:9:243:17 | [post] access to local variable nonSink10 | | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | LocalDataFlow.cs:243:9:243:38 | call to method AppendLine | +| LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AList) | LocalDataFlow.cs:250:22:250:46 | access to property AList | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AString) | LocalDataFlow.cs:248:22:248:48 | access to property AString | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AnInt) | LocalDataFlow.cs:257:20:257:44 | access to property AnInt | -| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | +| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | +| LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | LocalDataFlow.cs:249:15:249:20 | access to local variable sink53 | | LocalDataFlow.cs:248:22:248:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | LocalDataFlow.cs:248:22:248:48 | access to property AString | | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | -| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | +| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | +| LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | LocalDataFlow.cs:251:15:251:20 | access to local variable sink54 | | LocalDataFlow.cs:250:22:250:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:46 | access to property AList | @@ -441,113 +503,143 @@ | LocalDataFlow.cs:250:22:250:46 | access to property AList | LocalDataFlow.cs:250:22:250:49 | access to indexer | | LocalDataFlow.cs:250:22:250:46 | access to property AList | LocalDataFlow.cs:259:20:259:44 | access to property AList | | LocalDataFlow.cs:250:22:250:49 | access to indexer | LocalDataFlow.cs:250:22:250:57 | access to property AString | -| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | +| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | +| LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | LocalDataFlow.cs:255:20:255:41 | access to local variable nonTaintedDataContract | | LocalDataFlow.cs:254:13:254:55 | SSA qualifier def(nonTaintedDataContract.AString) | LocalDataFlow.cs:255:20:255:49 | access to property AString | -| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | +| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | +| LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | LocalDataFlow.cs:256:15:256:22 | access to local variable nonSink0 | | LocalDataFlow.cs:255:20:255:41 | access to local variable nonTaintedDataContract | LocalDataFlow.cs:255:20:255:49 | access to property AString | -| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | +| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | LocalDataFlow.cs:258:15:258:22 | access to local variable nonSink2 | | LocalDataFlow.cs:257:20:257:38 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | -| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | +| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | LocalDataFlow.cs:260:15:260:22 | access to local variable nonSink2 | | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:44 | access to property AList | | LocalDataFlow.cs:259:20:259:44 | access to property AList | LocalDataFlow.cs:259:20:259:47 | access to indexer | -| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | +| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | LocalDataFlow.cs:264:22:264:35 | access to local variable taintedTextBox | | LocalDataFlow.cs:263:17:263:37 | SSA qualifier def(taintedTextBox.Text) | LocalDataFlow.cs:264:22:264:40 | access to property Text | -| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | +| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | +| LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | LocalDataFlow.cs:265:15:265:20 | access to local variable sink60 | | LocalDataFlow.cs:264:22:264:35 | access to local variable taintedTextBox | LocalDataFlow.cs:264:22:264:40 | access to property Text | -| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | +| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | +| LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | LocalDataFlow.cs:269:20:269:36 | access to local variable nonTaintedTextBox | | LocalDataFlow.cs:268:17:268:40 | SSA qualifier def(nonTaintedTextBox.Text) | LocalDataFlow.cs:269:20:269:41 | access to property Text | -| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | +| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | +| LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | | LocalDataFlow.cs:269:20:269:36 | access to local variable nonTaintedTextBox | LocalDataFlow.cs:269:20:269:41 | access to property Text | -| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | LocalDataFlow.cs:274:15:274:20 | access to local variable sink69 | -| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | +| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | | LocalDataFlow.cs:273:24:273:28 | "test " | LocalDataFlow.cs:273:22:273:36 | $"..." | | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | LocalDataFlow.cs:273:22:273:36 | $"..." | +| LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | +| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | | LocalDataFlow.cs:277:22:277:26 | "test " | LocalDataFlow.cs:277:20:277:37 | $"..." | | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | LocalDataFlow.cs:277:20:277:37 | $"..." | | LocalDataFlow.cs:278:15:278:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | -| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | +| LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | +| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | +| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | ... = ... | -| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | | LocalDataFlow.cs:282:15:282:20 | [post] access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | +| LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:27 | access to local variable nonSink0 | | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:38 | ... = ... | | LocalDataFlow.cs:286:15:286:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | -| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | String sink71 | | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | LocalDataFlow.cs:290:19:290:24 | access to local variable sink71 | -| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:289:23:289:35 | String sink71 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | String nonSink16 | | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | LocalDataFlow.cs:294:19:294:27 | access to local variable nonSink16 | -| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:293:25:293:40 | String nonSink16 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | String sink72 | | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | LocalDataFlow.cs:300:23:300:28 | access to local variable sink72 | -| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:299:18:299:30 | String sink72 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | String nonSink17 | | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | LocalDataFlow.cs:308:23:308:31 | access to local variable nonSink17 | +| LocalDataFlow.cs:307:18:307:33 | String nonSink17 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | LocalDataFlow.cs:315:15:315:20 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | -| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | +| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | +| LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | LocalDataFlow.cs:316:15:316:20 | access to local variable sink74 | | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | -| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | +| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | | LocalDataFlow.cs:334:28:334:30 | SSA entry def(this.anInt) | LocalDataFlow.cs:334:41:334:45 | access to field anInt | | LocalDataFlow.cs:334:28:334:30 | this | LocalDataFlow.cs:334:41:334:45 | this access | | LocalDataFlow.cs:334:50:334:52 | this | LocalDataFlow.cs:334:56:334:60 | this access | | LocalDataFlow.cs:334:50:334:52 | value | LocalDataFlow.cs:334:64:334:68 | access to parameter value | +| LocalDataFlow.cs:334:64:334:68 | access to parameter value | LocalDataFlow.cs:334:56:334:60 | access to field anInt | | LocalDataFlow.cs:340:41:340:47 | tainted | LocalDataFlow.cs:342:15:342:21 | access to parameter tainted | | LocalDataFlow.cs:345:44:345:53 | nonTainted | LocalDataFlow.cs:347:15:347:24 | access to parameter nonTainted | | LocalDataFlow.cs:350:44:350:44 | x | LocalDataFlow.cs:353:21:353:21 | access to parameter x | | LocalDataFlow.cs:350:67:350:68 | os | LocalDataFlow.cs:356:33:356:34 | access to parameter os | +| LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:17 | access to local variable x1 | | LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:21 | ... = ... | +| LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:29 | access to local variable os2 | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:34 | ... = ... | | LocalDataFlow.cs:361:41:361:44 | args | LocalDataFlow.cs:363:29:363:32 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | [post] access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | | LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | +| LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | LocalDataFlow.cs:363:22:363:25 | access to local variable span | +| LocalDataFlow.cs:364:27:364:30 | call to operator implicit conversion | LocalDataFlow.cs:364:23:364:23 | access to local variable x | | LocalDataFlow.cs:367:23:367:24 | b1 | LocalDataFlow.cs:371:13:371:14 | access to parameter b1 | | LocalDataFlow.cs:367:32:367:33 | b2 | LocalDataFlow.cs:374:17:374:18 | access to parameter b2 | +| LocalDataFlow.cs:369:17:369:18 | "" | LocalDataFlow.cs:369:13:369:13 | access to local variable x | +| LocalDataFlow.cs:373:13:373:13 | access to local variable x | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:376:35:376:35 | access to local variable x | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | +| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:13 | access to local variable x | +| LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | +| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x | | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x | | SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S | | SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access | | SSA.cs:5:26:5:32 | tainted | SSA.cs:8:24:8:30 | access to parameter tainted | | SSA.cs:5:42:5:51 | nonTainted | SSA.cs:12:24:12:33 | access to parameter nonTainted | +| SSA.cs:8:13:8:20 | access to local variable ssaSink0 | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | -| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | +| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:20 | access to local variable ssaSink0 | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:58:27:58:33 | access to parameter tainted | | SSA.cs:9:15:9:22 | [post] access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | +| SSA.cs:12:13:12:20 | access to local variable nonSink0 | SSA.cs:12:13:12:33 | SSA def(nonSink0) | | SSA.cs:12:13:12:33 | SSA def(nonSink0) | SSA.cs:13:15:13:22 | access to local variable nonSink0 | -| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:33 | SSA def(nonSink0) | +| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:20 | access to local variable nonSink0 | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:23:13:23:22 | access to parameter nonTainted | | SSA.cs:13:15:13:22 | [post] access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | | SSA.cs:13:15:13:22 | access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | @@ -559,38 +651,44 @@ | SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | +| SSA.cs:22:16:22:23 | access to local variable ssaSink1 | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | +| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:23 | access to local variable ssaSink1 | | SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:29 | access to property Length | SSA.cs:23:13:23:33 | ... > ... | +| SSA.cs:24:13:24:20 | access to local variable ssaSink1 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | +| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:20 | access to local variable ssaSink1 | | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 | +| SSA.cs:28:16:28:23 | access to local variable nonSink1 | SSA.cs:28:16:28:28 | SSA def(nonSink1) | | SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:28 | SSA def(nonSink1) | +| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:23 | access to local variable nonSink1 | | SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:29 | access to property Length | SSA.cs:29:13:29:33 | ... > ... | +| SSA.cs:30:13:30:20 | access to local variable nonSink1 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | | SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | +| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:20 | access to local variable nonSink1 | | SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:49:24:49:31 | access to local variable nonSink0 | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 | +| SSA.cs:34:16:34:23 | access to local variable ssaSink2 | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | -| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | +| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:23 | access to local variable ssaSink2 | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:35:13:35:29 | access to property Length | SSA.cs:35:13:35:33 | ... > ... | +| SSA.cs:37:13:37:20 | access to local variable ssaSink2 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:39:21:39:28 | access to local variable ssaSink2 | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:41:21:41:28 | access to local variable ssaSink2 | -| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | +| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:20 | access to local variable ssaSink2 | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:38:17:38:26 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | @@ -603,16 +701,18 @@ | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 | +| SSA.cs:46:16:46:23 | access to local variable nonSink2 | SSA.cs:46:16:46:28 | SSA def(nonSink2) | | SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | -| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:28 | SSA def(nonSink2) | +| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:23 | access to local variable nonSink2 | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:47:13:47:29 | access to property Length | SSA.cs:47:13:47:33 | ... > ... | +| SSA.cs:49:13:49:20 | access to local variable nonSink2 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:51:21:51:28 | access to local variable nonSink2 | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 | -| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | +| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:20 | access to local variable nonSink2 | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:50:17:50:26 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | @@ -624,21 +724,25 @@ | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 | +| SSA.cs:58:16:58:23 | access to local variable ssaSink3 | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | -| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | +| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:23 | access to local variable ssaSink3 | | SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:67:32:67:38 | access to parameter tainted | | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | SSA.cs:60:15:60:22 | access to local variable ssaSink3 | | SSA.cs:59:23:59:30 | [post] access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | +| SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:63:23:63:30 | SSA def(nonSink0) | SSA.cs:64:15:64:22 | access to local variable nonSink0 | | SSA.cs:63:23:63:30 | [post] access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | +| SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:67:9:67:12 | [post] this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:12 | this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:14 | [post] access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:14 | access to field S | SSA.cs:68:23:68:28 | access to field S | +| SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | -| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | +| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | | SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:77:20:77:26 | access to parameter tainted | | SSA.cs:68:23:68:26 | [post] this access | SSA.cs:69:15:69:18 | this access | | SSA.cs:68:23:68:26 | this access | SSA.cs:69:15:69:18 | this access | @@ -646,6 +750,7 @@ | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | SSA.cs:69:15:69:34 | access to field SsaFieldSink0 | | SSA.cs:68:23:68:28 | [post] access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | +| SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:69:15:69:18 | [post] this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:18 | this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:20 | [post] access to field S | SSA.cs:72:9:72:14 | access to field S | @@ -654,22 +759,26 @@ | SSA.cs:72:9:72:12 | this access | SSA.cs:73:23:73:26 | this access | | SSA.cs:72:9:72:14 | [post] access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:14 | access to field S | SSA.cs:73:23:73:28 | access to field S | +| SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | -| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:26 | [post] this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:26 | this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:28 | SSA def(this.S) | SSA.cs:74:15:74:20 | access to field S | | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:74:15:74:37 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:28 | [post] access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | +| SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:74:15:74:18 | [post] this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:18 | this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:20 | [post] access to field S | SSA.cs:80:9:80:14 | access to field S | | SSA.cs:74:15:74:20 | access to field S | SSA.cs:80:9:80:14 | access to field S | +| SSA.cs:77:9:77:16 | access to local variable nonSink0 | SSA.cs:77:9:77:26 | SSA def(nonSink0) | | SSA.cs:77:9:77:26 | SSA def(nonSink0) | SSA.cs:78:21:78:28 | access to local variable nonSink0 | -| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:26 | SSA def(nonSink0) | +| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:16 | access to local variable nonSink0 | | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:80:35:80:41 | access to parameter tainted | | SSA.cs:78:21:78:28 | SSA def(nonSink0) | SSA.cs:79:15:79:22 | access to local variable nonSink0 | +| SSA.cs:78:21:78:28 | access to local variable nonSink0 | SSA.cs:78:21:78:28 | SSA def(nonSink0) | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | @@ -678,18 +787,21 @@ | SSA.cs:80:9:80:12 | this access | SSA.cs:81:21:81:24 | this access | | SSA.cs:80:9:80:14 | [post] access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:9:80:14 | access to field S | SSA.cs:81:21:81:26 | access to field S | +| SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:80:9:80:31 | access to field SsaFieldNonSink0 | | SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:83:35:83:41 | access to parameter tainted | | SSA.cs:81:21:81:24 | [post] this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:24 | this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:26 | SSA def(this.S) | SSA.cs:82:15:82:20 | access to field S | | SSA.cs:81:21:81:26 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:82:15:82:37 | access to field SsaFieldNonSink0 | +| SSA.cs:81:21:81:26 | access to field S | SSA.cs:81:21:81:26 | SSA def(this.S) | | SSA.cs:82:15:82:18 | [post] this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:18 | this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:20 | [post] access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:82:15:82:20 | access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:83:9:83:12 | [post] this access | SSA.cs:84:9:84:14 | this access | | SSA.cs:83:9:83:12 | this access | SSA.cs:84:9:84:14 | this access | -| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | SSA call def(this.S) | SSA.cs:85:15:85:20 | access to field S | | SSA.cs:84:9:84:14 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:85:15:85:37 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | [post] this access | SSA.cs:85:15:85:18 | this access | @@ -698,16 +810,18 @@ | SSA.cs:85:15:85:18 | this access | SSA.cs:114:9:114:12 | this access | | SSA.cs:85:15:85:20 | [post] access to field S | SSA.cs:114:9:114:14 | access to field S | | SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S | +| SSA.cs:88:16:88:23 | access to local variable ssaSink4 | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | -| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | +| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:23 | access to local variable ssaSink4 | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:89:13:89:29 | access to property Length | SSA.cs:89:13:89:33 | ... > ... | +| SSA.cs:91:13:91:20 | access to local variable ssaSink4 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:93:21:93:28 | access to local variable ssaSink4 | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 | -| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | +| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:20 | access to local variable ssaSink4 | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:92:17:92:26 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | @@ -722,16 +836,19 @@ | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | SSA.cs:98:15:98:22 | access to local variable ssaSink4 | | SSA.cs:97:23:97:30 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | | SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:101:16:101:23 | access to local variable nonSink3 | SSA.cs:101:16:101:28 | SSA def(nonSink3) | | SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | -| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:28 | SSA def(nonSink3) | +| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:23 | access to local variable nonSink3 | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:102:13:102:29 | access to property Length | SSA.cs:102:13:102:33 | ... > ... | +| SSA.cs:104:13:104:20 | access to local variable nonSink3 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:106:21:106:28 | access to local variable nonSink3 | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 | -| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | +| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:20 | access to local variable nonSink3 | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:105:17:105:26 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | @@ -746,6 +863,7 @@ | SSA.cs:110:23:110:30 | SSA def(nonSink3) | SSA.cs:111:15:111:22 | access to local variable nonSink3 | | SSA.cs:110:23:110:30 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | +| SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:117:13:117:16 | this access | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:123:23:123:26 | this access | | SSA.cs:114:9:114:12 | this access | SSA.cs:117:13:117:16 | this access | @@ -754,8 +872,9 @@ | SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | +| SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | -| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | @@ -769,9 +888,10 @@ | SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:119:21:119:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:121:21:121:26 | access to field S | +| SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | -| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | | SSA.cs:118:17:118:26 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:118:17:118:33 | access to property Length | SSA.cs:118:17:118:37 | ... > ... | @@ -796,6 +916,7 @@ | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) | SSA.cs:124:15:124:34 | access to field SsaFieldSink1 | | SSA.cs:123:23:123:28 | [post] access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | +| SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:124:15:124:18 | [post] this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:18 | this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:20 | [post] access to field S | SSA.cs:127:9:127:14 | access to field S | @@ -808,8 +929,9 @@ | SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | +| SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | -| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | | SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:29 | access to property Length | SSA.cs:128:13:128:33 | ... > ... | @@ -821,9 +943,10 @@ | SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:132:21:132:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:134:21:134:26 | access to field S | +| SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | -| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | | SSA.cs:131:17:131:33 | access to property Length | SSA.cs:131:17:131:37 | ... > ... | | SSA.cs:132:21:132:24 | [post] this access | SSA.cs:136:23:136:26 | this access | | SSA.cs:132:21:132:24 | this access | SSA.cs:136:23:136:26 | this access | @@ -845,32 +968,41 @@ | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:137:15:137:37 | access to field SsaFieldNonSink0 | | SSA.cs:136:23:136:28 | [post] access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | +| SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:144:34:144:34 | t | SSA.cs:146:13:146:13 | access to parameter t | | SSA.cs:146:13:146:13 | (...) ... | SSA.cs:146:13:146:21 | ... == ... | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:146:13:146:13 | (...) ... | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:149:17:149:17 | access to parameter t | +| SSA.cs:147:13:147:13 | access to parameter t | SSA.cs:147:13:147:26 | SSA def(t) | | SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:26 | SSA def(t) | +| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:13 | access to parameter t | +| SSA.cs:149:13:149:13 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | | SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | +| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:13 | access to parameter t | | SSA.cs:152:36:152:36 | t | SSA.cs:154:13:154:13 | access to parameter t | | SSA.cs:154:13:154:13 | (...) ... | SSA.cs:154:13:154:21 | ... == ... | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:152:17:152:28 | SSA phi(t) | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:154:13:154:13 | (...) ... | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:155:25:155:25 | access to parameter t | | SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:152:17:152:28 | SSA phi(t) | +| SSA.cs:155:25:155:25 | access to parameter t | SSA.cs:155:25:155:25 | SSA def(t) | | SSA.cs:166:10:166:13 | this | SSA.cs:166:19:166:22 | this access | +| SSA.cs:166:28:166:31 | null | SSA.cs:166:19:166:24 | access to field S | | SSA.cs:168:22:168:28 | tainted | SSA.cs:173:24:173:30 | access to parameter tainted | | SSA.cs:168:35:168:35 | i | SSA.cs:171:13:171:13 | access to parameter i | +| SSA.cs:170:16:170:23 | access to local variable ssaSink5 | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | -| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | +| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:23 | access to local variable ssaSink5 | +| SSA.cs:171:13:171:13 | access to parameter i | SSA.cs:171:13:171:15 | SSA def(i) | | SSA.cs:171:13:171:15 | ...-- | SSA.cs:171:13:171:19 | ... > ... | | SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | +| SSA.cs:173:13:173:20 | access to local variable ssaSink5 | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | -| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | +| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:20 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | | SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i | +| SSA.cs:174:20:174:20 | access to parameter i | SSA.cs:174:20:174:22 | SSA def(i) | | SSA.cs:174:20:174:22 | ...-- | SSA.cs:174:20:174:26 | ... > ... | | SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | | SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | @@ -880,9 +1012,10 @@ | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 | | Splitting.cs:3:18:3:18 | b | Splitting.cs:6:13:6:13 | access to parameter b | | Splitting.cs:3:28:3:34 | tainted | Splitting.cs:5:17:5:23 | access to parameter tainted | +| Splitting.cs:5:13:5:13 | access to local variable x | Splitting.cs:5:13:5:23 | SSA def(x) | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x | -| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:23 | SSA def(x) | +| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:13 | access to local variable x | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b | | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | @@ -892,24 +1025,30 @@ | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:17:18:17:18 | b | Splitting.cs:20:13:20:13 | access to parameter b | +| Splitting.cs:19:13:19:13 | access to local variable x | Splitting.cs:19:13:19:18 | SSA def(x) | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | -| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:18 | SSA def(x) | +| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:13 | access to local variable x | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): false] access to parameter b | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): true] access to parameter b | +| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | -| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | +| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:13 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:32:18:32:18 | b | Splitting.cs:35:13:35:13 | access to parameter b | +| Splitting.cs:34:17:34:18 | "" | Splitting.cs:34:13:34:13 | access to local variable x | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | +| Splitting.cs:36:17:36:19 | [b (line 32): true] "a" | Splitting.cs:36:13:36:13 | access to local variable x | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | -| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | -| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | +| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:9 | access to local variable x | +| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:9 | access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | | Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | @@ -922,19 +1061,25 @@ | Splitting.cs:39:23:39:25 | [b (line 32): false] "c" | Splitting.cs:39:15:39:25 | [b (line 32): false] ... ? ... : ... | | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): false] (...) ... | | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): true] (...) ... | +| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:21 | [b (line 32): false] ... = ... | +| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:21 | [b (line 32): true] ... = ... | | Splitting.cs:46:18:46:18 | b | Splitting.cs:49:13:49:13 | access to parameter b | +| Splitting.cs:48:13:48:13 | access to local variable x | Splitting.cs:48:13:48:18 | SSA def(x) | | Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x | -| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:18 | SSA def(x) | +| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:13 | access to local variable x | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): false] access to parameter b | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): true] access to parameter b | +| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x | -| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | +| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:13 | access to local variable x | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | -| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | -| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | +| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | +| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | | Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | | Splitting.cs:51:30:51:36 | [b (line 46): true] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | | Splitting.cs:51:32:51:34 | [b (line 46): false] "a" | Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | @@ -944,45 +1089,60 @@ | Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | | Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | | Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | +| Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:12 | access to array element | | Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | +| Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:12 | access to array element | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x | Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x | Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | -| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | -| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | +| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | +| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:20 | [b (line 46): false] access to array element | | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:20 | [b (line 46): true] access to array element | | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | | Splitting.cs:53:17:53:20 | [b (line 46): false] access to array element | Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | | Splitting.cs:53:17:53:20 | [b (line 46): true] access to array element | Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z | | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z | | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x | | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x | -| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | -| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | +| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): false] !... | Splitting.cs:55:9:55:9 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): true] !... | Splitting.cs:55:9:55:9 | access to local variable z | | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z | Splitting.cs:55:13:55:14 | [b (line 46): false] !... | | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z | Splitting.cs:55:13:55:14 | [b (line 46): true] !... | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): false] access to local variable x | | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): true] access to local variable x | -| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | -| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | +| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | +| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | | Splitting.cs:56:15:56:15 | [b (line 46): false] "c" | Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | | Splitting.cs:56:15:56:15 | [b (line 46): true] "c" | Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | +| Splitting.cs:57:13:57:24 | [b (line 46): false] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | +| Splitting.cs:57:13:57:24 | [b (line 46): true] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y | | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): false] access to local variable s | | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): true] access to local variable s | | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | | UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop | | UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access | +| UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | @@ -1084,7 +1244,7 @@ | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | -| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | +| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:13 | access to local variable x | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:31:24:34 | this access | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:3193:24:3198 | this access | | UseUseExplosion.cs:24:13:24:16 | access to property Prop | UseUseExplosion.cs:24:13:24:22 | ... > ... | diff --git a/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected b/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected index d55c099ca4f..aabd51826b2 100644 --- a/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected @@ -12,64 +12,88 @@ edges | Operator.cs:21:43:21:43 | y : C | Operator.cs:21:49:21:49 | access to parameter y : C | provenance | | | Operator.cs:22:51:22:51 | y : C | Operator.cs:22:57:22:57 | access to parameter y : C | provenance | | | Operator.cs:22:51:22:51 | y : C | Operator.cs:22:57:22:57 | access to parameter y : C | provenance | | -| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | -| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | +| Operator.cs:27:13:27:13 | access to local variable x : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | +| Operator.cs:27:13:27:13 | access to local variable x : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | +| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:27:13:27:13 | access to local variable x : C | provenance | | +| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:27:13:27:13 | access to local variable x : C | provenance | | +| Operator.cs:29:13:29:13 | access to local variable z : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | +| Operator.cs:29:13:29:13 | access to local variable z : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:29:17:29:21 | call to operator + : C | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:29:17:29:21 | call to operator + : C | provenance | | -| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | -| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | -| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | -| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | +| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:29:13:29:13 | access to local variable z : C | provenance | | +| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:29:13:29:13 | access to local variable z : C | provenance | | +| Operator.cs:35:13:35:13 | access to local variable x : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | +| Operator.cs:35:13:35:13 | access to local variable x : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | +| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:35:13:35:13 | access to local variable x : C | provenance | | +| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:35:13:35:13 | access to local variable x : C | provenance | | +| Operator.cs:37:13:37:13 | access to local variable z : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | +| Operator.cs:37:13:37:13 | access to local variable z : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:19:38:19:38 | x : C | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:19:38:19:38 | x : C | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:37:27:37:31 | call to operator - : C | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:37:27:37:31 | call to operator - : C | provenance | | -| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | -| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | -| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | -| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | -| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | -| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | +| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:37:13:37:13 | access to local variable z : C | provenance | | +| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:37:13:37:13 | access to local variable z : C | provenance | | +| Operator.cs:44:13:44:13 | access to local variable y : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | +| Operator.cs:44:13:44:13 | access to local variable y : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | +| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:44:13:44:13 | access to local variable y : C | provenance | | +| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:44:13:44:13 | access to local variable y : C | provenance | | +| Operator.cs:45:13:45:13 | access to local variable z : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | +| Operator.cs:45:13:45:13 | access to local variable z : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | +| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:45:13:45:13 | access to local variable z : C | provenance | | +| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:45:13:45:13 | access to local variable z : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:18:51:18:51 | y : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:18:51:18:51 | y : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:45:25:45:29 | call to operator checked - : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:45:25:45:29 | call to operator checked - : C | provenance | | | Operator.cs:49:28:49:28 | x : C | Operator.cs:51:17:51:17 | access to parameter x : C | provenance | | | Operator.cs:49:28:49:28 | x : C | Operator.cs:51:17:51:17 | access to parameter x : C | provenance | | +| Operator.cs:51:13:51:13 | access to local variable z : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | +| Operator.cs:51:13:51:13 | access to local variable z : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:9:39:9:39 | x : C | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:9:39:9:39 | x : C | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:51:17:51:21 | call to operator * : C | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:51:17:51:21 | call to operator * : C | provenance | | -| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | -| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | -| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | -| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | +| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:51:13:51:13 | access to local variable z : C | provenance | | +| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:51:13:51:13 | access to local variable z : C | provenance | | +| Operator.cs:57:13:57:13 | access to local variable x : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | +| Operator.cs:57:13:57:13 | access to local variable x : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | +| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:57:13:57:13 | access to local variable x : C | provenance | | +| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:57:13:57:13 | access to local variable x : C | provenance | | | Operator.cs:59:15:59:15 | access to local variable x : C | Operator.cs:49:28:49:28 | x : C | provenance | | | Operator.cs:59:15:59:15 | access to local variable x : C | Operator.cs:49:28:49:28 | x : C | provenance | | | Operator.cs:62:33:62:33 | y : C | Operator.cs:64:21:64:21 | access to parameter y : C | provenance | | | Operator.cs:62:33:62:33 | y : C | Operator.cs:64:21:64:21 | access to parameter y : C | provenance | | -| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | -| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | +| Operator.cs:64:13:64:13 | access to local variable z : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | +| Operator.cs:64:13:64:13 | access to local variable z : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | +| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:64:13:64:13 | access to local variable z : C | provenance | | +| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:64:13:64:13 | access to local variable z : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:21:43:21:43 | y : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:21:43:21:43 | y : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:64:17:64:21 | call to operator / : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:64:17:64:21 | call to operator / : C | provenance | | -| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | -| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | +| Operator.cs:71:13:71:13 | access to local variable y : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | +| Operator.cs:71:13:71:13 | access to local variable y : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | +| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:71:13:71:13 | access to local variable y : C | provenance | | +| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:71:13:71:13 | access to local variable y : C | provenance | | | Operator.cs:72:18:72:18 | access to local variable y : C | Operator.cs:62:33:62:33 | y : C | provenance | | | Operator.cs:72:18:72:18 | access to local variable y : C | Operator.cs:62:33:62:33 | y : C | provenance | | | Operator.cs:75:33:75:33 | y : C | Operator.cs:77:29:77:29 | access to parameter y : C | provenance | | | Operator.cs:75:33:75:33 | y : C | Operator.cs:77:29:77:29 | access to parameter y : C | provenance | | -| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | -| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | +| Operator.cs:77:13:77:13 | access to local variable z : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | +| Operator.cs:77:13:77:13 | access to local variable z : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | +| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:77:13:77:13 | access to local variable z : C | provenance | | +| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:77:13:77:13 | access to local variable z : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:22:51:22:51 | y : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:22:51:22:51 | y : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:77:25:77:29 | call to operator checked / : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:77:25:77:29 | call to operator checked / : C | provenance | | -| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | -| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | +| Operator.cs:84:13:84:13 | access to local variable y : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | +| Operator.cs:84:13:84:13 | access to local variable y : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | +| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:84:13:84:13 | access to local variable y : C | provenance | | +| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:84:13:84:13 | access to local variable y : C | provenance | | | Operator.cs:85:18:85:18 | access to local variable y : C | Operator.cs:75:33:75:33 | y : C | provenance | | | Operator.cs:85:18:85:18 | access to local variable y : C | Operator.cs:75:33:75:33 | y : C | provenance | | nodes @@ -97,24 +121,36 @@ nodes | Operator.cs:22:51:22:51 | y : C | semmle.label | y : C | | Operator.cs:22:57:22:57 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:22:57:22:57 | access to parameter y : C | semmle.label | access to parameter y : C | +| Operator.cs:27:13:27:13 | access to local variable x : C | semmle.label | access to local variable x : C | +| Operator.cs:27:13:27:13 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:27:17:27:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:27:17:27:28 | call to method Source : C | semmle.label | call to method Source : C | +| Operator.cs:29:13:29:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:29:13:29:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:29:17:29:17 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:29:17:29:17 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:29:17:29:21 | call to operator + : C | semmle.label | call to operator + : C | | Operator.cs:29:17:29:21 | call to operator + : C | semmle.label | call to operator + : C | | Operator.cs:30:14:30:14 | access to local variable z | semmle.label | access to local variable z | | Operator.cs:30:14:30:14 | access to local variable z | semmle.label | access to local variable z | +| Operator.cs:35:13:35:13 | access to local variable x : C | semmle.label | access to local variable x : C | +| Operator.cs:35:13:35:13 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:35:17:35:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:35:17:35:28 | call to method Source : C | semmle.label | call to method Source : C | +| Operator.cs:37:13:37:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:37:13:37:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:37:27:37:27 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:37:27:37:27 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:37:27:37:31 | call to operator - : C | semmle.label | call to operator - : C | | Operator.cs:37:27:37:31 | call to operator - : C | semmle.label | call to operator - : C | | Operator.cs:38:14:38:14 | access to local variable z | semmle.label | access to local variable z | | Operator.cs:38:14:38:14 | access to local variable z | semmle.label | access to local variable z | +| Operator.cs:44:13:44:13 | access to local variable y : C | semmle.label | access to local variable y : C | +| Operator.cs:44:13:44:13 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:44:17:44:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:44:17:44:28 | call to method Source : C | semmle.label | call to method Source : C | +| Operator.cs:45:13:45:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:45:13:45:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:45:25:45:29 | call to operator checked - : C | semmle.label | call to operator checked - : C | | Operator.cs:45:25:45:29 | call to operator checked - : C | semmle.label | call to operator checked - : C | | Operator.cs:45:29:45:29 | access to local variable y : C | semmle.label | access to local variable y : C | @@ -123,36 +159,48 @@ nodes | Operator.cs:46:14:46:14 | access to local variable z | semmle.label | access to local variable z | | Operator.cs:49:28:49:28 | x : C | semmle.label | x : C | | Operator.cs:49:28:49:28 | x : C | semmle.label | x : C | +| Operator.cs:51:13:51:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:51:13:51:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:51:17:51:17 | access to parameter x : C | semmle.label | access to parameter x : C | | Operator.cs:51:17:51:17 | access to parameter x : C | semmle.label | access to parameter x : C | | Operator.cs:51:17:51:21 | call to operator * : C | semmle.label | call to operator * : C | | Operator.cs:51:17:51:21 | call to operator * : C | semmle.label | call to operator * : C | | Operator.cs:52:14:52:14 | (...) ... | semmle.label | (...) ... | | Operator.cs:52:14:52:14 | (...) ... | semmle.label | (...) ... | +| Operator.cs:57:13:57:13 | access to local variable x : C | semmle.label | access to local variable x : C | +| Operator.cs:57:13:57:13 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:57:17:57:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:57:17:57:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:59:15:59:15 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:59:15:59:15 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:62:33:62:33 | y : C | semmle.label | y : C | | Operator.cs:62:33:62:33 | y : C | semmle.label | y : C | +| Operator.cs:64:13:64:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:64:13:64:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:64:17:64:21 | call to operator / : C | semmle.label | call to operator / : C | | Operator.cs:64:17:64:21 | call to operator / : C | semmle.label | call to operator / : C | | Operator.cs:64:21:64:21 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:64:21:64:21 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:65:14:65:14 | (...) ... | semmle.label | (...) ... | | Operator.cs:65:14:65:14 | (...) ... | semmle.label | (...) ... | +| Operator.cs:71:13:71:13 | access to local variable y : C | semmle.label | access to local variable y : C | +| Operator.cs:71:13:71:13 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:71:17:71:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:71:17:71:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:72:18:72:18 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:72:18:72:18 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:75:33:75:33 | y : C | semmle.label | y : C | | Operator.cs:75:33:75:33 | y : C | semmle.label | y : C | +| Operator.cs:77:13:77:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:77:13:77:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:77:25:77:29 | call to operator checked / : C | semmle.label | call to operator checked / : C | | Operator.cs:77:25:77:29 | call to operator checked / : C | semmle.label | call to operator checked / : C | | Operator.cs:77:29:77:29 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:77:29:77:29 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:78:14:78:14 | (...) ... | semmle.label | (...) ... | | Operator.cs:78:14:78:14 | (...) ... | semmle.label | (...) ... | +| Operator.cs:84:13:84:13 | access to local variable y : C | semmle.label | access to local variable y : C | +| Operator.cs:84:13:84:13 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:84:17:84:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:84:17:84:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:85:18:85:18 | access to local variable y : C | semmle.label | access to local variable y : C | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected index 8cb16972603..05e1e3d3a5c 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected @@ -1,12 +1,6 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | i | Capture.cs:8:17:8:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | ... = ... | Capture.cs:14:17:14:17 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | Int32 x = ... | Capture.cs:34:13:34:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | ... = ... | Capture.cs:16:17:16:17 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | ... = ... | Capture.cs:44:11:44:11 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | Action a = ... | Capture.cs:38:9:38:9 | access to local variable a | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | Int32 y = ... | Capture.cs:26:17:26:17 | access to local variable y | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | Action b = ... | Capture.cs:25:13:25:13 | access to local variable b | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | ... = ... | Capture.cs:41:13:41:13 | access to local variable z | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | Action c = ... | Capture.cs:32:9:32:9 | access to local variable c | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | Action b = ... | Capture.cs:53:9:53:9 | access to local variable b | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | strings | Capture.cs:61:9:61:15 | access to parameter strings | @@ -21,22 +15,15 @@ | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | Expression> e = ... | Capture.cs:87:23:87:23 | access to local variable e | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | d | Capture.cs:92:24:92:24 | access to parameter d | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | Int32 x = ... | Capture.cs:99:20:99:20 | access to local variable x | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | ... = ... | Capture.cs:106:20:106:20 | access to local variable z | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | Int32 x = ... | Capture.cs:118:17:118:17 | access to local variable x | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | ... = ... | Capture.cs:126:17:126:17 | access to local variable b | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | ... = ... | Capture.cs:134:17:134:17 | access to local variable c | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | Int32 f = ... | Capture.cs:155:13:155:13 | access to local variable f | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | MyEventHandler eh = ... | Capture.cs:199:27:199:28 | access to local variable eh | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | MyEventHandler eh2 = ... | Capture.cs:204:27:204:29 | access to local variable eh2 | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | Process p = ... | Capture.cs:213:17:213:17 | access to local variable p | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | EventHandler exited = ... | Capture.cs:213:29:213:34 | access to local variable exited | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | Int32 i = ... | Capture.cs:254:27:254:27 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | access to local variable i | Capture.cs:255:34:255:34 | access to local variable i | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | b | Consistency.cs:11:17:11:17 | access to parameter b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | Int32 i = ... | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | Consistency c | Consistency.cs:26:13:26:13 | access to local variable c | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | ... = ... | Consistency.cs:33:9:33:9 | access to parameter c | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | ... = ... | Consistency.cs:39:39:39:39 | access to local variable i | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | S s | Consistency.cs:45:9:45:9 | access to local variable s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:47:49:47 | access to parameter a | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:49:49:49 | access to parameter i | @@ -51,11 +38,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:44:13:44:17 | Int32 z = ... | DefUse.cs:45:13:45:13 | access to local variable z | | DefUse.cs:44:13:44:13 | z | DefUse.cs:47:23:47:23 | access to local variable z | DefUse.cs:48:13:48:13 | access to local variable z | | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | access to local variable z | DefUse.cs:51:13:51:13 | access to local variable z | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | Int32 i = ... | DefUse.cs:61:13:61:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | ... = ... | DefUse.cs:72:9:72:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | ...++ | DefUse.cs:73:13:73:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | ... = ... | DefUse.cs:76:9:76:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | ...-- | DefUse.cs:77:13:77:13 | access to local variable i | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | TestClass tc = ... | DefUse.cs:68:9:68:10 | access to local variable tc | | DefUse.cs:79:13:79:14 | x1 | DefUse.cs:80:30:80:31 | access to local variable x1 | DefUse.cs:81:13:81:14 | access to local variable x1 | | DefUse.cs:83:13:83:14 | x2 | DefUse.cs:83:13:83:18 | Int32 x2 = ... | DefUse.cs:85:15:85:16 | access to local variable x2 | @@ -77,8 +59,6 @@ | DefUse.cs:152:9:152:14 | Field4 | DefUse.cs:155:9:155:18 | ... = ... | DefUse.cs:156:13:156:18 | access to field Field4 | | DefUse.cs:166:9:166:14 | Field5 | DefUse.cs:184:9:184:18 | ... = ... | DefUse.cs:185:13:185:18 | access to field Field5 | | DefUse.cs:166:9:166:14 | Field5 | DefUse.cs:188:13:188:22 | ... = ... | DefUse.cs:189:17:189:22 | access to field Field5 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | i | DefUse.cs:169:13:169:13 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | ... = ... | DefUse.cs:174:17:174:17 | access to parameter i | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | Action a = ... | DefUse.cs:181:9:181:9 | access to local variable a | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | ... = ... | DefUse.cs:191:9:191:9 | access to local variable a | | Example.cs:4:9:4:13 | Field | Example.cs:8:9:8:22 | ... = ... | Example.cs:9:13:9:22 | access to field Field | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected index cd51b66ba3b..1b416d1b4f2 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected @@ -1,6 +1,3 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:8:17:8:17 | access to parameter i | Capture.cs:33:13:33:13 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:16:17:16:17 | access to local variable x | Capture.cs:17:21:17:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:45:13:45:13 | access to local variable x | Capture.cs:47:13:47:13 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:38:9:38:9 | access to local variable a | Capture.cs:46:12:46:12 | access to local variable a | | Capture.cs:65:45:65:51 | strings | Capture.cs:68:18:68:24 | access to parameter strings | Capture.cs:70:9:70:15 | access to parameter strings | | Consistency.cs:5:9:5:13 | Field | Consistency.cs:26:13:26:19 | access to field Field | Consistency.cs:27:13:27:19 | access to field Field | @@ -22,7 +19,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:146:17:146:17 | access to local variable x | DefUse.cs:147:17:147:17 | access to local variable x | | DefUse.cs:152:9:152:14 | Field4 | DefUse.cs:156:13:156:18 | access to field Field4 | DefUse.cs:157:13:157:18 | access to field Field4 | | DefUse.cs:152:9:152:14 | Field4 | DefUse.cs:162:13:162:18 | access to field Field4 | DefUse.cs:163:13:163:18 | access to field Field4 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:177:21:177:21 | access to parameter i | DefUse.cs:178:21:178:21 | access to parameter i | | Example.cs:4:9:4:13 | Field | Example.cs:14:13:14:22 | access to field Field | Example.cs:15:13:15:22 | access to field Field | | Example.cs:6:23:6:23 | i | Example.cs:8:22:8:22 | access to parameter i | Example.cs:10:13:10:13 | access to parameter i | | Example.cs:6:23:6:23 | i | Example.cs:10:13:10:13 | access to parameter i | Example.cs:11:26:11:26 | access to parameter i | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected b/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected index 134190ef871..8cbd5e6b1b6 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected @@ -4,7 +4,6 @@ | DefUse.cs:6:14:6:14 | y | DefUse.cs:23:9:23:15 | SSA phi(y) | DefUse.cs:18:13:18:18 | SSA def(y) | | DefUse.cs:6:14:6:14 | y | DefUse.cs:42:9:42:15 | SSA phi(y) | DefUse.cs:28:13:28:18 | SSA def(y) | | DefUse.cs:6:14:6:14 | y | DefUse.cs:42:9:42:15 | SSA phi(y) | DefUse.cs:39:13:39:18 | SSA def(y) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:3:17:3:19 | SSA phi(i) | DefUse.cs:76:9:76:11 | SSA def(i) | | DefUse.cs:79:13:79:14 | x1 | DefUse.cs:80:30:80:31 | SSA phi(x1) | DefUse.cs:79:13:79:18 | SSA def(x1) | | DefUse.cs:79:13:79:14 | x1 | DefUse.cs:80:30:80:31 | SSA phi(x1) | DefUse.cs:80:30:80:31 | SSA def(x1) | | DefUse.cs:97:13:97:14 | x5 | DefUse.cs:98:16:98:17 | SSA phi(x5) | DefUse.cs:97:13:97:18 | SSA def(x5) | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.expected deleted file mode 100644 index 48aafe94201..00000000000 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.expected +++ /dev/null @@ -1,45 +0,0 @@ -| in | Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:38:9:38:11 | delegate call | false | -| in | Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:44:9:44:12 | call to method M | true | -| in | Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:38:9:38:11 | delegate call | true | -| in | Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:25:13:25:15 | delegate call | false | -| in | Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:44:9:44:12 | call to method M | true | -| in | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:25:13:25:15 | delegate call | false | -| in | Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:61:9:61:25 | call to method Select | true | -| in | Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:18:68:50 | call to method Where | true | -| in | Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:69:9:69:62 | SSA capture def(c) | Capture.cs:70:9:70:25 | call to method Select | true | -| in | Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:77:9:77:25 | call to method Select | true | -| in | Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:86:68:86:73 | SSA capture def(b) | Capture.cs:87:9:87:24 | call to method Where | true | -| in | Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:96:9:100:10 | call to local function fn | true | -| in | Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:103:9:107:10 | call to local function fn | true | -| in | Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:120:9:120:12 | call to local function M1 | false | -| in | Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:187:13:187:17 | call to local function M10 | true | -| in | Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:189:13:189:17 | call to local function M11 | false | -| in | Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:200:13:200:19 | delegate call | false | -| in | Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:200:13:200:19 | delegate call | false | -| in | Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:213:17:213:24 | access to event Exited | true | -| in | Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:233:9:233:12 | call to local function M2 | false | -| in | Fields.cs:77:13:77:13 | f | Fields.cs:77:13:77:45 | SSA def(f) | Fields.cs:78:27:78:54 | SSA capture def(f) | Fields.cs:81:9:81:11 | delegate call | false | -| in | Fields.cs:77:13:77:13 | f | Fields.cs:77:13:77:45 | SSA def(f) | Fields.cs:78:27:78:54 | SSA capture def(f) | Fields.cs:86:9:86:47 | call to method Select | true | -| in | Fields.cs:78:23:78:23 | a | Fields.cs:78:23:78:54 | SSA def(a) | Fields.cs:86:24:86:46 | SSA capture def(a) | Fields.cs:86:9:86:47 | call to method Select | true | -| in | Fields.cs:79:23:79:23 | b | Fields.cs:79:23:79:35 | SSA def(b) | Fields.cs:89:24:89:46 | SSA capture def(b) | Fields.cs:89:9:89:47 | call to method Select | true | -| in | Properties.cs:73:13:73:13 | f | Properties.cs:73:13:73:32 | SSA def(f) | Properties.cs:74:27:74:54 | SSA capture def(f) | Properties.cs:77:9:77:11 | delegate call | false | -| in | Properties.cs:73:13:73:13 | f | Properties.cs:73:13:73:32 | SSA def(f) | Properties.cs:74:27:74:54 | SSA capture def(f) | Properties.cs:82:9:82:47 | call to method Select | true | -| in | Properties.cs:74:23:74:23 | a | Properties.cs:74:23:74:54 | SSA def(a) | Properties.cs:82:24:82:46 | SSA capture def(a) | Properties.cs:82:9:82:47 | call to method Select | true | -| in | Properties.cs:75:23:75:23 | b | Properties.cs:75:23:75:35 | SSA def(b) | Properties.cs:85:24:85:46 | SSA capture def(b) | Properties.cs:85:9:85:47 | call to method Select | true | -| out | Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:38:9:38:11 | delegate call | false | -| out | Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:44:9:44:12 | call to method M | true | -| out | Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:38:9:38:11 | delegate call | false | -| out | Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:44:9:44:12 | call to method M | true | -| out | Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:32:9:32:11 | delegate call | false | -| out | Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:44:9:44:12 | call to method M | true | -| out | Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:53:9:53:11 | delegate call | false | -| out | Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:61:9:61:25 | call to method Select | true | -| out | Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:77:9:77:25 | call to method Select | true | -| out | Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:103:9:107:10 | call to local function fn | true | -| out | Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:128:9:128:12 | call to local function M2 | false | -| out | Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:136:9:136:12 | call to local function M3 | false | -| out | Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:144:9:144:12 | call to local function M4 | false | -| out | Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:160:9:160:12 | call to local function M6 | false | -| out | Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:176:13:176:16 | call to local function M9 | false | -| out | Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:236:9:236:12 | call to local function M3 | false | -| out | DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:181:9:181:11 | delegate call | false | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.ql b/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.ql deleted file mode 100644 index f5815998200..00000000000 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.ql +++ /dev/null @@ -1,12 +0,0 @@ -import csharp - -from - string inout, Ssa::ExplicitDefinition def, Ssa::Definition targetDef, ControlFlow::Node call, - boolean additionalCalls -where - inout = "in" and def.isCapturedVariableDefinitionFlowIn(targetDef, call, additionalCalls) - or - inout = "out" and - def.isCapturedVariableDefinitionFlowOut(targetDef, additionalCalls) and - targetDef.(Ssa::ImplicitCallDefinition).getControlFlowNode() = call -select inout, def.getSourceVariable(), def, targetDef, call, additionalCalls diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected index 02d622c006a..aeda9e9b4c1 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected @@ -1,101 +1,37 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | -| Capture.cs:29:13:29:13 | z | Capture.cs:29:13:29:17 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | -| Capture.cs:50:20:50:20 | a | Capture.cs:50:20:50:20 | SSA param(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | -| Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | -| Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:68:32:68:49 | SSA capture def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:69:9:69:62 | SSA capture def(c) | | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | -| Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:34:81:36 | SSA def(i) | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | -| Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | | Capture.cs:85:13:85:13 | b | Capture.cs:86:68:86:73 | SSA capture def(b) | | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | SSA def(e) | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | -| Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | -| Capture.cs:102:13:102:13 | z | Capture.cs:102:13:102:18 | SSA def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | -| Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | -| Capture.cs:122:13:122:13 | b | Capture.cs:122:13:122:18 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | -| Capture.cs:130:13:130:13 | c | Capture.cs:130:13:130:18 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | -| Capture.cs:139:13:139:13 | d | Capture.cs:139:13:139:18 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | -| Capture.cs:147:13:147:13 | e | Capture.cs:147:13:147:18 | SSA def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:151:13:151:17 | SSA def(e) | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | -| Capture.cs:168:13:168:13 | h | Capture.cs:168:13:168:18 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:171:13:171:17 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | -| Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | -| Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | -| Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | SSA def(eh) | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | SSA def(eh2) | -| Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:245:13:245:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | @@ -103,8 +39,6 @@ | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:38:13:38:13 | SSA def(i) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | @@ -129,13 +63,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:3:17:3:19 | SSA phi(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:60:37:60:41 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | SSA def(tc) | @@ -162,11 +89,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:170:9:170:13 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected index 4ec9fbf90b0..69309834706 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected @@ -1,110 +1,44 @@ -| Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:6:16:6:16 | i | -| Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:8:13:8:17 | Int32 x = ... | | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:10:16:27:9 | Action a = ... | -| Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:10:20:27:9 | (...) => ... | -| Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:15:13:15:17 | ... = ... | | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:17:17:17:21 | Int32 y = ... | | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:19:20:23:13 | Action b = ... | -| Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:19:24:23:13 | (...) => ... | | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:19:24:23:13 | (...) => ... | -| Capture.cs:29:13:29:17 | SSA def(z) | Capture.cs:29:13:29:17 | Int32 z = ... | | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:30:16:30:35 | Action c = ... | -| Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:32:9:32:11 | delegate call | -| Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:37:9:37:13 | ... = ... | -| Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:38:9:38:11 | delegate call | -| Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:38:9:38:11 | delegate call | -| Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:43:9:43:13 | ... = ... | -| Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:44:9:44:12 | call to method M | -| Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:44:9:44:12 | call to method M | -| Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:44:9:44:12 | call to method M | -| Capture.cs:50:20:50:20 | SSA param(a) | Capture.cs:50:20:50:20 | a | | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:52:16:52:43 | Action b = ... | -| Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:52:28:52:40 | ... = ... | -| Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:53:9:53:11 | delegate call | | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:57:57:57:63 | strings | -| Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:59:13:59:17 | Int32 i = ... | | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:60:27:60:38 | Func e = ... | -| Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:31:60:38 | (...) => ... | -| Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:60:36:60:38 | ...++ | -| Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:61:9:61:25 | call to method Select | | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:65:45:65:51 | strings | -| Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:67:13:67:19 | Char c = ... | | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:32:68:32 | s | | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:32:68:49 | (...) => ... | | Capture.cs:69:9:69:62 | SSA capture def(c) | Capture.cs:69:9:69:62 | M | | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:25:69:25 | s | | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:73:67:73:73 | strings | -| Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:75:13:75:17 | Int32 i = ... | | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:76:63:76:81 | Expression> e = ... | -| Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:67:76:81 | (...) => ... | -| Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:76:72:76:81 | call to method Inc | -| Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:77:9:77:25 | call to method Select | | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:28:81:28 | i | | Capture.cs:81:34:81:36 | SSA def(i) | Capture.cs:81:34:81:36 | ...++ | | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:83:65:83:71 | strings | -| Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:85:13:85:20 | Boolean b = ... | | Capture.cs:86:64:86:73 | SSA def(e) | Capture.cs:86:64:86:73 | Expression> e = ... | | Capture.cs:86:68:86:73 | SSA capture def(b) | Capture.cs:86:68:86:73 | (...) => ... | | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:18:92:18 | d | -| Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:94:13:94:18 | Int32 y = ... | | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:96:12:100:9 | (...) => ... | | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:98:17:98:21 | Int32 x = ... | -| Capture.cs:102:13:102:18 | SSA def(z) | Capture.cs:102:13:102:18 | Int32 z = ... | -| Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:103:9:107:10 | call to local function fn | -| Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:105:13:105:17 | ... = ... | -| Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:114:13:114:18 | Int32 a = ... | | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:115:9:119:9 | M1 | | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:117:17:117:21 | Int32 x = ... | -| Capture.cs:122:13:122:18 | SSA def(b) | Capture.cs:122:13:122:18 | Int32 b = ... | -| Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:125:13:125:17 | ... = ... | -| Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:128:9:128:12 | call to local function M2 | -| Capture.cs:130:13:130:18 | SSA def(c) | Capture.cs:130:13:130:18 | Int32 c = ... | -| Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:133:13:133:17 | ... = ... | -| Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:136:9:136:12 | call to local function M3 | -| Capture.cs:139:13:139:18 | SSA def(d) | Capture.cs:139:13:139:18 | Int32 d = ... | -| Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:142:13:142:17 | ... = ... | -| Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:144:9:144:12 | call to local function M4 | -| Capture.cs:147:13:147:18 | SSA def(e) | Capture.cs:147:13:147:18 | Int32 e = ... | -| Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:148:9:152:9 | M5 | -| Capture.cs:151:13:151:17 | SSA def(e) | Capture.cs:151:13:151:17 | ... = ... | -| Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:154:13:154:18 | Int32 f = ... | -| Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:158:13:158:17 | ... = ... | -| Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:160:9:160:12 | call to local function M6 | | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:163:9:166:9 | M7 | -| Capture.cs:168:13:168:18 | SSA def(h) | Capture.cs:168:13:168:18 | Int32 h = ... | -| Capture.cs:171:13:171:17 | SSA def(h) | Capture.cs:171:13:171:17 | ... = ... | -| Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:174:17:174:21 | ... = ... | -| Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:176:13:176:16 | call to local function M9 | -| Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:182:17:182:21 | Int32 i = ... | | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:183:13:186:13 | M11 | -| Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:188:13:188:17 | ... = ... | -| Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:197:17:197:21 | Int32 i = ... | | Capture.cs:198:28:198:44 | SSA def(eh) | Capture.cs:198:28:198:44 | MyEventHandler eh = ... | | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:33:198:44 | (...) => ... | | Capture.cs:203:28:203:45 | SSA def(eh2) | Capture.cs:203:28:203:45 | MyEventHandler eh2 = ... | | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:34:203:45 | (...) => ... | -| Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:209:17:209:21 | Int32 i = ... | | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:210:24:210:59 | Process p = ... | | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | EventHandler exited = ... | | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:39:212:71 | (...) => ... | -| Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:9:231:49 | M2 | -| Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:232:9:232:13 | ... = ... | -| Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:235:21:235:25 | ... = ... | -| Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:236:9:236:12 | call to local function M3 | -| Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:242:13:242:17 | Int32 i = ... | -| Capture.cs:245:13:245:17 | SSA def(i) | Capture.cs:245:13:245:17 | ... = ... | | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | -| Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:254:9:254:28 | call to local function CaptureAndRef | | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | b | | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:9:25:30 | call to method Out | | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:9:25:30 | call to method Out | | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... | -| Consistency.cs:38:13:38:13 | SSA def(i) | Consistency.cs:38:13:38:13 | Int32 i | -| Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:28:39:32 | ... = ... | | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | S s | | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:30:49:30 | a | | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:37:49:37 | i | @@ -126,15 +60,9 @@ | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:50:9:50:24 | call to method refMethod | | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:53:9:53:17 | ... = ... | | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:56:9:56:16 | ... = ... | -| DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:59:13:59:17 | Int32 i = ... | -| DefUse.cs:60:37:60:41 | SSA def(i) | DefUse.cs:60:37:60:41 | ... = ... | | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:63:9:63:18 | ... = ... | | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:66:9:66:18 | ... = ... | | DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:67:19:67:27 | TestClass tc = ... | -| DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:71:9:71:13 | ... = ... | -| DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:72:9:72:11 | ...++ | -| DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:75:9:75:13 | ... = ... | -| DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:76:9:76:11 | ...-- | | DefUse.cs:79:13:79:18 | SSA def(x1) | DefUse.cs:79:13:79:18 | Int32 x1 = ... | | DefUse.cs:80:30:80:31 | SSA def(x1) | DefUse.cs:80:16:80:32 | call to method refMethod | | DefUse.cs:83:13:83:18 | SSA def(x2) | DefUse.cs:83:13:83:18 | Int32 x2 = ... | @@ -156,12 +84,7 @@ | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:144:22:144:22 | String x | | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:155:9:155:18 | ... = ... | | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:160:10:160:16 | FieldM2 | -| DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:167:23:167:23 | i | -| DefUse.cs:170:9:170:13 | SSA def(i) | DefUse.cs:170:9:170:13 | ... = ... | | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:171:23:180:9 | Action a = ... | -| DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:173:13:173:17 | ... = ... | -| DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:175:32:179:13 | (...) => ... | -| DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:181:9:181:11 | delegate call | | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:184:9:184:18 | ... = ... | | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:186:9:190:9 | ... = ... | | DefUse.cs:188:13:188:22 | SSA def(this.Field5) | DefUse.cs:188:13:188:22 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected index fe4cfec2ec0..d94da54d008 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected @@ -1,25 +1,10 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:33:13:33:13 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:12:17:12:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:14:17:14:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:39:13:39:13 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:34:13:34:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:17:21:17:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:21:21:21:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:40:13:40:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:44:11:44:11 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:47:13:47:13 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:46:12:46:12 | access to local variable a | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:26:17:26:17 | access to local variable y | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:22:21:22:21 | access to local variable y | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:25:13:25:13 | access to local variable b | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:35:13:35:13 | access to local variable z | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:41:13:41:13 | access to local variable z | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:32:9:32:9 | access to local variable c | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:54:9:54:9 | access to parameter a | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:53:9:53:9 | access to local variable b | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:61:9:61:15 | access to parameter strings | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:36:60:36 | access to local variable i | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:62:13:62:13 | access to local variable i | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:61:24:61:24 | access to local variable e | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:70:9:70:15 | access to parameter strings | | Capture.cs:67:13:67:13 | c | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:48:68:48 | access to local variable c | @@ -27,8 +12,6 @@ | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:37:68:37 | access to parameter s | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:59:69:59 | access to parameter s | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:77:9:77:15 | access to parameter strings | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:80:76:80 | access to local variable i | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:78:13:78:13 | access to local variable i | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:77:24:77:24 | access to local variable e | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:34:81:34 | access to parameter i | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:87:9:87:15 | access to parameter strings | @@ -37,17 +20,9 @@ | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:24:92:24 | access to parameter d | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:98:21:98:21 | access to local variable y | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:99:20:99:20 | access to local variable x | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:106:20:106:20 | access to local variable z | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:117:21:117:21 | access to local variable a | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:118:17:118:17 | access to local variable x | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:126:17:126:17 | access to local variable b | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:134:17:134:17 | access to local variable c | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:137:13:137:13 | access to local variable c | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:145:13:145:13 | access to local variable d | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:150:17:150:17 | access to local variable e | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:155:13:155:13 | access to local variable f | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:165:17:165:17 | access to local variable g | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:177:17:177:17 | access to local variable h | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:185:21:185:21 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:43:198:43 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:44:203:44 | access to local variable i | @@ -56,17 +31,12 @@ | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:70:212:70 | access to local variable i | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:213:17:213:17 | access to local variable p | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:213:29:213:34 | access to local variable exited | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:47:231:47 | access to local variable i | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:237:34:237:34 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:254:27:254:27 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:255:34:255:34 | access to local variable i | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:11:17:11:17 | access to parameter b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:27:13:27:13 | access to local variable c | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:27:13:27:19 | access to field Field | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:33:9:33:9 | access to parameter c | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:39:39:39 | access to local variable i | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:46:13:46:13 | access to local variable s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:47:49:47 | access to parameter a | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:49:49:49 | access to parameter i | @@ -87,11 +57,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:51:13:51:13 | access to local variable z | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:54:13:54:17 | access to field Field | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:57:13:57:16 | access to property Prop | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:61:13:61:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:72:9:72:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:73:13:73:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:76:9:76:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:77:13:77:13 | access to local variable i | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:64:13:64:18 | access to field Field2 | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:80:37:80:42 | access to field Field2 | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:69:13:69:18 | access to field Field3 | @@ -113,10 +78,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:147:17:147:17 | access to local variable x | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:157:13:157:18 | access to field Field4 | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:163:13:163:18 | access to field Field4 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:169:13:169:13 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:174:17:174:17 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:178:21:178:21 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:182:13:182:13 | access to parameter i | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:181:9:181:9 | access to local variable a | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:191:9:191:9 | access to local variable a | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:185:13:185:18 | access to field Field5 | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected index 56d86ea53cd..000751cad1b 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected @@ -1,76 +1,32 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:6:16:6:16 | i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:8:13:8:17 | Int32 x = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:15:13:15:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:43:9:43:13 | ... = ... | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:10:16:27:9 | Action a = ... | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:17:17:17:21 | Int32 y = ... | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:19:20:23:13 | Action b = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:29:13:29:17 | SSA def(z) | Capture.cs:29:13:29:17 | Int32 z = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:37:9:37:13 | ... = ... | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:30:16:30:35 | Action c = ... | -| Capture.cs:50:20:50:20 | a | Capture.cs:50:20:50:20 | SSA param(a) | Capture.cs:50:20:50:20 | a | -| Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:52:28:52:40 | ... = ... | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:52:16:52:43 | Action b = ... | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:57:57:57:63 | strings | -| Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:59:13:59:17 | Int32 i = ... | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:60:36:60:38 | ...++ | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:60:27:60:38 | Func e = ... | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:65:45:65:51 | strings | -| Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:67:13:67:19 | Char c = ... | | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:32:68:32 | s | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:25:69:25 | s | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:73:67:73:73 | strings | -| Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:75:13:75:17 | Int32 i = ... | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:76:80:76:80 | access to local variable i | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:76:63:76:81 | Expression> e = ... | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:28:81:28 | i | | Capture.cs:81:28:81:28 | i | Capture.cs:81:34:81:36 | SSA def(i) | Capture.cs:81:34:81:36 | ...++ | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:83:65:83:71 | strings | -| Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:85:13:85:20 | Boolean b = ... | | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | SSA def(e) | Capture.cs:86:64:86:73 | Expression> e = ... | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:18:92:18 | d | -| Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:94:13:94:18 | Int32 y = ... | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:98:17:98:21 | Int32 x = ... | -| Capture.cs:102:13:102:13 | z | Capture.cs:102:13:102:18 | SSA def(z) | Capture.cs:102:13:102:18 | Int32 z = ... | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:105:13:105:17 | ... = ... | -| Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:114:13:114:18 | Int32 a = ... | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:117:17:117:21 | Int32 x = ... | -| Capture.cs:122:13:122:13 | b | Capture.cs:122:13:122:18 | SSA def(b) | Capture.cs:122:13:122:18 | Int32 b = ... | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:125:13:125:17 | ... = ... | -| Capture.cs:130:13:130:13 | c | Capture.cs:130:13:130:18 | SSA def(c) | Capture.cs:130:13:130:18 | Int32 c = ... | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:133:13:133:17 | ... = ... | -| Capture.cs:139:13:139:13 | d | Capture.cs:139:13:139:18 | SSA def(d) | Capture.cs:139:13:139:18 | Int32 d = ... | -| Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:142:13:142:17 | ... = ... | -| Capture.cs:147:13:147:13 | e | Capture.cs:147:13:147:18 | SSA def(e) | Capture.cs:147:13:147:18 | Int32 e = ... | -| Capture.cs:147:13:147:13 | e | Capture.cs:151:13:151:17 | SSA def(e) | Capture.cs:151:13:151:17 | ... = ... | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:154:13:154:18 | Int32 f = ... | -| Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:158:13:158:17 | ... = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:168:13:168:18 | SSA def(h) | Capture.cs:168:13:168:18 | Int32 h = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:171:13:171:17 | SSA def(h) | Capture.cs:171:13:171:17 | ... = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:174:17:174:21 | ... = ... | -| Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:182:17:182:21 | Int32 i = ... | -| Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:188:13:188:17 | ... = ... | -| Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:197:17:197:21 | Int32 i = ... | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | SSA def(eh) | Capture.cs:198:28:198:44 | MyEventHandler eh = ... | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | SSA def(eh2) | Capture.cs:203:28:203:45 | MyEventHandler eh2 = ... | -| Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:209:17:209:21 | Int32 i = ... | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:210:24:210:59 | Process p = ... | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | EventHandler exited = ... | -| Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:232:9:232:13 | ... = ... | -| Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:235:21:235:25 | ... = ... | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:242:13:242:17 | Int32 i = ... | -| Capture.cs:242:13:242:13 | i | Capture.cs:245:13:245:17 | SSA def(i) | Capture.cs:245:13:245:17 | ... = ... | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:254:27:254:27 | access to local variable i | | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | Consistency c | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:38:13:38:13 | SSA def(i) | Consistency.cs:38:13:38:13 | Int32 i | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:28:39:32 | ... = ... | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | S s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:30:49:30 | a | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:37:49:37 | i | @@ -92,12 +48,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:50:23:50:23 | access to local variable z | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:53:9:53:17 | ... = ... | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:56:9:56:16 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:59:13:59:17 | Int32 i = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:60:37:60:41 | SSA def(i) | DefUse.cs:60:37:60:41 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:71:9:71:13 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:72:9:72:11 | ...++ | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:75:9:75:13 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:76:9:76:11 | ...-- | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:63:9:63:18 | ... = ... | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:66:9:66:18 | ... = ... | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:67:19:67:27 | TestClass tc = ... | @@ -122,9 +72,6 @@ | DefUse.cs:142:68:142:69 | ie | DefUse.cs:142:68:142:69 | SSA param(ie) | DefUse.cs:142:68:142:69 | ie | | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:144:22:144:22 | String x | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:155:9:155:18 | ... = ... | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:167:23:167:23 | i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:170:9:170:13 | SSA def(i) | DefUse.cs:170:9:170:13 | ... = ... | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:173:13:173:17 | ... = ... | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:171:23:180:9 | Action a = ... | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:186:9:190:9 | ... = ... | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:184:9:184:18 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected index 22a56a7da24..189720acf12 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected @@ -1,20 +1,3 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:15:13:15:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:15:13:15:17 | ... = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:52:28:52:40 | ... = ... | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:60:36:60:38 | ...++ | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:76:80:76:80 | access to local variable i | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:105:13:105:17 | ... = ... | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:125:13:125:17 | ... = ... | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:133:13:133:17 | ... = ... | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:142:13:142:17 | ... = ... | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:158:13:158:17 | ... = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:174:17:174:21 | ... = ... | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:235:21:235:25 | ... = ... | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:173:13:173:17 | ... = ... | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:191:9:191:11 | SSA call def(this.Field5) | DefUse.cs:188:13:188:22 | ... = ... | | Example.cs:8:9:8:18 | this.Field | Example.cs:13:13:13:23 | SSA call def(this.Field) | Example.cs:8:9:8:22 | ... = ... | | Example.cs:8:9:8:18 | this.Field | Example.cs:13:13:13:23 | SSA call def(this.Field) | Example.cs:11:13:11:30 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected index 48acb24891f..8df92f84755 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected @@ -1,29 +1,11 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:8:17:8:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:33:13:33:13 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:12:17:12:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:14:17:14:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:39:13:39:13 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:34:13:34:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:16:17:16:17 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:17:21:17:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:21:21:21:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:40:13:40:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:44:11:44:11 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:45:13:45:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:47:13:47:13 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:38:9:38:9 | access to local variable a | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:46:12:46:12 | access to local variable a | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:26:17:26:17 | access to local variable y | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:22:21:22:21 | access to local variable y | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:25:13:25:13 | access to local variable b | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:35:13:35:13 | access to local variable z | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:41:13:41:13 | access to local variable z | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:32:9:32:9 | access to local variable c | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:54:9:54:9 | access to parameter a | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:53:9:53:9 | access to local variable b | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:61:9:61:15 | access to parameter strings | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:36:60:36 | access to local variable i | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:62:13:62:13 | access to local variable i | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:61:24:61:24 | access to local variable e | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:68:18:68:24 | access to parameter strings | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:70:9:70:15 | access to parameter strings | @@ -32,8 +14,6 @@ | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:37:68:37 | access to parameter s | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:59:69:59 | access to parameter s | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:77:9:77:15 | access to parameter strings | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:80:76:80 | access to local variable i | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:78:13:78:13 | access to local variable i | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:77:24:77:24 | access to local variable e | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:34:81:34 | access to parameter i | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:87:9:87:15 | access to parameter strings | @@ -42,17 +22,9 @@ | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:24:92:24 | access to parameter d | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:98:21:98:21 | access to local variable y | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:99:20:99:20 | access to local variable x | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:106:20:106:20 | access to local variable z | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:117:21:117:21 | access to local variable a | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:118:17:118:17 | access to local variable x | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:126:17:126:17 | access to local variable b | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:134:17:134:17 | access to local variable c | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:137:13:137:13 | access to local variable c | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:145:13:145:13 | access to local variable d | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:150:17:150:17 | access to local variable e | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:155:13:155:13 | access to local variable f | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:165:17:165:17 | access to local variable g | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:177:17:177:17 | access to local variable h | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:185:21:185:21 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:43:198:43 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:44:203:44 | access to local variable i | @@ -61,10 +33,6 @@ | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:70:212:70 | access to local variable i | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:213:17:213:17 | access to local variable p | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:213:29:213:34 | access to local variable exited | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:47:231:47 | access to local variable i | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:237:34:237:34 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:254:27:254:27 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:255:34:255:34 | access to local variable i | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:11:17:11:17 | access to parameter b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | @@ -73,7 +41,6 @@ | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:26:13:26:19 | access to field Field | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:27:13:27:19 | access to field Field | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:33:9:33:9 | access to parameter c | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:39:39:39 | access to local variable i | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:45:9:45:9 | access to local variable s | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:46:13:46:13 | access to local variable s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:47:49:47 | access to parameter a | @@ -102,11 +69,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:51:13:51:13 | access to local variable z | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:54:13:54:17 | access to field Field | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:57:13:57:16 | access to property Prop | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:61:13:61:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:72:9:72:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:73:13:73:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:76:9:76:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:77:13:77:13 | access to local variable i | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:64:13:64:18 | access to field Field2 | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:80:37:80:42 | access to field Field2 | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:69:13:69:18 | access to field Field3 | @@ -133,11 +95,6 @@ | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:157:13:157:18 | access to field Field4 | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:162:13:162:18 | access to field Field4 | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:163:13:163:18 | access to field Field4 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:169:13:169:13 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:174:17:174:17 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:177:21:177:21 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:178:21:178:21 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:182:13:182:13 | access to parameter i | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:181:9:181:9 | access to local variable a | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:191:9:191:9 | access to local variable a | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:185:13:185:18 | access to field Field5 | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected index bf7db292429..311df004270 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected @@ -1,118 +1,37 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:10:20:27:9 | SSA capture def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:13:13:13:17 | SSA def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:38:9:38:11 | SSA call def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:38:9:38:11 | SSA call def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:44:9:44:12 | SSA call def(i) | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:8:13:8:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:15:13:15:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:8:13:8:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:38:9:38:11 | SSA call def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:43:9:43:13 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:43:9:43:13 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:44:9:44:12 | SSA call def(x) | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:10:16:27:9 | SSA def(a) | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:17:17:17:21 | SSA def(y) | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:19:24:23:13 | SSA capture def(y) | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:19:20:23:13 | SSA def(b) | -| Capture.cs:29:13:29:13 | z | Capture.cs:29:13:29:17 | SSA def(z) | Capture.cs:29:13:29:17 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:30:28:30:32 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:29:13:29:17 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:32:9:32:11 | SSA call def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:37:9:37:13 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:37:9:37:13 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:44:9:44:12 | SSA call def(z) | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:30:16:30:35 | SSA def(c) | -| Capture.cs:50:20:50:20 | a | Capture.cs:50:20:50:20 | SSA param(a) | Capture.cs:50:20:50:20 | SSA param(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:52:28:52:40 | SSA def(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:50:20:50:20 | SSA param(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:53:9:53:11 | SSA call def(a) | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:52:16:52:43 | SSA def(b) | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:57:57:57:63 | SSA param(strings) | -| Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:59:13:59:17 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:31:60:38 | SSA capture def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:60:36:60:38 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:59:13:59:17 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:61:9:61:25 | SSA call def(i) | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:60:27:60:38 | SSA def(e) | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:65:45:65:51 | SSA param(strings) | -| Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:67:13:67:19 | SSA def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:32:68:49 | SSA capture def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:69:9:69:62 | SSA capture def(c) | Capture.cs:69:9:69:62 | SSA capture def(c) | | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:32:68:32 | SSA param(s) | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:25:69:25 | SSA param(s) | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:73:67:73:73 | SSA param(strings) | -| Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:75:13:75:17 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:67:76:81 | SSA capture def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:76:80:76:80 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:75:13:75:17 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:77:9:77:25 | SSA call def(i) | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:76:63:76:81 | SSA def(e) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:28:81:28 | SSA param(i) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:34:81:36 | SSA def(i) | Capture.cs:81:34:81:36 | SSA def(i) | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:83:65:83:71 | SSA param(strings) | -| Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:85:13:85:20 | SSA def(b) | | Capture.cs:85:13:85:13 | b | Capture.cs:86:68:86:73 | SSA capture def(b) | Capture.cs:86:68:86:73 | SSA capture def(b) | | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | SSA def(e) | Capture.cs:86:64:86:73 | SSA def(e) | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:18:92:18 | SSA param(d) | -| Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:94:13:94:18 | SSA def(y) | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:96:12:100:9 | SSA capture def(y) | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:98:17:98:21 | SSA def(x) | -| Capture.cs:102:13:102:13 | z | Capture.cs:102:13:102:18 | SSA def(z) | Capture.cs:102:13:102:18 | SSA def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:102:13:102:18 | SSA def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:103:9:107:10 | SSA call def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:105:13:105:17 | SSA def(z) | -| Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:114:13:114:18 | SSA def(a) | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:115:9:119:9 | SSA capture def(a) | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:117:17:117:21 | SSA def(x) | -| Capture.cs:122:13:122:13 | b | Capture.cs:122:13:122:18 | SSA def(b) | Capture.cs:122:13:122:18 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:125:13:125:17 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:122:13:122:18 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:128:9:128:12 | SSA call def(b) | -| Capture.cs:130:13:130:13 | c | Capture.cs:130:13:130:18 | SSA def(c) | Capture.cs:130:13:130:18 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:133:13:133:17 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:130:13:130:18 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:136:9:136:12 | SSA call def(c) | -| Capture.cs:139:13:139:13 | d | Capture.cs:139:13:139:18 | SSA def(d) | Capture.cs:139:13:139:18 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:142:13:142:17 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:139:13:139:18 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:144:9:144:12 | SSA call def(d) | -| Capture.cs:147:13:147:13 | e | Capture.cs:147:13:147:18 | SSA def(e) | Capture.cs:147:13:147:18 | SSA def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:148:9:152:9 | SSA capture def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:151:13:151:17 | SSA def(e) | Capture.cs:151:13:151:17 | SSA def(e) | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:154:13:154:18 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:158:13:158:17 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:154:13:154:18 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:160:9:160:12 | SSA call def(f) | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:163:9:166:9 | SSA capture def(g) | -| Capture.cs:168:13:168:13 | h | Capture.cs:168:13:168:18 | SSA def(h) | Capture.cs:168:13:168:18 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:171:13:171:17 | SSA def(h) | Capture.cs:171:13:171:17 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:174:17:174:21 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:171:13:171:17 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:176:13:176:16 | SSA call def(h) | -| Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:182:17:182:21 | SSA def(i) | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:183:13:186:13 | SSA capture def(i) | -| Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:188:13:188:17 | SSA def(i) | -| Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:197:17:197:21 | SSA def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:33:198:44 | SSA capture def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:34:203:45 | SSA capture def(i) | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | SSA def(eh) | Capture.cs:198:28:198:44 | SSA def(eh) | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | SSA def(eh2) | Capture.cs:203:28:203:45 | SSA def(eh2) | -| Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:209:17:209:21 | SSA def(i) | | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:39:212:71 | SSA capture def(i) | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:210:24:210:59 | SSA def(p) | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | SSA def(exited) | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:9:231:49 | SSA capture def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:232:9:232:13 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:235:21:235:25 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:232:9:232:13 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:236:9:236:12 | SSA call def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:242:13:242:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:245:13:245:17 | SSA def(i) | Capture.cs:245:13:245:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:254:27:254:27 | SSA def(i) | | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | SSA def(j) | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | SSA param(b) | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | SSA def(i) | @@ -120,8 +39,6 @@ | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | SSA def(c) | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | SSA def(c) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:38:13:38:13 | SSA def(i) | Consistency.cs:38:13:38:13 | SSA def(i) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:28:39:32 | SSA def(i) | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | SSA def(s) | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:30:49:30 | SSA param(a) | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:37:49:37 | SSA param(i) | @@ -149,13 +66,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:50:23:50:23 | SSA def(z) | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:53:9:53:17 | SSA def(this.Field) | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:3:17:3:19 | SSA phi(i) | DefUse.cs:76:9:76:11 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:59:13:59:17 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:60:37:60:41 | SSA def(i) | DefUse.cs:60:37:60:41 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:71:9:71:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:72:9:72:11 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:75:9:75:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:76:9:76:11 | SSA def(i) | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:67:19:67:27 | SSA def(tc) | @@ -184,12 +94,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:144:22:144:22 | SSA def(x) | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:167:23:167:23 | SSA param(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:170:9:170:13 | SSA def(i) | DefUse.cs:170:9:170:13 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:173:13:173:17 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:175:32:179:13 | SSA capture def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:170:9:170:13 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:181:9:181:11 | SSA call def(i) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:171:23:180:9 | SSA def(a) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:186:9:190:9 | SSA def(a) | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected index 2000a735bdb..9bcebb45caf 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected @@ -1,7 +1,8 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | @@ -11,6 +12,7 @@ nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected index 85243196a39..c436e675b99 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected @@ -1,23 +1,27 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected index a499529d57d..b6de356c3e9 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected @@ -1,29 +1,37 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | -| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:46:42:46:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | +| Test.cs:43:20:43:25 | access to local variable result : String | Test.cs:46:42:46:96 | ... + ... | provenance | | +| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:43:20:43:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:43:20:43:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:43:29:43:50 | call to method ReadEnv : String | semmle.label | call to method ReadEnv : String | | Test.cs:46:42:46:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected index 53b70178511..df99e1a39a5 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected @@ -1,32 +1,42 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | -| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:46:42:46:96 | ... + ... | provenance | | -| Test.cs:53:29:53:52 | call to method GetCustom : String | Test.cs:56:42:56:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | +| Test.cs:43:20:43:25 | access to local variable result : String | Test.cs:46:42:46:96 | ... + ... | provenance | | +| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:43:20:43:25 | access to local variable result : String | provenance | | +| Test.cs:53:20:53:25 | access to local variable result : String | Test.cs:56:42:56:96 | ... + ... | provenance | | +| Test.cs:53:29:53:52 | call to method GetCustom : String | Test.cs:53:20:53:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:43:20:43:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:43:29:43:50 | call to method ReadEnv : String | semmle.label | call to method ReadEnv : String | | Test.cs:46:42:46:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:53:20:53:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:53:29:53:52 | call to method GetCustom : String | semmle.label | call to method GetCustom : String | | Test.cs:56:42:56:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected index 184c4722f80..cf14d14c794 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected @@ -1,26 +1,32 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:46:42:46:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:43:20:43:25 | access to local variable result : String | Test.cs:46:42:46:96 | ... + ... | provenance | | +| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:43:20:43:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:43:20:43:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:43:29:43:50 | call to method ReadEnv : String | semmle.label | call to method ReadEnv : String | | Test.cs:46:42:46:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected index 72271d08836..e1a6e62f492 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected @@ -1,26 +1,32 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected index 7a3c03fb060..68a96fa6f5a 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected @@ -1,15 +1,21 @@ +| Tuples.cs:7:13:7:14 | access to local variable o1 | Tuples.cs:7:13:7:34 | SSA def(o1) | | Tuples.cs:7:13:7:34 | SSA def(o1) | Tuples.cs:10:21:10:22 | access to local variable o1 | -| Tuples.cs:7:18:7:34 | call to method Source | Tuples.cs:7:13:7:34 | SSA def(o1) | +| Tuples.cs:7:18:7:34 | call to method Source | Tuples.cs:7:13:7:14 | access to local variable o1 | | Tuples.cs:7:33:7:33 | 1 | Tuples.cs:7:33:7:33 | (...) ... | +| Tuples.cs:8:13:8:14 | access to local variable o2 | Tuples.cs:8:13:8:34 | SSA def(o2) | | Tuples.cs:8:13:8:34 | SSA def(o2) | Tuples.cs:10:29:10:30 | access to local variable o2 | -| Tuples.cs:8:18:8:34 | call to method Source | Tuples.cs:8:13:8:34 | SSA def(o2) | +| Tuples.cs:8:18:8:34 | call to method Source | Tuples.cs:8:13:8:14 | access to local variable o2 | | Tuples.cs:8:33:8:33 | 2 | Tuples.cs:8:33:8:33 | (...) ... | +| Tuples.cs:10:13:10:13 | access to local variable x | Tuples.cs:10:13:10:32 | SSA def(x) | | Tuples.cs:10:13:10:32 | SSA def(x) | Tuples.cs:11:27:11:27 | access to local variable x | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item1) | Tuples.cs:26:14:26:20 | access to field Item1 | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2) | Tuples.cs:28:14:28:20 | access to field Item2 | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2.Item1) | Tuples.cs:28:14:28:26 | access to field Item1 | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2.Item2) | Tuples.cs:29:14:29:26 | access to field Item2 | -| Tuples.cs:10:17:10:32 | (..., ...) | Tuples.cs:10:13:10:32 | SSA def(x) | +| Tuples.cs:10:17:10:32 | (..., ...) | Tuples.cs:10:13:10:13 | access to local variable x | +| Tuples.cs:11:9:11:27 | ... = ... | Tuples.cs:11:9:11:27 | SSA def(a) | +| Tuples.cs:11:9:11:27 | ... = ... | Tuples.cs:11:9:11:27 | SSA def(b) | +| Tuples.cs:11:9:11:27 | ... = ... | Tuples.cs:11:9:11:27 | SSA def(c) | | Tuples.cs:11:9:11:27 | SSA def(a) | Tuples.cs:12:14:12:14 | access to local variable a | | Tuples.cs:11:9:11:27 | SSA def(b) | Tuples.cs:13:14:13:14 | access to local variable b | | Tuples.cs:11:9:11:27 | SSA def(c) | Tuples.cs:14:14:14:14 | access to local variable c | @@ -19,9 +25,14 @@ | Tuples.cs:16:9:16:23 | SSA def(a) | Tuples.cs:17:14:17:14 | access to local variable a | | Tuples.cs:16:9:16:23 | SSA def(b) | Tuples.cs:18:14:18:14 | access to local variable b | | Tuples.cs:16:9:16:23 | SSA def(c) | Tuples.cs:19:14:19:14 | access to local variable c | +| Tuples.cs:16:10:16:10 | access to local variable a | Tuples.cs:16:9:16:23 | SSA def(a) | +| Tuples.cs:16:14:16:14 | access to local variable b | Tuples.cs:16:9:16:23 | SSA def(b) | +| Tuples.cs:16:17:16:17 | access to local variable c | Tuples.cs:16:9:16:23 | SSA def(c) | | Tuples.cs:16:23:16:23 | access to local variable x | Tuples.cs:16:9:16:19 | (..., ...) | | Tuples.cs:16:23:16:23 | access to local variable x | Tuples.cs:21:26:21:26 | access to local variable x | | Tuples.cs:18:14:18:14 | access to local variable b | Tuples.cs:18:14:18:14 | (...) ... | +| Tuples.cs:21:9:21:26 | ... = ... | Tuples.cs:21:9:21:26 | SSA def(p) | +| Tuples.cs:21:9:21:26 | ... = ... | Tuples.cs:21:9:21:26 | SSA def(q) | | Tuples.cs:21:9:21:26 | SSA def(p) | Tuples.cs:22:14:22:14 | access to local variable p | | Tuples.cs:21:9:21:26 | SSA def(q) | Tuples.cs:23:14:23:14 | access to local variable q | | Tuples.cs:21:9:21:26 | SSA qualifier def(q.Item1) | Tuples.cs:23:14:23:20 | access to field Item1 | @@ -39,55 +50,65 @@ | Tuples.cs:28:14:28:14 | access to local variable x | Tuples.cs:29:14:29:14 | access to local variable x | | Tuples.cs:28:14:28:20 | access to field Item2 | Tuples.cs:29:14:29:20 | access to field Item2 | | Tuples.cs:28:14:28:26 | access to field Item1 | Tuples.cs:28:14:28:26 | (...) ... | +| Tuples.cs:34:13:34:14 | access to local variable o1 | Tuples.cs:34:13:34:34 | SSA def(o1) | | Tuples.cs:34:13:34:34 | SSA def(o1) | Tuples.cs:37:18:37:19 | access to local variable o1 | -| Tuples.cs:34:18:34:34 | call to method Source | Tuples.cs:34:13:34:34 | SSA def(o1) | +| Tuples.cs:34:18:34:34 | call to method Source | Tuples.cs:34:13:34:14 | access to local variable o1 | | Tuples.cs:34:33:34:33 | 3 | Tuples.cs:34:33:34:33 | (...) ... | +| Tuples.cs:35:13:35:14 | access to local variable o2 | Tuples.cs:35:13:35:34 | SSA def(o2) | | Tuples.cs:35:13:35:34 | SSA def(o2) | Tuples.cs:37:46:37:47 | access to local variable o2 | -| Tuples.cs:35:18:35:34 | call to method Source | Tuples.cs:35:13:35:34 | SSA def(o2) | +| Tuples.cs:35:18:35:34 | call to method Source | Tuples.cs:35:13:35:14 | access to local variable o2 | | Tuples.cs:35:33:35:33 | 4 | Tuples.cs:35:33:35:33 | (...) ... | +| Tuples.cs:37:13:37:13 | access to local variable x | Tuples.cs:37:13:37:48 | SSA def(x) | | Tuples.cs:37:13:37:48 | SSA def(x) | Tuples.cs:38:14:38:14 | access to local variable x | | Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item1) | Tuples.cs:38:14:38:20 | access to field Item1 | | Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item2) | Tuples.cs:39:14:39:20 | access to field Item2 | | Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item10) | Tuples.cs:40:14:40:21 | access to field Item10 | -| Tuples.cs:37:17:37:48 | (..., ...) | Tuples.cs:37:13:37:48 | SSA def(x) | +| Tuples.cs:37:17:37:48 | (..., ...) | Tuples.cs:37:13:37:13 | access to local variable x | | Tuples.cs:38:14:38:14 | [post] access to local variable x | Tuples.cs:39:14:39:14 | access to local variable x | | Tuples.cs:38:14:38:14 | access to local variable x | Tuples.cs:39:14:39:14 | access to local variable x | | Tuples.cs:39:14:39:14 | access to local variable x | Tuples.cs:40:14:40:14 | access to local variable x | | Tuples.cs:39:14:39:20 | access to field Item2 | Tuples.cs:39:14:39:20 | (...) ... | +| Tuples.cs:45:13:45:13 | access to local variable o | Tuples.cs:45:13:45:33 | SSA def(o) | | Tuples.cs:45:13:45:33 | SSA def(o) | Tuples.cs:46:48:46:48 | access to local variable o | -| Tuples.cs:45:17:45:33 | call to method Source | Tuples.cs:45:13:45:33 | SSA def(o) | +| Tuples.cs:45:17:45:33 | call to method Source | Tuples.cs:45:13:45:13 | access to local variable o | | Tuples.cs:45:32:45:32 | 5 | Tuples.cs:45:32:45:32 | (...) ... | +| Tuples.cs:46:13:46:13 | access to local variable x | Tuples.cs:46:13:46:55 | SSA def(x) | | Tuples.cs:46:13:46:55 | SSA def(x) | Tuples.cs:47:14:47:14 | access to local variable x | | Tuples.cs:46:13:46:55 | SSA qualifier def(x.Item1) | Tuples.cs:47:14:47:20 | access to field Item1 | | Tuples.cs:46:13:46:55 | SSA qualifier def(x.Item2) | Tuples.cs:48:14:48:20 | access to field Item2 | -| Tuples.cs:46:17:46:55 | (...) ... | Tuples.cs:46:13:46:55 | SSA def(x) | +| Tuples.cs:46:17:46:55 | (...) ... | Tuples.cs:46:13:46:13 | access to local variable x | | Tuples.cs:46:47:46:55 | (..., ...) | Tuples.cs:46:17:46:55 | (...) ... | | Tuples.cs:46:48:46:48 | access to local variable o | Tuples.cs:50:48:50:48 | access to local variable o | | Tuples.cs:47:14:47:14 | [post] access to local variable x | Tuples.cs:48:14:48:14 | access to local variable x | | Tuples.cs:47:14:47:14 | access to local variable x | Tuples.cs:48:14:48:14 | access to local variable x | | Tuples.cs:48:14:48:20 | access to field Item2 | Tuples.cs:48:14:48:20 | (...) ... | +| Tuples.cs:50:13:50:13 | access to local variable y | Tuples.cs:50:13:50:55 | SSA def(y) | | Tuples.cs:50:13:50:55 | SSA def(y) | Tuples.cs:51:14:51:14 | access to local variable y | | Tuples.cs:50:13:50:55 | SSA qualifier def(y.Item1) | Tuples.cs:51:14:51:20 | access to field Item1 | | Tuples.cs:50:13:50:55 | SSA qualifier def(y.Item2) | Tuples.cs:52:14:52:20 | access to field Item2 | -| Tuples.cs:50:17:50:55 | (...) ... | Tuples.cs:50:13:50:55 | SSA def(y) | +| Tuples.cs:50:17:50:55 | (...) ... | Tuples.cs:50:13:50:13 | access to local variable y | | Tuples.cs:50:47:50:55 | (...) ... | Tuples.cs:50:17:50:55 | (...) ... | | Tuples.cs:50:47:50:55 | (..., ...) | Tuples.cs:50:47:50:55 | (...) ... | | Tuples.cs:51:14:51:14 | [post] access to local variable y | Tuples.cs:52:14:52:14 | access to local variable y | | Tuples.cs:51:14:51:14 | access to local variable y | Tuples.cs:52:14:52:14 | access to local variable y | | Tuples.cs:52:14:52:20 | access to field Item2 | Tuples.cs:52:14:52:20 | (...) ... | | Tuples.cs:55:27:55:27 | s | Tuples.cs:75:18:75:18 | access to parameter s | +| Tuples.cs:57:13:57:14 | access to local variable o1 | Tuples.cs:57:13:57:34 | SSA def(o1) | | Tuples.cs:57:13:57:34 | SSA def(o1) | Tuples.cs:59:18:59:19 | access to local variable o1 | -| Tuples.cs:57:18:57:34 | call to method Source | Tuples.cs:57:13:57:34 | SSA def(o1) | +| Tuples.cs:57:18:57:34 | call to method Source | Tuples.cs:57:13:57:14 | access to local variable o1 | | Tuples.cs:57:33:57:33 | 6 | Tuples.cs:57:33:57:33 | (...) ... | +| Tuples.cs:58:13:58:14 | access to local variable o2 | Tuples.cs:58:13:58:34 | SSA def(o2) | | Tuples.cs:58:13:58:34 | SSA def(o2) | Tuples.cs:59:26:59:27 | access to local variable o2 | -| Tuples.cs:58:18:58:34 | call to method Source | Tuples.cs:58:13:58:34 | SSA def(o2) | +| Tuples.cs:58:18:58:34 | call to method Source | Tuples.cs:58:13:58:14 | access to local variable o2 | | Tuples.cs:58:33:58:33 | 7 | Tuples.cs:58:33:58:33 | (...) ... | +| Tuples.cs:59:13:59:13 | access to local variable x | Tuples.cs:59:13:59:32 | SSA def(x) | | Tuples.cs:59:13:59:32 | SSA def(x) | Tuples.cs:60:17:60:17 | access to local variable x | -| Tuples.cs:59:17:59:32 | (..., ...) | Tuples.cs:59:13:59:32 | SSA def(x) | -| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:62:18:62:57 | SSA def(t) | +| Tuples.cs:59:17:59:32 | (..., ...) | Tuples.cs:59:13:59:13 | access to local variable x | +| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:62:18:62:57 | (String,(Int32,String),Int32) t | | Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:67:18:67:35 | (..., ...) | | Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:67:18:67:35 | (..., ...) | | Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:87:13:87:13 | access to local variable x | +| Tuples.cs:62:18:62:57 | (String,(Int32,String),Int32) t | Tuples.cs:62:18:62:57 | SSA def(t) | | Tuples.cs:62:18:62:57 | SSA def(t) | Tuples.cs:62:64:62:64 | access to local variable t | | Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item1) | Tuples.cs:63:22:63:28 | access to field Item1 | | Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item2) | Tuples.cs:64:22:64:28 | access to field Item2 | @@ -103,24 +124,32 @@ | Tuples.cs:64:22:64:28 | access to field Item2 | Tuples.cs:65:22:65:28 | access to field Item2 | | Tuples.cs:65:22:65:34 | access to field Item1 | Tuples.cs:65:22:65:34 | (...) ... | | Tuples.cs:67:23:67:23 | SSA def(a) | Tuples.cs:68:22:68:22 | access to local variable a | +| Tuples.cs:67:23:67:23 | String a | Tuples.cs:67:23:67:23 | SSA def(a) | +| Tuples.cs:67:27:67:27 | Int32 b | Tuples.cs:67:27:67:27 | SSA def(b) | | Tuples.cs:67:27:67:27 | SSA def(b) | Tuples.cs:70:22:70:22 | access to local variable b | | Tuples.cs:67:30:67:30 | SSA def(c) | Tuples.cs:69:22:69:22 | access to local variable c | +| Tuples.cs:67:30:67:30 | String c | Tuples.cs:67:30:67:30 | SSA def(c) | | Tuples.cs:70:22:70:22 | access to local variable b | Tuples.cs:70:22:70:22 | (...) ... | +| Tuples.cs:74:13:74:14 | access to local variable o3 | Tuples.cs:74:13:74:34 | SSA def(o3) | | Tuples.cs:74:13:74:34 | SSA def(o3) | Tuples.cs:78:51:78:52 | access to local variable o3 | -| Tuples.cs:74:18:74:34 | call to method Source | Tuples.cs:74:13:74:34 | SSA def(o3) | +| Tuples.cs:74:18:74:34 | call to method Source | Tuples.cs:74:13:74:14 | access to local variable o3 | | Tuples.cs:74:33:74:33 | 8 | Tuples.cs:74:33:74:33 | (...) ... | +| Tuples.cs:75:13:75:13 | access to local variable y | Tuples.cs:75:13:75:30 | SSA def(y) | | Tuples.cs:75:13:75:30 | SSA def(y) | Tuples.cs:76:17:76:17 | access to local variable y | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item1) | Tuples.cs:79:22:79:28 | access to field Item1 | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2) | Tuples.cs:80:22:80:28 | access to field Item2 | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2.Item1) | Tuples.cs:82:22:82:34 | access to field Item1 | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2.Item2) | Tuples.cs:80:22:80:34 | access to field Item2 | -| Tuples.cs:75:17:75:30 | (..., ...) | Tuples.cs:75:13:75:30 | SSA def(y) | +| Tuples.cs:75:17:75:30 | (..., ...) | Tuples.cs:75:13:75:13 | access to local variable y | | Tuples.cs:75:18:75:18 | access to parameter s | Tuples.cs:75:25:75:25 | access to parameter s | | Tuples.cs:76:17:76:17 | access to local variable y | Tuples.cs:78:26:78:35 | (..., ...) | | Tuples.cs:76:17:76:17 | access to local variable y | Tuples.cs:79:22:79:22 | access to local variable y | | Tuples.cs:78:19:78:23 | SSA def(a) | Tuples.cs:78:46:78:46 | access to local variable a | +| Tuples.cs:78:19:78:23 | String a | Tuples.cs:78:19:78:23 | SSA def(a) | +| Tuples.cs:78:31:78:31 | Int32 b | Tuples.cs:78:31:78:31 | SSA def(b) | | Tuples.cs:78:31:78:31 | SSA def(b) | Tuples.cs:83:22:83:22 | access to local variable b | | Tuples.cs:78:34:78:34 | SSA def(c) | Tuples.cs:81:22:81:22 | access to local variable c | +| Tuples.cs:78:34:78:34 | String c | Tuples.cs:78:34:78:34 | SSA def(c) | | Tuples.cs:79:22:79:22 | [post] access to local variable y | Tuples.cs:80:22:80:22 | access to local variable y | | Tuples.cs:79:22:79:22 | access to local variable y | Tuples.cs:80:22:80:22 | access to local variable y | | Tuples.cs:80:22:80:22 | [post] access to local variable y | Tuples.cs:82:22:82:22 | access to local variable y | @@ -132,20 +161,27 @@ | Tuples.cs:87:13:87:13 | access to local variable x | Tuples.cs:87:18:87:35 | (..., ...) | | Tuples.cs:87:13:87:13 | access to local variable x | Tuples.cs:87:18:87:35 | (..., ...) | | Tuples.cs:87:23:87:23 | SSA def(p) | Tuples.cs:89:18:89:18 | access to local variable p | +| Tuples.cs:87:23:87:23 | String p | Tuples.cs:87:23:87:23 | SSA def(p) | +| Tuples.cs:87:27:87:27 | Int32 q | Tuples.cs:87:27:87:27 | SSA def(q) | | Tuples.cs:87:27:87:27 | SSA def(q) | Tuples.cs:91:18:91:18 | access to local variable q | | Tuples.cs:87:30:87:30 | SSA def(r) | Tuples.cs:90:18:90:18 | access to local variable r | +| Tuples.cs:87:30:87:30 | String r | Tuples.cs:87:30:87:30 | SSA def(r) | | Tuples.cs:91:18:91:18 | access to local variable q | Tuples.cs:91:18:91:18 | (...) ... | | Tuples.cs:95:12:95:13 | this | Tuples.cs:95:22:95:22 | this | | Tuples.cs:95:22:95:22 | [post] this | Tuples.cs:95:29:95:29 | this | | Tuples.cs:95:22:95:22 | this | Tuples.cs:95:29:95:29 | this | +| Tuples.cs:99:13:99:13 | access to local variable o | Tuples.cs:99:13:99:33 | SSA def(o) | | Tuples.cs:99:13:99:33 | SSA def(o) | Tuples.cs:100:24:100:24 | access to local variable o | -| Tuples.cs:99:17:99:33 | call to method Source | Tuples.cs:99:13:99:33 | SSA def(o) | +| Tuples.cs:99:17:99:33 | call to method Source | Tuples.cs:99:13:99:13 | access to local variable o | | Tuples.cs:99:32:99:32 | 9 | Tuples.cs:99:32:99:32 | (...) ... | +| Tuples.cs:100:13:100:13 | access to local variable r | Tuples.cs:100:13:100:28 | SSA def(r) | | Tuples.cs:100:13:100:28 | SSA def(r) | Tuples.cs:101:14:101:14 | access to local variable r | | Tuples.cs:100:13:100:28 | SSA qualifier def(r.i) | Tuples.cs:101:14:101:16 | access to property i | -| Tuples.cs:100:17:100:28 | object creation of type R1 | Tuples.cs:100:13:100:28 | SSA def(r) | +| Tuples.cs:100:17:100:28 | object creation of type R1 | Tuples.cs:100:13:100:13 | access to local variable r | | Tuples.cs:101:14:101:14 | [post] access to local variable r | Tuples.cs:103:22:103:22 | access to local variable r | | Tuples.cs:101:14:101:14 | access to local variable r | Tuples.cs:103:22:103:22 | access to local variable r | +| Tuples.cs:103:9:103:22 | ... = ... | Tuples.cs:103:9:103:22 | SSA def(a) | +| Tuples.cs:103:9:103:22 | ... = ... | Tuples.cs:103:9:103:22 | SSA def(b) | | Tuples.cs:103:9:103:22 | SSA def(a) | Tuples.cs:104:14:104:14 | access to local variable a | | Tuples.cs:103:9:103:22 | SSA def(b) | Tuples.cs:105:14:105:14 | access to local variable b | | Tuples.cs:103:22:103:22 | access to local variable r | Tuples.cs:103:9:103:18 | (..., ...) | @@ -153,23 +189,38 @@ | Tuples.cs:105:14:105:14 | access to local variable b | Tuples.cs:105:14:105:14 | (...) ... | | Tuples.cs:107:17:107:17 | access to local variable r | Tuples.cs:109:18:109:27 | (..., ...) | | Tuples.cs:109:23:109:23 | SSA def(x) | Tuples.cs:110:22:110:22 | access to local variable x | +| Tuples.cs:109:23:109:23 | String x | Tuples.cs:109:23:109:23 | SSA def(x) | +| Tuples.cs:109:26:109:26 | Int32 y | Tuples.cs:109:26:109:26 | SSA def(y) | | Tuples.cs:109:26:109:26 | SSA def(y) | Tuples.cs:111:22:111:22 | access to local variable y | | Tuples.cs:111:22:111:22 | access to local variable y | Tuples.cs:111:22:111:22 | (...) ... | +| Tuples.cs:118:13:118:13 | access to local variable o | Tuples.cs:118:13:118:33 | SSA def(o) | | Tuples.cs:118:13:118:33 | SSA def(o) | Tuples.cs:121:28:121:28 | access to local variable o | -| Tuples.cs:118:17:118:33 | call to method Source | Tuples.cs:118:13:118:33 | SSA def(o) | +| Tuples.cs:118:17:118:33 | call to method Source | Tuples.cs:118:13:118:13 | access to local variable o | | Tuples.cs:118:32:118:32 | 9 | Tuples.cs:118:32:118:32 | (...) ... | +| Tuples.cs:120:18:120:18 | 0 | Tuples.cs:120:13:120:14 | access to local variable y1 | +| Tuples.cs:121:9:121:32 | ... = ... | Tuples.cs:121:9:121:32 | SSA def(x1) | | Tuples.cs:121:9:121:32 | SSA def(x1) | Tuples.cs:122:14:122:15 | access to local variable x1 | | Tuples.cs:121:27:121:32 | (..., ...) | Tuples.cs:121:9:121:23 | (..., ...) | -| Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:121:9:121:32 | SSA def(x1) | +| Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:121:9:121:32 | ... = ... | | Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:125:25:125:25 | access to local variable o | +| Tuples.cs:121:31:121:31 | 1 | Tuples.cs:121:21:121:22 | access to local variable y1 | +| Tuples.cs:124:18:124:29 | object creation of type Object | Tuples.cs:124:13:124:14 | access to local variable x2 | | Tuples.cs:125:9:125:29 | SSA def(x2) | Tuples.cs:126:14:126:15 | access to local variable x2 | +| Tuples.cs:125:10:125:11 | access to local variable x2 | Tuples.cs:125:9:125:29 | SSA def(x2) | | Tuples.cs:125:24:125:29 | (..., ...) | Tuples.cs:125:9:125:20 | (..., ...) | -| Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:125:9:125:29 | SSA def(x2) | +| Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:125:10:125:11 | access to local variable x2 | | Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:129:31:129:31 | access to local variable o | +| Tuples.cs:125:28:125:28 | 1 | Tuples.cs:125:9:125:29 | ... = ... | +| Tuples.cs:128:18:128:18 | 0 | Tuples.cs:128:13:128:14 | access to local variable x3 | +| Tuples.cs:129:9:129:32 | ... = ... | Tuples.cs:129:9:129:32 | SSA def(y3) | | Tuples.cs:129:9:129:32 | SSA def(y3) | Tuples.cs:130:14:130:15 | access to local variable y3 | | Tuples.cs:129:27:129:32 | (..., ...) | Tuples.cs:129:9:129:23 | (..., ...) | -| Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:129:9:129:32 | SSA def(y3) | +| Tuples.cs:129:28:129:28 | 1 | Tuples.cs:129:10:129:11 | access to local variable x3 | +| Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:129:9:129:32 | ... = ... | | Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:133:28:133:28 | access to local variable o | +| Tuples.cs:132:18:132:29 | object creation of type Object | Tuples.cs:132:13:132:14 | access to local variable y4 | | Tuples.cs:133:9:133:29 | SSA def(y4) | Tuples.cs:134:14:134:15 | access to local variable y4 | +| Tuples.cs:133:18:133:19 | access to local variable y4 | Tuples.cs:133:9:133:29 | SSA def(y4) | | Tuples.cs:133:24:133:29 | (..., ...) | Tuples.cs:133:9:133:20 | (..., ...) | -| Tuples.cs:133:28:133:28 | access to local variable o | Tuples.cs:133:9:133:29 | SSA def(y4) | +| Tuples.cs:133:25:133:25 | 1 | Tuples.cs:133:9:133:29 | ... = ... | +| Tuples.cs:133:28:133:28 | access to local variable o | Tuples.cs:133:18:133:19 | access to local variable y4 | diff --git a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected index 97fb24fb239..7cbddb9d3d5 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected @@ -369,7 +369,6 @@ Tuples.cs: # 95| -1: [TypeMention] string # 95| 1: [Parameter] j # 95| -1: [TypeMention] int -# 95| 4: [BlockStmt] {...} # 95| 16: [Property] i # 95| 3: [Getter] get_i # 95| 4: [Setter] set_i diff --git a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected index e93d25ad84a..e1036342255 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected @@ -1,61 +1,61 @@ testFailures edges -| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | -| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | -| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | -| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | +| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:7:13:7:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:7:13:7:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | +| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:8:13:8:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:8:13:8:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | -| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | provenance | | -| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | provenance | | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:10:16:10 | access to local variable a : Object | provenance | | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:10:16:10 | access to local variable a : Object | provenance | | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | -| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | provenance | | -| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | +| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:17:16:17 | access to local variable c : Object | provenance | | +| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:17:16:17 | access to local variable c : Object | provenance | | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | provenance | | | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | provenance | | | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:20 | access to field Item1 | provenance | | @@ -66,14 +66,22 @@ edges | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | provenance | | | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | provenance | | -| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | -| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | -| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | -| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | +| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:34:13:34:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:34:13:34:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | +| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:35:13:35:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:35:13:35:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | provenance | | @@ -82,129 +90,141 @@ edges | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:20 | access to field Item1 | provenance | | | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | provenance | | | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | provenance | | -| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | -| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | -| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | -| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:45:13:45:13 | access to local variable o : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | +| Tuples.cs:45:13:45:13 | access to local variable o : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | +| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:45:13:45:13 | access to local variable o : String | provenance | | +| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:45:13:45:13 | access to local variable o : String | provenance | | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | provenance | | | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | provenance | | -| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | -| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | -| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | -| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | +| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:57:13:57:14 | access to local variable o1 : String | provenance | | +| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:57:13:57:14 | access to local variable o1 : String | provenance | | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | +| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:58:13:58:14 | access to local variable o2 : String | provenance | | +| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:58:13:58:14 | access to local variable o2 : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | | Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | provenance | | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | provenance | | | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | provenance | | | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | -| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | -| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | -| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | -| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:99:13:99:13 | access to local variable o : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | +| Tuples.cs:99:13:99:13 | access to local variable o : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | +| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:99:13:99:13 | access to local variable o : String | provenance | | +| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:99:13:99:13 | access to local variable o : String | provenance | | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | provenance | | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | provenance | | | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:16 | access to property i | provenance | | | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:16 | access to property i | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | -| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | provenance | | -| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | provenance | | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:118:13:118:13 | access to local variable o : Object | provenance | | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:118:13:118:13 | access to local variable o : Object | provenance | | +| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | -| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | provenance | | -| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | provenance | | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | +| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | -| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | provenance | | -| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | provenance | | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | provenance | | -| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | provenance | | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | +| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | nodes +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | Tuples.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | Tuples.cs:8:18:8:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:8:18:8:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | semmle.label | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | semmle.label | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | @@ -221,10 +241,6 @@ nodes | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | | Tuples.cs:12:14:12:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:12:14:12:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:14:14:14:14 | access to local variable c | semmle.label | access to local variable c | @@ -233,12 +249,12 @@ nodes | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | semmle.label | access to local variable a : Object | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | semmle.label | access to local variable a : Object | | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | semmle.label | access to local variable c : Object | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | semmle.label | access to local variable c : Object | | Tuples.cs:17:14:17:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:17:14:17:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:19:14:19:14 | access to local variable c | semmle.label | access to local variable c | @@ -247,10 +263,6 @@ nodes | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | semmle.label | SSA def(p) : Object | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | semmle.label | SSA def(p) : Object | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | semmle.label | SSA def(q) : ValueTuple [field Item2] : Object | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | semmle.label | SSA def(q) : ValueTuple [field Item2] : Object | | Tuples.cs:22:14:22:14 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:22:14:22:14 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | semmle.label | access to local variable q : ValueTuple [field Item2] : Object | @@ -271,10 +283,18 @@ nodes | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | semmle.label | access to field Item2 : ValueTuple [field Item2] : Object | | Tuples.cs:29:14:29:26 | access to field Item2 | semmle.label | access to field Item2 | | Tuples.cs:29:14:29:26 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | Tuples.cs:34:18:34:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:34:18:34:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | Tuples.cs:35:18:35:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:35:18:35:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | semmle.label | access to local variable x : ValueTuple> [field Item10] : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | semmle.label | access to local variable x : ValueTuple> [field Item10] : Object | | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | semmle.label | (..., ...) : ValueTuple> [field Item10] : Object | @@ -291,8 +311,12 @@ nodes | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | semmle.label | access to local variable x : ValueTuple> [field Item10] : Object | | Tuples.cs:40:14:40:21 | access to field Item10 | semmle.label | access to field Item10 | | Tuples.cs:40:14:40:21 | access to field Item10 | semmle.label | access to field Item10 | +| Tuples.cs:45:13:45:13 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:45:13:45:13 | access to local variable o : String | semmle.label | access to local variable o : String | | Tuples.cs:45:17:45:33 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:45:17:45:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | semmle.label | access to local variable x : ValueTuple [field Item1] : String | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | semmle.label | access to local variable x : ValueTuple [field Item1] : String | | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | semmle.label | (...) ... : ValueTuple [field Item1] : String | | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | semmle.label | (...) ... : ValueTuple [field Item1] : String | | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | @@ -303,10 +327,18 @@ nodes | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | semmle.label | access to local variable x : ValueTuple [field Item1] : String | | Tuples.cs:47:14:47:20 | access to field Item1 | semmle.label | access to field Item1 | | Tuples.cs:47:14:47:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | semmle.label | access to local variable o1 : String | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | semmle.label | access to local variable o1 : String | | Tuples.cs:57:18:57:34 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:57:18:57:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | | Tuples.cs:58:18:58:34 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:58:18:58:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | @@ -317,10 +349,6 @@ nodes | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | semmle.label | (..., ...) : ValueTuple [field Item2] : String | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item1] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item1] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable t : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable t : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:63:22:63:28 | access to field Item1 | semmle.label | access to field Item1 | @@ -337,10 +365,6 @@ nodes | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | | Tuples.cs:68:22:68:22 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:68:22:68:22 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:69:22:69:22 | access to local variable c | semmle.label | access to local variable c | @@ -351,16 +375,18 @@ nodes | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | | Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | | Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | +| Tuples.cs:95:22:95:22 | i : String | semmle.label | i : String | +| Tuples.cs:95:22:95:22 | i : String | semmle.label | i : String | +| Tuples.cs:99:13:99:13 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:99:13:99:13 | access to local variable o : String | semmle.label | access to local variable o : String | | Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | semmle.label | access to local variable r : R1 [property i] : String | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | semmle.label | access to local variable r : R1 [property i] : String | | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | semmle.label | object creation of type R1 : R1 [property i] : String | | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | semmle.label | object creation of type R1 : R1 [property i] : String | | Tuples.cs:100:24:100:24 | access to local variable o : String | semmle.label | access to local variable o : String | @@ -369,12 +395,12 @@ nodes | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | semmle.label | access to local variable r : R1 [property i] : String | | Tuples.cs:101:14:101:16 | access to property i | semmle.label | access to property i | | Tuples.cs:101:14:101:16 | access to property i | semmle.label | access to property i | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Tuples.cs:118:17:118:33 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:118:17:118:33 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | semmle.label | SSA def(x1) : Object | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | semmle.label | SSA def(x1) : Object | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:28:121:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -383,8 +409,8 @@ nodes | Tuples.cs:122:14:122:15 | access to local variable x1 | semmle.label | access to local variable x1 | | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | semmle.label | SSA def(x2) : Object | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | semmle.label | SSA def(x2) : Object | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | semmle.label | access to local variable x2 : Object | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | semmle.label | access to local variable x2 : Object | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:25:125:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -393,8 +419,6 @@ nodes | Tuples.cs:126:14:126:15 | access to local variable x2 | semmle.label | access to local variable x2 | | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | semmle.label | SSA def(y3) : Object | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | semmle.label | SSA def(y3) : Object | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:31:129:31 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -403,8 +427,8 @@ nodes | Tuples.cs:130:14:130:15 | access to local variable y3 | semmle.label | access to local variable y3 | | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | semmle.label | SSA def(y4) : Object | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | semmle.label | SSA def(y4) : Object | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | semmle.label | access to local variable y4 : Object | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | semmle.label | access to local variable y4 : Object | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:28:133:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -412,6 +436,8 @@ nodes | Tuples.cs:134:14:134:15 | access to local variable y4 | semmle.label | access to local variable y4 | | Tuples.cs:134:14:134:15 | access to local variable y4 | semmle.label | access to local variable y4 | subpaths +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | #select | Tuples.cs:12:14:12:14 | access to local variable a | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:12:14:12:14 | access to local variable a | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | | Tuples.cs:12:14:12:14 | access to local variable a | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:12:14:12:14 | access to local variable a | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | diff --git a/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected b/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected index cb7792957a8..d71043a4667 100644 --- a/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected +++ b/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected @@ -16,8 +16,10 @@ edges | TypeFlowDispatch.cs:29:37:29:37 | l : List [element] : String | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:39:34:39:34 | x : String | provenance | | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:39:34:39:34 | x : String | provenance | | -| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | -| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | provenance | | | TypeFlowDispatch.cs:36:42:36:52 | call to method Source : String | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:36:42:36:52 | call to method Source : String | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:29:37:29:37 | l : List [element] : String | provenance | | @@ -38,18 +40,18 @@ edges | TypeFlowDispatch.cs:57:38:57:48 | call to method Source : String | TypeFlowDispatch.cs:47:46:47:46 | x : String | provenance | | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | provenance | | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | -| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | provenance | | -| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | provenance | | +| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | +| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | TypeFlowDispatch.cs:52:32:52:32 | t : String | provenance | | | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | TypeFlowDispatch.cs:52:32:52:32 | t : String | provenance | | | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | provenance | | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | provenance | | -| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | -| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | provenance | | | TypeFlowDispatch.cs:74:42:74:52 | call to method Source : String | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:74:42:74:52 | call to method Source : String | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | provenance | | @@ -73,6 +75,8 @@ nodes | TypeFlowDispatch.cs:29:37:29:37 | l : List [element] : String | semmle.label | l : List [element] : String | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:36:42:36:52 | call to method Source : String | semmle.label | call to method Source : String | @@ -99,8 +103,6 @@ nodes | TypeFlowDispatch.cs:57:38:57:48 | call to method Source : String | semmle.label | call to method Source : String | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | semmle.label | l : List [element] : String | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | semmle.label | l : List [element] : String | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | semmle.label | access to local variable x : String | @@ -109,6 +111,8 @@ nodes | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | semmle.label | l : List [element] : String | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:74:42:74:52 | call to method Source : String | semmle.label | call to method Source : String | diff --git a/csharp/ql/test/library-tests/dataflow/types/Types.expected b/csharp/ql/test/library-tests/dataflow/types/Types.expected index 1c35152bc26..5d085ceb823 100644 --- a/csharp/ql/test/library-tests/dataflow/types/Types.expected +++ b/csharp/ql/test/library-tests/dataflow/types/Types.expected @@ -16,11 +16,10 @@ edges | Types.cs:38:12:38:18 | object creation of type D : D | Types.cs:67:25:67:25 | x : D | provenance | | | Types.cs:39:12:39:18 | object creation of type D : D | Types.cs:69:25:69:25 | x : D | provenance | | | Types.cs:40:12:40:18 | object creation of type D : D | Types.cs:71:25:71:25 | x : D | provenance | | -| Types.cs:43:20:43:23 | null : null | Types.cs:44:14:44:14 | access to local variable o | provenance | | -| Types.cs:47:22:47:22 | a : C | Types.cs:49:18:49:20 | SSA def(c) : C | provenance | | -| Types.cs:49:18:49:20 | SSA def(c) : C | Types.cs:50:18:50:18 | access to local variable c | provenance | | -| Types.cs:53:22:53:22 | a : D | Types.cs:57:18:57:20 | SSA def(d) : D | provenance | | -| Types.cs:57:18:57:20 | SSA def(d) : D | Types.cs:58:22:58:22 | access to local variable d | provenance | | +| Types.cs:43:16:43:16 | access to local variable o : null | Types.cs:44:14:44:14 | access to local variable o | provenance | | +| Types.cs:43:20:43:23 | null : null | Types.cs:43:16:43:16 | access to local variable o : null | provenance | | +| Types.cs:47:22:47:22 | a : C | Types.cs:50:18:50:18 | access to local variable c | provenance | | +| Types.cs:53:22:53:22 | a : D | Types.cs:58:22:58:22 | access to local variable d | provenance | | | Types.cs:63:22:63:22 | a : C | Types.cs:63:33:63:36 | (...) ... | provenance | | | Types.cs:65:25:65:25 | x : C | Types.cs:65:36:65:36 | access to parameter x | provenance | | | Types.cs:65:25:65:25 | x : D | Types.cs:65:36:65:36 | access to parameter x | provenance | | @@ -29,10 +28,10 @@ edges | Types.cs:69:25:69:25 | x : C | Types.cs:69:52:69:52 | access to parameter x | provenance | | | Types.cs:69:25:69:25 | x : D | Types.cs:69:52:69:52 | access to parameter x | provenance | | | Types.cs:71:25:71:25 | x : D | Types.cs:73:21:73:21 | (...) ... : D | provenance | | -| Types.cs:73:21:73:21 | (...) ... : D | Types.cs:74:9:74:9 | access to local variable d : D | provenance | | +| Types.cs:73:17:73:17 | access to local variable d : D | Types.cs:74:9:74:9 | access to local variable d : D | provenance | | +| Types.cs:73:21:73:21 | (...) ... : D | Types.cs:73:17:73:17 | access to local variable d : D | provenance | | | Types.cs:74:9:74:9 | access to local variable d : D | Types.cs:16:30:16:30 | this : D | provenance | | -| Types.cs:77:22:77:22 | a : C | Types.cs:79:18:79:25 | SSA def(b) : C | provenance | | -| Types.cs:79:18:79:25 | SSA def(b) : C | Types.cs:80:18:80:18 | access to local variable b | provenance | | +| Types.cs:77:22:77:22 | a : C | Types.cs:80:18:80:18 | access to local variable b | provenance | | | Types.cs:90:22:90:22 | e : Types+E.E2 | Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | provenance | | | Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | Types.cs:93:13:93:16 | this access : Types+E [field Field] : Types+E.E2 | provenance | | | Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | provenance | | @@ -40,8 +39,10 @@ edges | Types.cs:110:25:110:32 | object creation of type E2 : Types+E.E2 | Types.cs:90:22:90:22 | e : Types+E.E2 | provenance | | | Types.cs:113:34:113:34 | this : Types+E [field Field] : Types+E.E2 | Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | provenance | | | Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | Types.cs:115:22:115:31 | access to field Field | provenance | | -| Types.cs:120:25:120:31 | object creation of type A : A | Types.cs:122:30:122:30 | access to local variable a : A | provenance | | -| Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | provenance | | +| Types.cs:120:21:120:21 | access to local variable a : A | Types.cs:122:30:122:30 | access to local variable a : A | provenance | | +| Types.cs:120:25:120:31 | object creation of type A : A | Types.cs:120:21:120:21 | access to local variable a : A | provenance | | +| Types.cs:121:21:121:22 | access to local variable e2 : Types+E.E2 | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | provenance | | +| Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | Types.cs:121:21:121:22 | access to local variable e2 : Types+E.E2 | provenance | | | Types.cs:122:30:122:30 | access to local variable a : A | Types.cs:122:22:122:31 | call to method Through | provenance | | | Types.cs:122:30:122:30 | access to local variable a : A | Types.cs:130:34:130:34 | x : A | provenance | | | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | Types.cs:123:22:123:32 | call to method Through | provenance | | @@ -76,13 +77,12 @@ nodes | Types.cs:38:12:38:18 | object creation of type D : D | semmle.label | object creation of type D : D | | Types.cs:39:12:39:18 | object creation of type D : D | semmle.label | object creation of type D : D | | Types.cs:40:12:40:18 | object creation of type D : D | semmle.label | object creation of type D : D | +| Types.cs:43:16:43:16 | access to local variable o : null | semmle.label | access to local variable o : null | | Types.cs:43:20:43:23 | null : null | semmle.label | null : null | | Types.cs:44:14:44:14 | access to local variable o | semmle.label | access to local variable o | | Types.cs:47:22:47:22 | a : C | semmle.label | a : C | -| Types.cs:49:18:49:20 | SSA def(c) : C | semmle.label | SSA def(c) : C | | Types.cs:50:18:50:18 | access to local variable c | semmle.label | access to local variable c | | Types.cs:53:22:53:22 | a : D | semmle.label | a : D | -| Types.cs:57:18:57:20 | SSA def(d) : D | semmle.label | SSA def(d) : D | | Types.cs:58:22:58:22 | access to local variable d | semmle.label | access to local variable d | | Types.cs:63:22:63:22 | a : C | semmle.label | a : C | | Types.cs:63:33:63:36 | (...) ... | semmle.label | (...) ... | @@ -96,10 +96,10 @@ nodes | Types.cs:69:25:69:25 | x : D | semmle.label | x : D | | Types.cs:69:52:69:52 | access to parameter x | semmle.label | access to parameter x | | Types.cs:71:25:71:25 | x : D | semmle.label | x : D | +| Types.cs:73:17:73:17 | access to local variable d : D | semmle.label | access to local variable d : D | | Types.cs:73:21:73:21 | (...) ... : D | semmle.label | (...) ... : D | | Types.cs:74:9:74:9 | access to local variable d : D | semmle.label | access to local variable d : D | | Types.cs:77:22:77:22 | a : C | semmle.label | a : C | -| Types.cs:79:18:79:25 | SSA def(b) : C | semmle.label | SSA def(b) : C | | Types.cs:80:18:80:18 | access to local variable b | semmle.label | access to local variable b | | Types.cs:90:22:90:22 | e : Types+E.E2 | semmle.label | e : Types+E.E2 | | Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | semmle.label | [post] this access : Types+E [field Field] : Types+E.E2 | @@ -109,7 +109,9 @@ nodes | Types.cs:113:34:113:34 | this : Types+E [field Field] : Types+E.E2 | semmle.label | this : Types+E [field Field] : Types+E.E2 | | Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | semmle.label | this access : Types+E [field Field] : Types+E.E2 | | Types.cs:115:22:115:31 | access to field Field | semmle.label | access to field Field | +| Types.cs:120:21:120:21 | access to local variable a : A | semmle.label | access to local variable a : A | | Types.cs:120:25:120:31 | object creation of type A : A | semmle.label | object creation of type A : A | +| Types.cs:121:21:121:22 | access to local variable e2 : Types+E.E2 | semmle.label | access to local variable e2 : Types+E.E2 | | Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | semmle.label | object creation of type E2 : Types+E.E2 | | Types.cs:122:22:122:31 | call to method Through | semmle.label | call to method Through | | Types.cs:122:30:122:30 | access to local variable a : A | semmle.label | access to local variable a : A | diff --git a/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected b/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected index d6224193f87..4e3c34780fe 100644 --- a/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected +++ b/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected @@ -8,3 +8,24 @@ | expressions.cs:481:20:481:22 | Num | expressions.cs:481:20:481:22 | call to constructor Object | file://:0:0:0:0 | Object | | expressions.cs:518:11:518:17 | ClassC1 | expressions.cs:518:11:518:17 | call to constructor Object | file://:0:0:0:0 | Object | | expressions.cs:520:11:520:17 | ClassC2 | expressions.cs:520:33:520:44 | call to constructor ClassC1 | expressions.cs:518:11:518:17 | ClassC1 | +| file://:0:0:0:0 | Button | expressions.cs:227:18:227:23 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | C | expressions.cs:207:11:207:11 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Contact | expressions.cs:372:18:372:24 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Digit | expressions.cs:306:19:306:23 | call to constructor ValueType | file://:0:0:0:0 | ValueType | +| file://:0:0:0:0 | ExpressionDepth | expressions.cs:495:11:495:25 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | FoldedLiterals | FoldedLiterals.cs:1:7:1:20 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | MethodAccess | MethodAccess.cs:3:7:3:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | MyInlineArray | expressions.cs:513:12:513:24 | call to constructor ValueType | file://:0:0:0:0 | ValueType | +| file://:0:0:0:0 | OperatorCalls | expressions.cs:463:11:463:23 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Point | expressions.cs:341:18:341:22 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Qualifiers | Qualifiers.cs:3:7:3:16 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Rectangle | expressions.cs:351:18:351:26 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Rectangle2 | expressions.cs:361:18:361:27 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | ReducedClass | ReducedExpression.cs:2:7:2:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TestConversionOperator | expressions.cs:330:11:330:32 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TestCreations | expressions.cs:383:18:383:30 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TestUnaryOperator | expressions.cs:292:11:292:27 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TupleExprs | expressions.cs:501:11:501:20 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | X | expressions.cs:108:15:108:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | X | expressions.cs:216:18:216:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Y | expressions.cs:104:15:104:21 | call to constructor Object | file://:0:0:0:0 | Object | diff --git a/csharp/ql/test/library-tests/expressions/PrintAst.expected b/csharp/ql/test/library-tests/expressions/PrintAst.expected index d6e677602e3..e865a36d549 100644 --- a/csharp/ql/test/library-tests/expressions/PrintAst.expected +++ b/csharp/ql/test/library-tests/expressions/PrintAst.expected @@ -2411,7 +2411,6 @@ expressions.cs: #-----| 2: (Parameters) # 518| 0: [Parameter] oc1 # 518| -1: [TypeMention] object -# 518| 4: [BlockStmt] {...} # 520| 23: [Class] ClassC2 #-----| 3: (Base types) # 520| 0: [TypeMention] ClassC1 @@ -2421,4 +2420,3 @@ expressions.cs: # 520| -1: [TypeMention] object # 520| 3: [ConstructorInitializer] call to constructor ClassC1 # 520| 0: [ParameterAccess] access to parameter oc2 -# 520| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected b/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected index 62380abf312..191dd35f976 100644 --- a/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected +++ b/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected @@ -1,3 +1,5 @@ +| A.cs:4:7:4:8 | C1 | A.cs:4:7:4:8 | {...} | +| A.cs:4:7:4:8 | C1 | B.cs:1:7:1:8 | {...} | | A.cs:6:22:6:31 | get_P1 | A.cs:6:22:6:31 | throw ... | | A.cs:6:22:6:31 | get_P1 | B.cs:3:22:3:22 | 0 | | A.cs:7:21:7:23 | get_P2 | A.cs:7:25:7:39 | {...} | @@ -23,11 +25,17 @@ | A.cs:22:6:22:7 | ~C2 | B.cs:20:11:20:25 | {...} | | A.cs:23:28:23:35 | implicit conversion | A.cs:23:50:23:53 | null | | A.cs:23:28:23:35 | implicit conversion | B.cs:21:50:21:59 | throw ... | +| A.cs:28:7:28:8 | C3 | A.cs:28:7:28:8 | {...} | +| A.cs:28:7:28:8 | C3 | B.cs:25:7:25:8 | {...} | | A.cs:30:21:30:23 | get_P3 | A.cs:30:28:30:37 | throw ... | +| A.cs:34:15:34:16 | C4 | A.cs:34:15:34:16 | {...} | +| A.cs:34:15:34:16 | C4 | C.cs:1:15:1:16 | {...} | | A.cs:36:9:36:10 | M1 | A.cs:36:14:36:28 | {...} | | A.cs:36:9:36:10 | M1 | B.cs:32:17:32:17 | 0 | | A.cs:37:9:37:10 | M2 | A.cs:37:14:37:28 | {...} | | A.cs:37:9:37:10 | M2 | C.cs:3:17:3:17 | 0 | +| B.cs:1:7:1:8 | C1 | A.cs:4:7:4:8 | {...} | +| B.cs:1:7:1:8 | C1 | B.cs:1:7:1:8 | {...} | | B.cs:3:22:3:22 | get_P1 | A.cs:6:22:6:31 | throw ... | | B.cs:3:22:3:22 | get_P1 | B.cs:3:22:3:22 | 0 | | B.cs:4:21:4:23 | get_P2 | A.cs:7:25:7:39 | {...} | @@ -53,8 +61,12 @@ | B.cs:20:6:20:7 | ~C2 | B.cs:20:11:20:25 | {...} | | B.cs:21:28:21:35 | implicit conversion | A.cs:23:50:23:53 | null | | B.cs:21:28:21:35 | implicit conversion | B.cs:21:50:21:59 | throw ... | +| B.cs:25:7:25:8 | C3 | A.cs:28:7:28:8 | {...} | +| B.cs:25:7:25:8 | C3 | B.cs:25:7:25:8 | {...} | | B.cs:27:21:27:23 | get_P3 | A.cs:30:28:30:37 | throw ... | | B.cs:32:9:32:10 | M1 | A.cs:36:14:36:28 | {...} | | B.cs:32:9:32:10 | M1 | B.cs:32:17:32:17 | 0 | +| C.cs:1:15:1:16 | C4 | A.cs:34:15:34:16 | {...} | +| C.cs:1:15:1:16 | C4 | C.cs:1:15:1:16 | {...} | | C.cs:3:9:3:10 | M2 | A.cs:37:14:37:28 | {...} | | C.cs:3:9:3:10 | M2 | C.cs:3:17:3:17 | 0 | diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected index b4b4cf6f129..5af67fea01b 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected @@ -1,23 +1,28 @@ edges -| EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:58:17:58:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:58:17:58:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:61:24:61:32 | "tainted" : String | EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:80:17:80:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:80:17:80:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:83:24:83:32 | "tainted" : String | EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:102:17:102:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:102:17:102:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:105:24:105:32 | "tainted" : String | EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:193:35:193:35 | p : Person [property Name] : String | provenance | | -| EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFramework.cs:121:17:121:18 | access to local variable p1 : Person [property Title] : String | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | EntityFramework.cs:121:17:121:18 | access to local variable p1 : Person [property Title] : String | provenance | | | EntityFramework.cs:124:25:124:33 | "tainted" : String | EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | provenance | | | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | EntityFramework.cs:129:18:129:25 | access to property Title | provenance | | -| EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFramework.cs:140:17:140:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFramework.cs:140:17:140:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | provenance | | | EntityFramework.cs:143:21:146:21 | object creation of type Address : Address [property Street] : String | EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | provenance | | @@ -33,7 +38,8 @@ edges | EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
[element, property Street] : String | provenance | | | EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:161:31:161:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:156:17:156:18 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:161:31:161:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:156:17:156:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFramework.cs:159:26:159:34 | "tainted" : String | EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | provenance | | | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | @@ -47,12 +53,16 @@ edges | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
[element, property Street] : String | provenance | | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:172:17:172:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:172:17:172:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:175:24:175:32 | "tainted" : String | EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | provenance | | -| EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:177:17:177:18 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:177:17:177:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFramework.cs:180:26:180:34 | "tainted" : String | EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | provenance | | -| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | -| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | provenance | | | EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | provenance | | @@ -82,33 +92,39 @@ edges | EntityFramework.cs:219:18:219:36 | call to method First : Person [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
[element, property Street] : String | provenance | | | EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
[element, property Street] : String | EntityFramework.cs:219:18:219:54 | call to method First
: Address [property Street] : String | provenance | | | EntityFramework.cs:219:18:219:54 | call to method First
: Address [property Street] : String | EntityFramework.cs:219:18:219:61 | access to property Street | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | provenance | | +| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | provenance | | | EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | EntityFrameworkCore.cs:84:18:84:46 | (...) ... | provenance | | | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | provenance | | | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | provenance | | | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | provenance | | -| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:91:17:91:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:91:17:91:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:113:17:113:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:113:17:113:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:135:17:135:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:135:17:135:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:226:35:226:35 | p : Person [property Name] : String | provenance | | -| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFrameworkCore.cs:154:17:154:18 | access to local variable p1 : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | EntityFrameworkCore.cs:154:17:154:18 | access to local variable p1 : Person [property Title] : String | provenance | | | EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | provenance | | | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | provenance | | -| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFrameworkCore.cs:173:17:173:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:173:17:173:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | provenance | | | EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address : Address [property Street] : String | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | provenance | | @@ -124,7 +140,8 @@ edges | EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
[element, property Street] : String | provenance | | | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:189:17:189:18 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:189:17:189:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | @@ -138,12 +155,16 @@ edges | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
[element, property Street] : String | provenance | | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:205:17:205:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:205:17:205:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | provenance | | -| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:210:17:210:18 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:210:17:210:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | provenance | | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | provenance | | | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | provenance | | @@ -174,25 +195,30 @@ edges | EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses : ICollection
[element, property Street] : String | EntityFrameworkCore.cs:252:18:252:54 | call to method First
: Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:252:18:252:54 | call to method First
: Address [property Street] : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | provenance | | nodes +| EntityFramework.cs:58:17:58:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:61:24:61:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:80:17:80:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:83:24:83:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:102:17:102:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:105:24:105:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:121:17:121:18 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | semmle.label | { ..., ... } : Person [property Title] : String | | EntityFramework.cs:124:25:124:33 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFramework.cs:129:18:129:25 | access to property Title | semmle.label | access to property Title | +| EntityFramework.cs:140:17:140:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | semmle.label | { ..., ... } : Person [property Addresses, element, property Street] : String | | EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | semmle.label | array creation of type Address[] : null [element, property Street] : String | | EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | semmle.label | { ..., ... } : null [element, property Street] : String | @@ -204,6 +230,7 @@ nodes | EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:156:17:156:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFramework.cs:159:26:159:34 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | @@ -213,10 +240,14 @@ nodes | EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:172:17:172:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:175:24:175:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFramework.cs:177:17:177:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFramework.cs:180:26:180:34 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | semmle.label | { ..., ... } : PersonAddressMap [property Address, property Street] : String | | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | semmle.label | { ..., ... } : PersonAddressMap [property Person, property Name] : String | | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | @@ -247,6 +278,7 @@ nodes | EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
[element, property Street] : String | semmle.label | access to property Addresses : ICollection
[element, property Street] : String | | EntityFramework.cs:219:18:219:54 | call to method First
: Address [property Street] : String | semmle.label | call to method First
: Address [property Street] : String | | EntityFramework.cs:219:18:219:61 | access to property Street | semmle.label | access to property Street | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | semmle.label | access to local variable taintSource | | EntityFrameworkCore.cs:84:18:84:46 | (...) ... | semmle.label | (...) ... | @@ -255,25 +287,30 @@ nodes | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | semmle.label | (...) ... | | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | semmle.label | call to operator implicit conversion : RawSqlString | | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | +| EntityFrameworkCore.cs:91:17:91:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:113:17:113:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:135:17:135:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:154:17:154:18 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | semmle.label | { ..., ... } : Person [property Title] : String | | EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | semmle.label | access to property Title | +| EntityFrameworkCore.cs:173:17:173:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | semmle.label | { ..., ... } : Person [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | semmle.label | array creation of type Address[] : null [element, property Street] : String | | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | semmle.label | { ..., ... } : null [element, property Street] : String | @@ -285,6 +322,7 @@ nodes | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:189:17:189:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | @@ -294,10 +332,14 @@ nodes | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:205:17:205:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:210:17:210:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | semmle.label | { ..., ... } : PersonAddressMap [property Address, property Street] : String | | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | semmle.label | { ..., ... } : PersonAddressMap [property Person, property Name] : String | | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | diff --git a/csharp/ql/test/library-tests/goto/Goto1.expected b/csharp/ql/test/library-tests/goto/Goto1.expected index 94901f29063..e6c124726a3 100644 --- a/csharp/ql/test/library-tests/goto/Goto1.expected +++ b/csharp/ql/test/library-tests/goto/Goto1.expected @@ -1,3 +1,7 @@ +| goto.cs:2:7:2:10 | call to constructor Object | goto.cs:2:7:2:10 | {...} | semmle.label | successor | +| goto.cs:2:7:2:10 | enter Goto | goto.cs:2:7:2:10 | call to constructor Object | semmle.label | successor | +| goto.cs:2:7:2:10 | exit Goto (normal) | goto.cs:2:7:2:10 | exit Goto | semmle.label | successor | +| goto.cs:2:7:2:10 | {...} | goto.cs:2:7:2:10 | exit Goto (normal) | semmle.label | successor | | goto.cs:4:17:4:20 | enter Main | goto.cs:5:5:20:5 | {...} | semmle.label | successor | | goto.cs:4:17:4:20 | exit Main (normal) | goto.cs:4:17:4:20 | exit Main | semmle.label | successor | | goto.cs:5:5:20:5 | {...} | goto.cs:6:9:8:9 | {...} | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/nullable/NullableExpressions.expected b/csharp/ql/test/library-tests/nullable/NullableExpressions.expected index 039bd71087e..675450ab2ee 100644 --- a/csharp/ql/test/library-tests/nullable/NullableExpressions.expected +++ b/csharp/ql/test/library-tests/nullable/NullableExpressions.expected @@ -1,3 +1,4 @@ +| 1 | 14 | nullable.cs:1:14:1:21 | Nullable | nullable.cs:1:14:1:21 | call to constructor Object | Object | | 5 | 13 | nullable.cs:5:9:6:24 | if (...) ... | nullable.cs:5:13:5:21 | ... == ... | Boolean | | 5 | 13 | nullable.cs:5:13:5:21 | ... == ... | nullable.cs:5:13:5:13 | access to parameter x | Nullable | | 5 | 18 | nullable.cs:5:13:5:21 | ... == ... | nullable.cs:5:18:5:21 | null | null | diff --git a/csharp/ql/test/library-tests/parameters/ParameterModifiers.cs b/csharp/ql/test/library-tests/parameters/ParameterModifiers.cs new file mode 100644 index 00000000000..b3db266b938 --- /dev/null +++ b/csharp/ql/test/library-tests/parameters/ParameterModifiers.cs @@ -0,0 +1,18 @@ +using System; + +public class ParameterModifiers +{ + public void M1(object p1) { } + public void M2(in object p2) { } + + public void M3(out object p3) + { + p3 = new object(); + } + + public void M4(ref object p4) { } + + public void M5(params object[] p5) { } + + public void M6(ref readonly object p6) { } +} diff --git a/csharp/ql/test/library-tests/parameters/ParameterModifiers.expected b/csharp/ql/test/library-tests/parameters/ParameterModifiers.expected new file mode 100644 index 00000000000..83e94bf278d --- /dev/null +++ b/csharp/ql/test/library-tests/parameters/ParameterModifiers.expected @@ -0,0 +1,19 @@ +parameterModifier +| ParameterModifiers.cs:5:27:5:28 | p1 | 0 | +| ParameterModifiers.cs:6:30:6:31 | p2 | 5 | +| ParameterModifiers.cs:8:31:8:32 | p3 | 2 | +| ParameterModifiers.cs:13:31:13:32 | p4 | 1 | +| ParameterModifiers.cs:15:36:15:37 | p5 | 3 | +| ParameterModifiers.cs:17:40:17:41 | p6 | 6 | +parameterIsValue +| ParameterModifiers.cs:5:27:5:28 | p1 | +parameterIsIn +| ParameterModifiers.cs:6:30:6:31 | p2 | +parameterIsOut +| ParameterModifiers.cs:8:31:8:32 | p3 | +parameterIsRef +| ParameterModifiers.cs:13:31:13:32 | p4 | +parameterIsParams +| ParameterModifiers.cs:15:36:15:37 | p5 | +parameterIsReadonlyRef +| ParameterModifiers.cs:17:40:17:41 | p6 | diff --git a/csharp/ql/test/library-tests/parameters/ParameterModifiers.ql b/csharp/ql/test/library-tests/parameters/ParameterModifiers.ql new file mode 100644 index 00000000000..b83eb202161 --- /dev/null +++ b/csharp/ql/test/library-tests/parameters/ParameterModifiers.ql @@ -0,0 +1,19 @@ +import csharp + +class TestParameter extends Parameter { + TestParameter() { this.getFile().getBaseName() = "ParameterModifiers.cs" } +} + +query predicate parameterModifier(TestParameter p, int kind) { params(p, _, _, _, kind, _, _) } + +query predicate parameterIsValue(TestParameter p) { p.isValue() } + +query predicate parameterIsIn(TestParameter p) { p.isIn() } + +query predicate parameterIsOut(TestParameter p) { p.isOut() } + +query predicate parameterIsRef(TestParameter p) { p.isRef() } + +query predicate parameterIsParams(TestParameter p) { p.isParams() } + +query predicate parameterIsReadonlyRef(TestParameter p) { p.isReadonlyRef() } diff --git a/csharp/ql/test/library-tests/parameters/Parameters.ql b/csharp/ql/test/library-tests/parameters/Parameters.ql index 209cdc12577..771fd83721b 100644 --- a/csharp/ql/test/library-tests/parameters/Parameters.ql +++ b/csharp/ql/test/library-tests/parameters/Parameters.ql @@ -1,7 +1,10 @@ import csharp private predicate fromTestLocation(Element e) { - e.fromSource() or e.getFile().getStem() = "Parameters" + e.fromSource() and + e.getFile().getBaseName() = ["Parameters.cs", "LambdaParameters.cs"] + or + e.getFile().getStem() = "Parameters" } private predicate compilerGeneratedAttribute(Parameterizable container) { diff --git a/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected b/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected index 4402dbc1d34..fab1dec1100 100644 --- a/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected +++ b/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected @@ -1,3 +1,7 @@ +| ControlFlow.cs:3:7:3:9 | call to constructor Object | ControlFlow.cs:3:7:3:9 | {...} | +| ControlFlow.cs:3:7:3:9 | enter Cfg | ControlFlow.cs:3:7:3:9 | call to constructor Object | +| ControlFlow.cs:3:7:3:9 | exit Cfg (normal) | ControlFlow.cs:3:7:3:9 | exit Cfg | +| ControlFlow.cs:3:7:3:9 | {...} | ControlFlow.cs:3:7:3:9 | exit Cfg (normal) | | ControlFlow.cs:5:10:5:10 | enter F | ControlFlow.cs:6:5:11:5 | {...} | | ControlFlow.cs:5:10:5:10 | exit F (normal) | ControlFlow.cs:5:10:5:10 | exit F | | ControlFlow.cs:6:5:11:5 | {...} | ControlFlow.cs:7:9:7:34 | ... ...; | diff --git a/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected b/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected index efc5b7b081d..a87b151ad5d 100644 --- a/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected +++ b/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected @@ -37,6 +37,7 @@ extractorMessages | errors.cs:22:31:22:40 | Unable to resolve target for call. (Compilation error?) | | errors.cs:22:38:22:39 | Failed to determine type | | errors.cs:55:20:55:20 | Failed to determine type | +| errors.cs:79:11:79:12 | Unable to resolve implicit constructor initializer call | | errors.cs:91:45:91:45 | Failed to determine type | | errors.cs:91:45:91:45 | Failed to resolve name | | errors.cs:92:45:92:45 | Failed to determine type | diff --git a/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected b/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected index ee30381b24d..a4a2aa6e7a8 100644 --- a/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected +++ b/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected @@ -1,6 +1,10 @@ +| errors.cs:13:11:13:12 | errors.cs:13:11:13:12 | call to constructor Object | Object | | errors.cs:22:31:22:40 | errors.cs:22:31:22:40 | call to method | none | | errors.cs:41:21:41:28 | errors.cs:41:21:41:28 | object creation of type C1 | C1 | | errors.cs:42:13:42:19 | errors.cs:42:13:42:19 | call to method m1 | m1 | | errors.cs:43:13:43:19 | errors.cs:43:13:43:19 | call to method m2 | m2 | | errors.cs:44:13:44:38 | errors.cs:44:13:44:38 | call to method WriteLine | WriteLine | +| errors.cs:48:11:48:12 | errors.cs:48:11:48:12 | call to constructor Object | Object | | errors.cs:51:17:51:25 | errors.cs:51:17:51:25 | object creation of type C2 | none | +| errors.cs:65:11:65:12 | errors.cs:65:11:65:12 | call to constructor Object | Object | +| errors.cs:70:11:70:12 | errors.cs:70:11:70:12 | call to constructor Object | Object | diff --git a/csharp/ql/test/library-tests/statements/CompilerGenerated.expected b/csharp/ql/test/library-tests/statements/CompilerGenerated.expected new file mode 100644 index 00000000000..26ad2f9db10 --- /dev/null +++ b/csharp/ql/test/library-tests/statements/CompilerGenerated.expected @@ -0,0 +1,3 @@ +| fixed.cs:3:7:3:11 | {...} | fixed.cs:3:7:3:11 | Fixed | +| statements.cs:7:11:7:15 | {...} | statements.cs:7:11:7:15 | Class | +| statements.cs:243:15:243:25 | {...} | statements.cs:243:15:243:25 | AccountLock | diff --git a/csharp/ql/test/library-tests/statements/CompilerGenerated.ql b/csharp/ql/test/library-tests/statements/CompilerGenerated.ql new file mode 100644 index 00000000000..259e0ed84e8 --- /dev/null +++ b/csharp/ql/test/library-tests/statements/CompilerGenerated.ql @@ -0,0 +1,5 @@ +import csharp + +from Stmt stmt +where stmt.isCompilerGenerated() +select stmt, stmt.getEnclosingCallable() diff --git a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected index cdabf17445b..9d3c935266a 100644 --- a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected +++ b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected @@ -51,6 +51,8 @@ same | StructuralComparison.cs:49:18:49:26 | access to property Prop | StructuralComparison.cs:51:18:51:26 | access to property Prop | | StructuralComparison.cs:50:18:50:21 | access to property Prop | StructuralComparison.cs:51:18:51:26 | access to property Prop | gvn +| StructuralComparison.cs:3:14:3:18 | call to constructor Object | (kind:Expr(79)) | +| StructuralComparison.cs:3:14:3:18 | {...} | (kind:Stmt(1)) | | StructuralComparison.cs:5:26:5:26 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:5:26:5:26 | this access | (kind:Expr(12)) | | StructuralComparison.cs:5:26:5:30 | ... = ... | ((kind:Expr(16),true,x) :: (0 :: (kind:Expr(63)))) | @@ -145,6 +147,10 @@ gvn | StructuralComparison.cs:28:12:28:12 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:28:15:28:15 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:28:15:28:15 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:32:14:32:22 | call to constructor Object | (kind:Expr(79)) | +| StructuralComparison.cs:32:14:32:22 | {...} | (kind:Stmt(1)) | +| StructuralComparison.cs:38:14:38:25 | call to constructor BaseClass | (kind:Expr(79)) | +| StructuralComparison.cs:38:14:38:25 | {...} | (kind:Stmt(1)) | | StructuralComparison.cs:41:5:45:5 | {...} | ((((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | | StructuralComparison.cs:42:9:42:28 | ... ...; | (((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:42:13:42:14 | access to local variable x1 | (kind:Expr(14),false,x1) | diff --git a/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected b/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected index 5ff0ff32c21..72846a3bea1 100644 --- a/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected +++ b/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected @@ -1,9 +1,11 @@ edges -| Program.cs:15:27:15:38 | ... + ... : Int32 | Program.cs:17:37:17:43 | access to local variable endYear | provenance | | +| Program.cs:15:17:15:23 | access to local variable endYear : Int32 | Program.cs:17:37:17:43 | access to local variable endYear | provenance | | +| Program.cs:15:27:15:38 | ... + ... : Int32 | Program.cs:15:17:15:23 | access to local variable endYear : Int32 | provenance | | | Program.cs:23:31:23:34 | year : Int32 | Program.cs:26:39:26:42 | access to parameter year | provenance | | | Program.cs:33:18:33:29 | ... - ... : Int32 | Program.cs:23:31:23:34 | year : Int32 | provenance | | nodes | Program.cs:13:39:13:50 | ... - ... | semmle.label | ... - ... | +| Program.cs:15:17:15:23 | access to local variable endYear : Int32 | semmle.label | access to local variable endYear : Int32 | | Program.cs:15:27:15:38 | ... + ... : Int32 | semmle.label | ... + ... : Int32 | | Program.cs:17:37:17:43 | access to local variable endYear | semmle.label | access to local variable endYear | | Program.cs:23:31:23:34 | year : Int32 | semmle.label | year : Int32 | diff --git a/csharp/ql/test/query-tests/Nullness/E.cs b/csharp/ql/test/query-tests/Nullness/E.cs index ec2dee0d66f..ec1fa161392 100644 --- a/csharp/ql/test/query-tests/Nullness/E.cs +++ b/csharp/ql/test/query-tests/Nullness/E.cs @@ -420,14 +420,14 @@ public class E static bool Ex43(int? i, IEnumerable @is) { if (i.HasValue) - return @is.Any(j => j == i.Value); // GOOD + return @is.Any(j => j == i.Value); // GOOD (FALSE POSITIVE) return false; } static bool Ex44(int? i, IEnumerable @is) { if (i.HasValue) - @is = @is.Where(j => j == i.Value); // BAD (always) (FALSE NEGATIVE) + @is = @is.Where(j => j == i.Value); // BAD (always) i = null; return @is.Any(); } diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected index 3789903e8b5..631c2cd7766 100644 --- a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected +++ b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected @@ -408,6 +408,10 @@ nodes | E.cs:405:16:405:16 | access to local variable i | | E.cs:417:24:417:40 | SSA capture def(i) | | E.cs:417:34:417:34 | access to parameter i | +| E.cs:423:28:423:44 | SSA capture def(i) | +| E.cs:423:38:423:38 | access to parameter i | +| E.cs:430:29:430:45 | SSA capture def(i) | +| E.cs:430:39:430:39 | access to parameter i | | E.cs:435:29:435:29 | SSA param(s) | | E.cs:437:13:437:21 | [true] ... is ... | | E.cs:439:13:439:13 | access to parameter s | @@ -803,6 +807,8 @@ edges | E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i | | E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i | | E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | +| E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i | +| E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i | | E.cs:435:29:435:29 | SSA param(s) | E.cs:437:13:437:21 | [true] ... is ... | | E.cs:437:13:437:21 | [true] ... is ... | E.cs:439:13:439:13 | access to parameter s | | Forwarding.cs:7:16:7:23 | SSA def(s) | Forwarding.cs:9:13:9:30 | [false] !... | @@ -919,6 +925,8 @@ edges | E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:58:382:67 | ... == ... | this | | E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:384:27:384:36 | ... == ... | this | | E.cs:417:34:417:34 | access to parameter i | E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:415:27:415:27 | i | i | E.cs:415:27:415:27 | i | this | +| E.cs:423:38:423:38 | access to parameter i | E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:420:27:420:27 | i | i | E.cs:420:27:420:27 | i | this | +| E.cs:430:39:430:39 | access to parameter i | E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:427:27:427:27 | i | i | E.cs:427:27:427:27 | i | this | | GuardedString.cs:35:31:35:31 | access to local variable s | GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:35:31:35:31 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | GuardedString.cs:7:16:7:16 | s | s | GuardedString.cs:7:16:7:32 | String s = ... | this | | NullMaybeBad.cs:7:27:7:27 | access to parameter o | NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o | Variable $@ may be null at this access because of $@ null argument. | NullMaybeBad.cs:5:25:5:25 | o | o | NullMaybeBad.cs:13:17:13:20 | null | this | | Params.cs:14:17:14:20 | access to parameter args | Params.cs:20:12:20:15 | null | Params.cs:14:17:14:20 | access to parameter args | Variable $@ may be null at this access because of $@ null argument. | Params.cs:12:36:12:39 | args | args | Params.cs:20:12:20:15 | null | this | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected b/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected index 10a233c2c82..5c6dad11f8b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected @@ -1,8 +1,10 @@ edges +| UntrustedData.cs:9:13:9:16 | access to local variable name : String | UntrustedData.cs:13:28:13:31 | access to local variable name | provenance | | +| UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:9:13:9:16 | access to local variable name : String | provenance | | | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:9:20:9:50 | access to indexer : String | provenance | | -| UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:13:28:13:31 | access to local variable name | provenance | | -| UntrustedData.cs:9:20:9:50 | access to indexer : String | UntrustedData.cs:13:28:13:31 | access to local variable name | provenance | | +| UntrustedData.cs:9:20:9:50 | access to indexer : String | UntrustedData.cs:9:13:9:16 | access to local variable name : String | provenance | | nodes +| UntrustedData.cs:9:13:9:16 | access to local variable name : String | semmle.label | access to local variable name : String | | UntrustedData.cs:9:20:9:30 | access to property Request | semmle.label | access to property Request | | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UntrustedData.cs:9:20:9:50 | access to indexer : String | semmle.label | access to indexer : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected b/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected index e3bc1c2dd1b..7369d77178b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected @@ -1,26 +1,24 @@ edges +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:12:50:12:53 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:17:51:17:54 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:25:30:25:33 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:31:30:31:33 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:51:26:51:29 | access to local variable path | provenance | | +| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:10:16:10:19 | access to local variable path : String | provenance | | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:10:23:10:53 | access to indexer : String | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:12:50:12:53 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:17:51:17:54 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:25:30:25:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:31:30:31:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:36:25:36:31 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:38:49:38:55 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:51:26:51:29 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:12:50:12:53 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:17:51:17:54 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:25:30:25:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:31:30:31:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:36:25:36:31 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:38:49:38:55 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:51:26:51:29 | access to local variable path | provenance | | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:10:16:10:19 | access to local variable path : String | provenance | | +| TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | TaintedPath.cs:36:25:36:31 | access to local variable badPath | provenance | | +| TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | TaintedPath.cs:38:49:38:55 | access to local variable badPath | provenance | | nodes +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | semmle.label | access to local variable path : String | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | TaintedPath.cs:10:23:10:53 | access to indexer : String | semmle.label | access to indexer : String | | TaintedPath.cs:12:50:12:53 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:17:51:17:54 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:25:30:25:33 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:31:30:31:33 | access to local variable path | semmle.label | access to local variable path | +| TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | semmle.label | access to local variable badPath : String | | TaintedPath.cs:36:25:36:31 | access to local variable badPath | semmle.label | access to local variable badPath | | TaintedPath.cs:38:49:38:55 | access to local variable badPath | semmle.label | access to local variable badPath | | TaintedPath.cs:51:26:51:29 | access to local variable path | semmle.label | access to local variable path | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected b/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected index 9e7f0cbc237..69bd71e4401 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected @@ -1,56 +1,69 @@ edges -| ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | provenance | | -| ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | provenance | | +| ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | provenance | | +| ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | provenance | | +| ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | provenance | | | ZipSlip.cs:15:52:15:65 | access to property FullName : String | ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | provenance | | -| ZipSlip.cs:18:31:18:44 | access to property FullName : String | ZipSlip.cs:22:71:22:74 | access to local variable file : String | provenance | | -| ZipSlip.cs:22:43:22:75 | call to method Combine : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | provenance | | +| ZipSlip.cs:18:24:18:27 | access to local variable file : String | ZipSlip.cs:22:71:22:74 | access to local variable file : String | provenance | | +| ZipSlip.cs:18:31:18:44 | access to property FullName : String | ZipSlip.cs:18:24:18:27 | access to local variable file : String | provenance | | +| ZipSlip.cs:22:28:22:39 | access to local variable destFileName : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | provenance | | +| ZipSlip.cs:22:43:22:75 | call to method Combine : String | ZipSlip.cs:22:28:22:39 | access to local variable destFileName : String | provenance | | | ZipSlip.cs:22:71:22:74 | access to local variable file : String | ZipSlip.cs:22:43:22:75 | call to method Combine : String | provenance | | -| ZipSlip.cs:30:43:30:79 | call to method Combine : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:30:43:30:79 | call to method Combine : String | ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:30:43:30:79 | call to method Combine : String | ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | provenance | | | ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | ZipSlip.cs:30:43:30:79 | call to method Combine : String | provenance | | -| ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:38:21:38:32 | access to local variable destFilePath : String | ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | ZipSlip.cs:38:21:38:32 | access to local variable destFilePath : String | provenance | | | ZipSlip.cs:38:53:38:89 | call to method Combine : String | ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | provenance | | | ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | ZipSlip.cs:38:53:38:89 | call to method Combine : String | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | provenance | | | ZipSlip.cs:61:72:61:85 | access to property FullName : String | ZipSlip.cs:61:47:61:86 | call to method Combine : String | provenance | | -| ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | provenance | | +| ZipSlipBad.cs:9:16:9:27 | access to local variable destFileName : String | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | provenance | | +| ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | ZipSlipBad.cs:9:16:9:27 | access to local variable destFileName : String | provenance | | | ZipSlipBad.cs:9:59:9:72 | access to property FullName : String | ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | provenance | | nodes -| ZipSlip.cs:15:44:15:75 | call to method GetFullPath : String | semmle.label | call to method GetFullPath : String | -| ZipSlip.cs:15:61:15:74 | access to property FullName : String | semmle.label | access to property FullName : String | -| ZipSlip.cs:18:53:18:66 | access to property FullName : String | semmle.label | access to property FullName : String | -| ZipSlip.cs:22:43:22:97 | call to method Combine : String | semmle.label | call to method Combine : String | -| ZipSlip.cs:22:71:22:96 | access to local variable file_badDirectoryTraversal : String | semmle.label | access to local variable file_badDirectoryTraversal : String | +| ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | semmle.label | access to local variable fullPath : String | +| ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | semmle.label | call to method GetFullPath : String | +| ZipSlip.cs:15:52:15:65 | access to property FullName : String | semmle.label | access to property FullName : String | +| ZipSlip.cs:18:24:18:27 | access to local variable file : String | semmle.label | access to local variable file : String | +| ZipSlip.cs:18:31:18:44 | access to property FullName : String | semmle.label | access to property FullName : String | +| ZipSlip.cs:22:28:22:39 | access to local variable destFileName : String | semmle.label | access to local variable destFileName : String | +| ZipSlip.cs:22:43:22:75 | call to method Combine : String | semmle.label | call to method Combine : String | +| ZipSlip.cs:22:71:22:74 | access to local variable file : String | semmle.label | access to local variable file : String | | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | semmle.label | access to local variable destFileName | -| ZipSlip.cs:30:43:30:88 | call to method Combine : String | semmle.label | call to method Combine : String | -| ZipSlip.cs:30:71:30:87 | access to local variable fullPath_relative : String | semmle.label | access to local variable fullPath_relative : String | +| ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | semmle.label | access to local variable destFilePath : String | +| ZipSlip.cs:30:43:30:79 | call to method Combine : String | semmle.label | call to method Combine : String | +| ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | semmle.label | access to local variable fullPath : String | | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | -| ZipSlip.cs:39:45:39:73 | access to local variable destFilePath_notCanonicalized | semmle.label | access to local variable destFilePath_notCanonicalized | -| ZipSlip.cs:58:31:58:75 | call to method Combine : String | semmle.label | call to method Combine : String | -| ZipSlip.cs:58:61:58:74 | access to property FullName : String | semmle.label | access to property FullName : String | -| ZipSlip.cs:62:33:62:40 | access to local variable fullpath | semmle.label | access to local variable fullpath | -| ZipSlip.cs:71:37:71:44 | access to local variable fullpath | semmle.label | access to local variable fullpath | -| ZipSlip.cs:105:47:105:86 | call to method Combine : String | semmle.label | call to method Combine : String | -| ZipSlip.cs:105:72:105:85 | access to property FullName : String | semmle.label | access to property FullName : String | -| ZipSlip.cs:112:74:112:85 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | -| ZipSlip.cs:119:71:119:82 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | -| ZipSlip.cs:126:57:126:68 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | -| ZipSlip.cs:134:58:134:69 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:38:21:38:32 | access to local variable destFilePath : String | semmle.label | access to local variable destFilePath : String | +| ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | semmle.label | call to method GetFullPath : String | +| ZipSlip.cs:38:53:38:89 | call to method Combine : String | semmle.label | call to method Combine : String | +| ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | semmle.label | access to local variable fullPath : String | +| ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | semmle.label | access to local variable destFilePath : String | +| ZipSlip.cs:61:47:61:86 | call to method Combine : String | semmle.label | call to method Combine : String | +| ZipSlip.cs:61:72:61:85 | access to property FullName : String | semmle.label | access to property FullName : String | +| ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlipBad.cs:9:16:9:27 | access to local variable destFileName : String | semmle.label | access to local variable destFileName : String | | ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | semmle.label | call to method Combine : String | | ZipSlipBad.cs:9:59:9:72 | access to property FullName : String | semmle.label | access to property FullName : String | | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | semmle.label | access to local variable destFileName | subpaths #select -| ZipSlip.cs:15:61:15:74 | access to property FullName | ZipSlip.cs:15:61:15:74 | access to property FullName : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | file system operation | -| ZipSlip.cs:15:61:15:74 | access to property FullName | ZipSlip.cs:15:61:15:74 | access to property FullName : String | ZipSlip.cs:39:45:39:73 | access to local variable destFilePath_notCanonicalized | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:39:45:39:73 | access to local variable destFilePath_notCanonicalized | file system operation | -| ZipSlip.cs:18:53:18:66 | access to property FullName | ZipSlip.cs:18:53:18:66 | access to property FullName : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | file system operation | -| ZipSlip.cs:58:61:58:74 | access to property FullName | ZipSlip.cs:58:61:58:74 | access to property FullName : String | ZipSlip.cs:62:33:62:40 | access to local variable fullpath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:62:33:62:40 | access to local variable fullpath | file system operation | -| ZipSlip.cs:58:61:58:74 | access to property FullName | ZipSlip.cs:58:61:58:74 | access to property FullName : String | ZipSlip.cs:71:37:71:44 | access to local variable fullpath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:71:37:71:44 | access to local variable fullpath | file system operation | -| ZipSlip.cs:105:72:105:85 | access to property FullName | ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:112:74:112:85 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:112:74:112:85 | access to local variable destFilePath | file system operation | -| ZipSlip.cs:105:72:105:85 | access to property FullName | ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:119:71:119:82 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:119:71:119:82 | access to local variable destFilePath | file system operation | -| ZipSlip.cs:105:72:105:85 | access to property FullName | ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:126:57:126:68 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:126:57:126:68 | access to local variable destFilePath | file system operation | -| ZipSlip.cs:105:72:105:85 | access to property FullName | ZipSlip.cs:105:72:105:85 | access to property FullName : String | ZipSlip.cs:134:58:134:69 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:134:58:134:69 | access to local variable destFilePath | file system operation | +| ZipSlip.cs:15:52:15:65 | access to property FullName | ZipSlip.cs:15:52:15:65 | access to property FullName : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | file system operation | +| ZipSlip.cs:15:52:15:65 | access to property FullName | ZipSlip.cs:15:52:15:65 | access to property FullName : String | ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | file system operation | +| ZipSlip.cs:15:52:15:65 | access to property FullName | ZipSlip.cs:15:52:15:65 | access to property FullName : String | ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | file system operation | +| ZipSlip.cs:18:31:18:44 | access to property FullName | ZipSlip.cs:18:31:18:44 | access to property FullName : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | file system operation | +| ZipSlip.cs:61:72:61:85 | access to property FullName | ZipSlip.cs:61:72:61:85 | access to property FullName : String | ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | file system operation | +| ZipSlip.cs:61:72:61:85 | access to property FullName | ZipSlip.cs:61:72:61:85 | access to property FullName : String | ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | file system operation | +| ZipSlip.cs:61:72:61:85 | access to property FullName | ZipSlip.cs:61:72:61:85 | access to property FullName : String | ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | file system operation | +| ZipSlip.cs:61:72:61:85 | access to property FullName | ZipSlip.cs:61:72:61:85 | access to property FullName : String | ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | file system operation | | ZipSlipBad.cs:9:59:9:72 | access to property FullName | ZipSlipBad.cs:9:59:9:72 | access to property FullName : String | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | file system operation | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected index fc1da3ba7c6..11b83a0ae20 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected @@ -1,18 +1,20 @@ edges +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:26:27:26:47 | ... + ... | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:26:50:26:66 | ... + ... | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | provenance | | | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:25:32:25:51 | access to property Text : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:26:27:26:47 | ... + ... | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:26:50:26:66 | ... + ... | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | CommandInjection.cs:29:27:29:35 | access to local variable startInfo | provenance | | +| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:28:30:28:38 | access to local variable startInfo : ProcessStartInfo | CommandInjection.cs:29:27:29:35 | access to local variable startInfo | provenance | | +| CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | CommandInjection.cs:28:30:28:38 | access to local variable startInfo : ProcessStartInfo | provenance | | | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | provenance | | | CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | provenance | | | CommandInjection.cs:32:13:32:26 | [post] access to local variable startInfoProps : ProcessStartInfo | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | provenance | | @@ -22,10 +24,12 @@ edges | CommandInjection.cs:34:13:34:26 | [post] access to local variable startInfoProps : ProcessStartInfo | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | provenance | | | CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | CommandInjection.cs:34:13:34:26 | [post] access to local variable startInfoProps : ProcessStartInfo | provenance | | nodes +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | CommandInjection.cs:25:32:25:51 | access to property Text : String | semmle.label | access to property Text : String | | CommandInjection.cs:26:27:26:47 | ... + ... | semmle.label | ... + ... | | CommandInjection.cs:26:50:26:66 | ... + ... | semmle.label | ... + ... | +| CommandInjection.cs:28:30:28:38 | access to local variable startInfo : ProcessStartInfo | semmle.label | access to local variable startInfo : ProcessStartInfo | | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | semmle.label | object creation of type ProcessStartInfo : ProcessStartInfo | | CommandInjection.cs:28:63:28:71 | access to local variable userInput | semmle.label | access to local variable userInput | | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected index 1e1c6258c89..759128d0670 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected @@ -1,10 +1,11 @@ edges -| Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | Index.cshtml:14:16:14:22 | call to operator implicit conversion | provenance | | +| Index.cshtml:5:9:5:15 | access to local variable message : StringValues | Index.cshtml:14:16:14:22 | call to operator implicit conversion | provenance | | +| Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | Index.cshtml:5:9:5:15 | access to local variable message : StringValues | provenance | | +| XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | provenance | | +| XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | provenance | | +| XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | provenance | | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:19:25:19:52 | access to indexer : String | provenance | | -| XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | provenance | | -| XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | provenance | | -| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | provenance | | -| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | provenance | | +| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | provenance | | | XSSAspNet.cs:43:28:43:46 | access to property QueryString : NameValueCollection | XSSAspNet.cs:43:28:43:55 | access to indexer | provenance | | | XSSAspNetCore.cs:21:52:21:64 | access to property Query : IQueryCollection | XSSAspNetCore.cs:21:52:21:76 | call to operator implicit conversion | provenance | | | XSSAspNetCore.cs:40:56:40:58 | foo : String | XSSAspNetCore.cs:44:51:44:53 | access to parameter foo | provenance | | @@ -15,8 +16,10 @@ edges | XSSAspNetCore.cs:61:44:61:63 | access to indexer : StringValues | XSSAspNetCore.cs:61:44:61:66 | access to indexer | provenance | | | XSSAspNetCore.cs:72:51:72:65 | access to property Headers : IHeaderDictionary | XSSAspNetCore.cs:72:51:72:72 | call to operator implicit conversion | provenance | | nodes +| Index.cshtml:5:9:5:15 | access to local variable message : StringValues | semmle.label | access to local variable message : StringValues | | Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | semmle.label | access to property Query : IQueryCollection | | Index.cshtml:14:16:14:22 | call to operator implicit conversion | semmle.label | call to operator implicit conversion | +| XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | semmle.label | access to local variable sayHi : String | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSSAspNet.cs:19:25:19:52 | access to indexer : String | semmle.label | access to indexer : String | | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | semmle.label | access to local variable sayHi | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected index e3c29b08316..d04a3ae03ed 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected @@ -7,24 +7,29 @@ edges | XSS.cs:26:32:26:40 | access to local variable userInput : StringBuilder | XSS.cs:26:32:26:51 | call to method ToString | provenance | | | XSS.cs:27:29:27:37 | access to local variable userInput : StringBuilder | XSS.cs:27:29:27:48 | call to method ToString | provenance | | | XSS.cs:28:26:28:34 | access to local variable userInput : StringBuilder | XSS.cs:28:26:28:45 | call to method ToString | provenance | | +| XSS.cs:37:20:37:23 | access to local variable name : String | XSS.cs:38:36:38:39 | access to local variable name | provenance | | +| XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:37:20:37:23 | access to local variable name : String | provenance | | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:37:27:37:61 | access to indexer : String | provenance | | -| XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:38:36:38:39 | access to local variable name | provenance | | -| XSS.cs:37:27:37:61 | access to indexer : String | XSS.cs:38:36:38:39 | access to local variable name | provenance | | +| XSS.cs:37:27:37:61 | access to indexer : String | XSS.cs:37:20:37:23 | access to local variable name : String | provenance | | +| XSS.cs:57:20:57:23 | access to local variable name : String | XSS.cs:59:22:59:25 | access to local variable name | provenance | | +| XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:57:20:57:23 | access to local variable name : String | provenance | | | XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:57:27:57:73 | access to indexer : String | provenance | | -| XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:59:22:59:25 | access to local variable name | provenance | | -| XSS.cs:57:27:57:73 | access to indexer : String | XSS.cs:59:22:59:25 | access to local variable name | provenance | | +| XSS.cs:57:27:57:73 | access to indexer : String | XSS.cs:57:20:57:23 | access to local variable name : String | provenance | | +| XSS.cs:75:20:75:23 | access to local variable name : String | XSS.cs:76:36:76:39 | access to local variable name | provenance | | +| XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:75:20:75:23 | access to local variable name : String | provenance | | | XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:75:27:75:61 | access to indexer : String | provenance | | -| XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:76:36:76:39 | access to local variable name | provenance | | -| XSS.cs:75:27:75:61 | access to indexer : String | XSS.cs:76:36:76:39 | access to local variable name | provenance | | -| XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | XSS.cs:79:36:79:40 | access to local variable name2 | provenance | | +| XSS.cs:75:27:75:61 | access to indexer : String | XSS.cs:75:20:75:23 | access to local variable name : String | provenance | | +| XSS.cs:78:20:78:24 | access to local variable name2 : String | XSS.cs:79:36:79:40 | access to local variable name2 | provenance | | +| XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | XSS.cs:78:20:78:24 | access to local variable name2 : String | provenance | | +| XSS.cs:85:20:85:23 | access to local variable name : String | XSS.cs:86:28:86:31 | access to local variable name | provenance | | +| XSS.cs:85:20:85:23 | access to local variable name : String | XSS.cs:87:31:87:34 | access to local variable name | provenance | | +| XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:85:20:85:23 | access to local variable name : String | provenance | | | XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:85:27:85:61 | access to indexer : String | provenance | | -| XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:86:28:86:31 | access to local variable name | provenance | | -| XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:87:31:87:34 | access to local variable name | provenance | | -| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:86:28:86:31 | access to local variable name | provenance | | -| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:87:31:87:34 | access to local variable name | provenance | | +| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:85:20:85:23 | access to local variable name : String | provenance | | +| XSS.cs:94:20:94:23 | access to local variable name : String | XSS.cs:95:31:95:34 | access to local variable name | provenance | | +| XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:94:20:94:23 | access to local variable name : String | provenance | | | XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:94:27:94:61 | access to indexer : String | provenance | | -| XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:95:31:95:34 | access to local variable name | provenance | | -| XSS.cs:94:27:94:61 | access to indexer : String | XSS.cs:95:31:95:34 | access to local variable name | provenance | | +| XSS.cs:94:27:94:61 | access to indexer : String | XSS.cs:94:20:94:23 | access to local variable name : String | provenance | | | script.aspx:12:1:12:14 | <%= ... %> | script.aspx:12:1:12:14 | <%= ... %> | provenance | | | script.aspx:16:1:16:34 | <%= ... %> | script.aspx:16:1:16:34 | <%= ... %> | provenance | | | script.aspx:20:1:20:41 | <%= ... %> | script.aspx:20:1:20:41 | <%= ... %> | provenance | | @@ -38,21 +43,27 @@ nodes | XSS.cs:27:29:27:48 | call to method ToString | semmle.label | call to method ToString | | XSS.cs:28:26:28:34 | access to local variable userInput : StringBuilder | semmle.label | access to local variable userInput : StringBuilder | | XSS.cs:28:26:28:45 | call to method ToString | semmle.label | call to method ToString | +| XSS.cs:37:20:37:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:37:27:37:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:38:36:38:39 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:57:20:57:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:57:27:57:73 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:59:22:59:25 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:75:20:75:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:75:27:75:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:76:36:76:39 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:78:20:78:24 | access to local variable name2 : String | semmle.label | access to local variable name2 : String | | XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | semmle.label | access to property Request : HttpRequestBase | | XSS.cs:79:36:79:40 | access to local variable name2 | semmle.label | access to local variable name2 | +| XSS.cs:85:20:85:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:85:27:85:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:86:28:86:31 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:87:31:87:34 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:94:20:94:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:94:27:94:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:95:31:95:34 | access to local variable name | semmle.label | access to local variable name | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected index c2ce4a209f6..fccccdb3c73 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected @@ -1,35 +1,51 @@ edges | SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | provenance | | -| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | provenance | | -| SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | provenance | | +| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | provenance | | +| SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | provenance | | | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | provenance | | | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | provenance | | -| SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | provenance | | +| SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | provenance | | +| SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | provenance | | | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | provenance | | -| SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | provenance | | -| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | -| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | provenance | | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | provenance | | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | provenance | | -| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | provenance | | -| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | +| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | provenance | | nodes | SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | semmle.label | ... + ... | | SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | semmle.label | call to method GetString : String | +| SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | | SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | semmle.label | object creation of type FileStream : FileStream | +| SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | semmle.label | object creation of type StreamReader : StreamReader | | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | +| SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | +| SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | semmle.label | call to method Trim : String | | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | semmle.label | access to local variable sql | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | semmle.label | object creation of type FileStream : FileStream | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | semmle.label | object creation of type StreamReader : StreamReader | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | semmle.label | call to method Trim : String | | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | semmle.label | access to local variable sql | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected index 9ef1a073fbe..4b4da20c97a 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected @@ -1,68 +1,98 @@ edges +| SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | SqlInjection.cs:34:50:34:55 | access to local variable query1 | provenance | | | SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:33:21:33:40 | access to property Text : String | provenance | | -| SqlInjection.cs:33:21:33:40 | access to property Text : String | SqlInjection.cs:34:50:34:55 | access to local variable query1 | provenance | | +| SqlInjection.cs:33:21:33:40 | access to property Text : String | SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | provenance | | +| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | SqlInjection.cs:69:56:69:61 | access to local variable query1 | provenance | | +| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | SqlInjection.cs:70:55:70:60 | access to local variable query1 | provenance | | | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:68:33:68:52 | access to property Text : String | provenance | | -| SqlInjection.cs:68:33:68:52 | access to property Text : String | SqlInjection.cs:69:56:69:61 | access to local variable query1 | provenance | | -| SqlInjection.cs:68:33:68:52 | access to property Text : String | SqlInjection.cs:70:55:70:60 | access to local variable query1 | provenance | | -| SqlInjection.cs:82:21:82:29 | access to property Text : String | SqlInjection.cs:83:50:83:55 | access to local variable query1 | provenance | | -| SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString | provenance | | -| SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | provenance | | -| SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:94:50:94:52 | access to local variable cmd | provenance | | +| SqlInjection.cs:68:33:68:52 | access to property Text : String | SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | provenance | | +| SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | SqlInjection.cs:83:50:83:55 | access to local variable query1 | provenance | | +| SqlInjection.cs:82:21:82:29 | access to property Text : String | SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | provenance | | +| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString | provenance | | +| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | provenance | | +| SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | provenance | | +| SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:94:50:94:52 | access to local variable cmd | provenance | | +| SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | provenance | | | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | provenance | | -| SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:47:86:47:94 | access to property Text : String | SqlInjectionDapper.cs:49:47:49:51 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:38:21:38:25 | access to local variable query : String | SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | SqlInjectionDapper.cs:38:21:38:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:47:21:47:25 | access to local variable query : String | SqlInjectionDapper.cs:49:47:49:51 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:47:86:47:94 | access to property Text : String | SqlInjectionDapper.cs:47:21:47:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:57:21:57:25 | access to local variable query : String | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | SqlInjectionDapper.cs:57:21:57:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:66:21:66:25 | access to local variable query : String | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | SqlInjectionDapper.cs:66:21:66:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | provenance | | | SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | provenance | | -| SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | provenance | | +| SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | provenance | | +| SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | provenance | | | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | provenance | | | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | provenance | | | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | provenance | | | SqlInjectionSqlite.cs:33:49:33:61 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:33:49:33:66 | access to property Text | provenance | | | SqlInjectionSqlite.cs:39:45:39:57 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:39:45:39:62 | access to property Text | provenance | | -| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | | | SqlInjectionSqlite.cs:49:51:49:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | provenance | | | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | provenance | | -| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | provenance | | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | provenance | | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | provenance | | -| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | provenance | | -| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | +| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | provenance | | nodes +| SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | SqlInjection.cs:33:21:33:40 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjection.cs:34:50:34:55 | access to local variable query1 | semmle.label | access to local variable query1 | +| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | SqlInjection.cs:68:33:68:52 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjection.cs:69:56:69:61 | access to local variable query1 | semmle.label | access to local variable query1 | | SqlInjection.cs:70:55:70:60 | access to local variable query1 | semmle.label | access to local variable query1 | +| SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | SqlInjection.cs:82:21:82:29 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjection.cs:83:50:83:55 | access to local variable query1 | semmle.label | access to local variable query1 | +| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | semmle.label | access to local variable queryString : String | | SqlInjection.cs:92:21:92:29 | access to property Text : String | semmle.label | access to property Text : String | +| SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | semmle.label | access to local variable cmd : SqlCommand | | SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | semmle.label | object creation of type SqlCommand : SqlCommand | | SqlInjection.cs:93:42:93:52 | access to local variable queryString | semmle.label | access to local variable queryString | | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | semmle.label | access to local variable queryString : String | | SqlInjection.cs:94:50:94:52 | access to local variable cmd | semmle.label | access to local variable cmd | +| SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:38:21:38:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:47:21:47:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:47:86:47:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:49:47:49:51 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:57:21:57:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:66:21:66:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | semmle.label | access to local variable query | | SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | semmle.label | access to property Text | +| SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | semmle.label | access to local variable cmd : SQLiteCommand | | SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | semmle.label | object creation of type SQLiteCommand : SQLiteCommand | | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | semmle.label | access to property Text | @@ -72,13 +102,17 @@ nodes | SqlInjectionSqlite.cs:39:45:39:57 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:39:45:39:62 | access to property Text | semmle.label | access to property Text | | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | semmle.label | access to local variable cmd | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | semmle.label | object creation of type FileStream : FileStream | | SqlInjectionSqlite.cs:49:51:49:63 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | semmle.label | access to property Text : String | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | semmle.label | object creation of type StreamReader : StreamReader | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | semmle.label | call to method Trim : String | | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | semmle.label | access to local variable sql | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected index ec812749311..59be23198dc 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected @@ -1,18 +1,15 @@ edges +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:14:54:14:78 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:16:21:16:45 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:23:21:23:45 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:24:53:24:77 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:27:48:27:70 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:29:20:29:42 | ... + ... | provenance | | +| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | provenance | | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:11:27:11:61 | access to indexer : String | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:14:54:14:78 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:16:21:16:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:23:21:23:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:24:53:24:77 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:27:48:27:70 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:29:20:29:42 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:14:54:14:78 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:16:21:16:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:23:21:23:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:24:53:24:77 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:27:48:27:70 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:29:20:29:42 | ... + ... | provenance | | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | provenance | | nodes +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | semmle.label | access to local variable userName : String | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | LDAPInjection.cs:11:27:11:61 | access to indexer : String | semmle.label | access to indexer : String | | LDAPInjection.cs:14:54:14:78 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected index 028af79c5df..6902d6f063d 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected @@ -1,8 +1,10 @@ edges +| Test.cs:8:12:8:23 | access to local variable employeeName : String | Test.cs:15:25:15:80 | ... + ... | provenance | | +| Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:8:12:8:23 | access to local variable employeeName : String | provenance | | | Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:8:27:8:65 | access to indexer : String | provenance | | -| Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:15:25:15:80 | ... + ... | provenance | | -| Test.cs:8:27:8:65 | access to indexer : String | Test.cs:15:25:15:80 | ... + ... | provenance | | +| Test.cs:8:27:8:65 | access to indexer : String | Test.cs:8:12:8:23 | access to local variable employeeName : String | provenance | | nodes +| Test.cs:8:12:8:23 | access to local variable employeeName : String | semmle.label | access to local variable employeeName : String | | Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | Test.cs:8:27:8:65 | access to indexer : String | semmle.label | access to indexer : String | | Test.cs:15:25:15:80 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected index f247e97bc35..fe49b9ddb65 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected @@ -1,10 +1,11 @@ edges +| CodeInjection.cs:23:16:23:19 | access to local variable code : String | CodeInjection.cs:29:64:29:67 | access to local variable code | provenance | | +| CodeInjection.cs:23:16:23:19 | access to local variable code : String | CodeInjection.cs:40:36:40:39 | access to local variable code | provenance | | +| CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:23:16:23:19 | access to local variable code : String | provenance | | | CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:23:23:23:53 | access to indexer : String | provenance | | -| CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:29:64:29:67 | access to local variable code | provenance | | -| CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:40:36:40:39 | access to local variable code | provenance | | -| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:29:64:29:67 | access to local variable code | provenance | | -| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:40:36:40:39 | access to local variable code | provenance | | +| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:23:16:23:19 | access to local variable code : String | provenance | | nodes +| CodeInjection.cs:23:16:23:19 | access to local variable code : String | semmle.label | access to local variable code : String | | CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | CodeInjection.cs:23:23:23:53 | access to indexer : String | semmle.label | access to indexer : String | | CodeInjection.cs:29:64:29:67 | access to local variable code | semmle.label | access to local variable code | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected index cc089c9898b..29ce3c2ba18 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected @@ -1,12 +1,15 @@ edges +| ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | provenance | | +| ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | provenance | | | ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:8:27:8:61 | access to indexer : String | provenance | | -| ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | provenance | | -| ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | provenance | | -| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | provenance | | -| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | provenance | | +| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | provenance | | +| ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | provenance | | +| ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | provenance | | nodes +| ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | semmle.label | access to local variable userName : String | | ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ResourceInjection.cs:8:27:8:61 | access to indexer : String | semmle.label | access to indexer : String | +| ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | semmle.label | access to local variable connectionString : String | | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | semmle.label | access to local variable connectionString | | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | semmle.label | access to local variable connectionString | subpaths diff --git a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected index 72d5d497820..ab1522a27d1 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected @@ -1,21 +1,19 @@ edges +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | provenance | | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | provenance | | | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:16:26:16:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:21:26:21:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:27:26:27:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:35:26:35:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:45:26:45:58 | object creation of type StringReader | provenance | | nodes +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | semmle.label | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | semmle.label | access to indexer : String | | MissingXMLValidation.cs:16:26:16:58 | object creation of type StringReader | semmle.label | object creation of type StringReader | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected index a13b0d64004..066dec77c67 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected @@ -1,8 +1,10 @@ edges +| Test.cs:7:12:7:22 | access to local variable libraryName : String | Test.cs:10:36:10:46 | access to local variable libraryName | provenance | | +| Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | Test.cs:7:12:7:22 | access to local variable libraryName : String | provenance | | | Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | Test.cs:7:26:7:63 | access to indexer : String | provenance | | -| Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | Test.cs:10:36:10:46 | access to local variable libraryName | provenance | | -| Test.cs:7:26:7:63 | access to indexer : String | Test.cs:10:36:10:46 | access to local variable libraryName | provenance | | +| Test.cs:7:26:7:63 | access to indexer : String | Test.cs:7:12:7:22 | access to local variable libraryName : String | provenance | | nodes +| Test.cs:7:12:7:22 | access to local variable libraryName : String | semmle.label | access to local variable libraryName : String | | Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | Test.cs:7:26:7:63 | access to indexer : String | semmle.label | access to indexer : String | | Test.cs:10:36:10:46 | access to local variable libraryName | semmle.label | access to local variable libraryName | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected b/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected index b01941c6d39..c3cfcd6f5f6 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected @@ -1,13 +1,13 @@ edges +| LogForging.cs:18:16:18:23 | access to local variable username : String | LogForging.cs:21:21:21:43 | ... + ... | provenance | | +| LogForging.cs:18:16:18:23 | access to local variable username : String | LogForging.cs:29:50:29:72 | ... + ... | provenance | | +| LogForging.cs:18:16:18:23 | access to local variable username : String | LogForging.cs:33:26:33:33 | access to local variable username | provenance | | +| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:18:16:18:23 | access to local variable username : String | provenance | | | LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:18:27:18:61 | access to indexer : String | provenance | | -| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:21:21:21:43 | ... + ... | provenance | | -| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:29:50:29:72 | ... + ... | provenance | | -| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:33:26:33:33 | access to local variable username | provenance | | -| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:21:21:21:43 | ... + ... | provenance | | -| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:29:50:29:72 | ... + ... | provenance | | -| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:33:26:33:33 | access to local variable username | provenance | | +| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:18:16:18:23 | access to local variable username : String | provenance | | | LogForgingAsp.cs:8:32:8:39 | username : String | LogForgingAsp.cs:12:21:12:43 | ... + ... | provenance | | nodes +| LogForging.cs:18:16:18:23 | access to local variable username : String | semmle.label | access to local variable username : String | | LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | LogForging.cs:18:27:18:61 | access to indexer : String | semmle.label | access to indexer : String | | LogForging.cs:21:21:21:43 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected index 9ae706885f6..1446b3700dd 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected @@ -1,21 +1,26 @@ edges -| ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | provenance | | +| ConsoleUncontrolledFormatString.cs:8:13:8:18 | access to local variable format : String | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | provenance | | +| ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | ConsoleUncontrolledFormatString.cs:8:13:8:18 | access to local variable format : String | provenance | | +| UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | provenance | | +| UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | provenance | | +| UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | provenance | | | UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | provenance | | -| UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | provenance | | -| UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | provenance | | -| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | provenance | | -| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | provenance | | +| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | provenance | | +| UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | provenance | | +| UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | provenance | | | UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | provenance | | -| UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | provenance | | -| UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | provenance | | +| UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | provenance | | nodes +| ConsoleUncontrolledFormatString.cs:8:13:8:18 | access to local variable format : String | semmle.label | access to local variable format : String | | ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | semmle.label | access to local variable format | +| UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | semmle.label | access to local variable path : String | | UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | semmle.label | access to indexer : String | | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | semmle.label | access to local variable path | | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | semmle.label | access to local variable path | | UncontrolledFormatString.cs:32:23:32:31 | access to property Text | semmle.label | access to property Text | +| UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | semmle.label | access to local variable format : String | | UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | semmle.label | access to indexer : String | | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | semmle.label | access to local variable format | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.ext.yml b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.ext.yml new file mode 100644 index 00000000000..82f107ae1d7 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.ext.yml @@ -0,0 +1,7 @@ +extensions: + + - addsTo: + pack: codeql/threat-models + extensible: threatModelConfiguration + data: + - ["local", true, 0] \ No newline at end of file diff --git a/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected b/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected index 9a1d6036ad7..e7e720e70fb 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected @@ -1,9 +1,10 @@ edges | ExposureInTransmittedData.cs:24:32:24:38 | access to property Data : IDictionary | ExposureInTransmittedData.cs:24:32:24:50 | access to indexer | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:31:53:31:53 | access to local variable p | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:31:56:31:56 | access to local variable p | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:32:24:32:52 | ... + ... | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:33:27:33:27 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:31:53:31:53 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:31:56:31:56 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:32:24:32:52 | ... + ... | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:33:27:33:27 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | provenance | | nodes | ExposureInTransmittedData.cs:14:32:14:39 | access to local variable password | semmle.label | access to local variable password | | ExposureInTransmittedData.cs:18:32:18:44 | call to method ToString | semmle.label | call to method ToString | @@ -11,6 +12,7 @@ nodes | ExposureInTransmittedData.cs:23:32:23:44 | call to method ToString | semmle.label | call to method ToString | | ExposureInTransmittedData.cs:24:32:24:38 | access to property Data : IDictionary | semmle.label | access to property Data : IDictionary | | ExposureInTransmittedData.cs:24:32:24:50 | access to indexer | semmle.label | access to indexer | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | semmle.label | access to local variable p : String | | ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | semmle.label | call to method GetField : String | | ExposureInTransmittedData.cs:31:53:31:53 | access to local variable p | semmle.label | access to local variable p | | ExposureInTransmittedData.cs:31:56:31:56 | access to local variable p | semmle.label | access to local variable p | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected b/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected index 8fcc865b54c..9e8afbc2b3a 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected @@ -1,9 +1,12 @@ edges -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:31:21:31:21 | access to local variable d | provenance | | -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:36:37:36:37 | access to local variable d : Byte[] | provenance | | -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:41:50:41:50 | access to local variable c : Byte[] | provenance | | -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:50:35:50:35 | access to local variable c : Byte[] | provenance | | -| HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | HardcodedSymmetricEncryptionKey.cs:44:51:44:69 | access to local variable byteArrayFromString : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:41:50:41:50 | access to local variable c : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:50:35:50:35 | access to local variable c : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | HardcodedSymmetricEncryptionKey.cs:31:21:31:21 | access to local variable d | provenance | | +| HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | HardcodedSymmetricEncryptionKey.cs:36:37:36:37 | access to local variable d : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:28:17:28:35 | access to local variable byteArrayFromString : Byte[] | HardcodedSymmetricEncryptionKey.cs:44:51:44:69 | access to local variable byteArrayFromString : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | HardcodedSymmetricEncryptionKey.cs:28:17:28:35 | access to local variable byteArrayFromString : Byte[] | provenance | | | HardcodedSymmetricEncryptionKey.cs:28:62:28:115 | "Hello, world: here is a very bad way to create a key" : String | HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | provenance | | | HardcodedSymmetricEncryptionKey.cs:36:37:36:37 | access to local variable d : Byte[] | HardcodedSymmetricEncryptionKey.cs:103:57:103:59 | key : Byte[] | provenance | | | HardcodedSymmetricEncryptionKey.cs:41:50:41:50 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:112:63:112:65 | key : Byte[] | provenance | | @@ -15,7 +18,10 @@ edges nodes | HardcodedSymmetricEncryptionKey.cs:17:21:17:97 | array creation of type Byte[] | semmle.label | array creation of type Byte[] | | HardcodedSymmetricEncryptionKey.cs:22:23:22:99 | array creation of type Byte[] | semmle.label | array creation of type Byte[] | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | semmle.label | access to local variable c : Byte[] | | HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | semmle.label | array creation of type Byte[] : Byte[] | +| HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | semmle.label | access to local variable d : Byte[] | +| HardcodedSymmetricEncryptionKey.cs:28:17:28:35 | access to local variable byteArrayFromString : Byte[] | semmle.label | access to local variable byteArrayFromString : Byte[] | | HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | | HardcodedSymmetricEncryptionKey.cs:28:62:28:115 | "Hello, world: here is a very bad way to create a key" : String | semmle.label | "Hello, world: here is a very bad way to create a key" : String | | HardcodedSymmetricEncryptionKey.cs:31:21:31:21 | access to local variable d | semmle.label | access to local variable d | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected b/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected index 616fe890da8..a6c8142e7d9 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected @@ -1,12 +1,18 @@ edges -| Test.cs:15:31:15:59 | object creation of type X509Store : X509Store | Test.cs:18:13:18:17 | access to local variable store | provenance | | -| Test.cs:25:31:25:86 | object creation of type X509Store : X509Store | Test.cs:28:13:28:17 | access to local variable store | provenance | | -| Test.cs:70:31:70:86 | object creation of type X509Store : X509Store | Test.cs:73:13:73:17 | access to local variable store | provenance | | +| Test.cs:15:23:15:27 | access to local variable store : X509Store | Test.cs:18:13:18:17 | access to local variable store | provenance | | +| Test.cs:15:31:15:59 | object creation of type X509Store : X509Store | Test.cs:15:23:15:27 | access to local variable store : X509Store | provenance | | +| Test.cs:25:23:25:27 | access to local variable store : X509Store | Test.cs:28:13:28:17 | access to local variable store | provenance | | +| Test.cs:25:31:25:86 | object creation of type X509Store : X509Store | Test.cs:25:23:25:27 | access to local variable store : X509Store | provenance | | +| Test.cs:70:23:70:27 | access to local variable store : X509Store | Test.cs:73:13:73:17 | access to local variable store | provenance | | +| Test.cs:70:31:70:86 | object creation of type X509Store : X509Store | Test.cs:70:23:70:27 | access to local variable store : X509Store | provenance | | nodes +| Test.cs:15:23:15:27 | access to local variable store : X509Store | semmle.label | access to local variable store : X509Store | | Test.cs:15:31:15:59 | object creation of type X509Store : X509Store | semmle.label | object creation of type X509Store : X509Store | | Test.cs:18:13:18:17 | access to local variable store | semmle.label | access to local variable store | +| Test.cs:25:23:25:27 | access to local variable store : X509Store | semmle.label | access to local variable store : X509Store | | Test.cs:25:31:25:86 | object creation of type X509Store : X509Store | semmle.label | object creation of type X509Store : X509Store | | Test.cs:28:13:28:17 | access to local variable store | semmle.label | access to local variable store | +| Test.cs:70:23:70:27 | access to local variable store : X509Store | semmle.label | access to local variable store : X509Store | | Test.cs:70:31:70:86 | object creation of type X509Store : X509Store | semmle.label | object creation of type X509Store : X509Store | | Test.cs:73:13:73:17 | access to local variable store | semmle.label | access to local variable store | subpaths diff --git a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected index fc657fcde1d..28246bd0067 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected @@ -1,10 +1,14 @@ edges -| InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString | provenance | | -| InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString | provenance | | +| InsecureSQLConnection.cs:43:20:43:32 | access to local variable connectString : String | InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString | provenance | | +| InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | InsecureSQLConnection.cs:43:20:43:32 | access to local variable connectString : String | provenance | | +| InsecureSQLConnection.cs:52:20:52:32 | access to local variable connectString : String | InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString | provenance | | +| InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | InsecureSQLConnection.cs:52:20:52:32 | access to local variable connectString : String | provenance | | nodes | InsecureSQLConnection.cs:38:52:38:128 | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" | semmle.label | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" | +| InsecureSQLConnection.cs:43:20:43:32 | access to local variable connectString : String | semmle.label | access to local variable connectString : String | | InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | semmle.label | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | | InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString | semmle.label | access to local variable connectString | +| InsecureSQLConnection.cs:52:20:52:32 | access to local variable connectString : String | semmle.label | access to local variable connectString : String | | InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | semmle.label | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | | InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString | semmle.label | access to local variable connectString | subpaths diff --git a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected index b0c0dbae40f..8d1619156bb 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected @@ -7,11 +7,15 @@ edges | InsecureRandomness.cs:29:57:29:60 | access to local variable data : Byte[] [element] : Byte | InsecureRandomness.cs:29:27:29:61 | call to method GetString : String | provenance | | | InsecureRandomness.cs:31:16:31:21 | access to local variable result : StringBuilder | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | provenance | | | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | InsecureRandomness.cs:12:27:12:50 | call to method InsecureRandomString | provenance | | -| InsecureRandomness.cs:60:23:60:40 | access to array element : String | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:60:23:60:40 | access to array element : String | InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | provenance | | | InsecureRandomness.cs:60:31:60:39 | call to method Next : Int32 | InsecureRandomness.cs:60:23:60:40 | access to array element : String | provenance | | | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | provenance | | | InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | InsecureRandomness.cs:13:20:13:56 | call to method InsecureRandomStringFromSelection | provenance | | -| InsecureRandomness.cs:72:23:72:40 | access to indexer : String | InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:72:23:72:40 | access to indexer : String | InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | provenance | | | InsecureRandomness.cs:72:31:72:39 | call to method Next : Int32 | InsecureRandomness.cs:72:23:72:40 | access to indexer : String | provenance | | | InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | InsecureRandomness.cs:14:20:14:54 | call to method InsecureRandomStringFromIndexer | provenance | | nodes @@ -26,10 +30,12 @@ nodes | InsecureRandomness.cs:29:57:29:60 | access to local variable data : Byte[] [element] : Byte | semmle.label | access to local variable data : Byte[] [element] : Byte | | InsecureRandomness.cs:31:16:31:21 | access to local variable result : StringBuilder | semmle.label | access to local variable result : StringBuilder | | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | semmle.label | call to method ToString : String | +| InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | semmle.label | access to local variable result : String | | InsecureRandomness.cs:60:23:60:40 | access to array element : String | semmle.label | access to array element : String | | InsecureRandomness.cs:60:31:60:39 | call to method Next : Int32 | semmle.label | call to method Next : Int32 | | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | semmle.label | access to local variable result : String | | InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | semmle.label | call to method ToString : String | +| InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | semmle.label | access to local variable result : String | | InsecureRandomness.cs:72:23:72:40 | access to indexer : String | semmle.label | access to indexer : String | | InsecureRandomness.cs:72:31:72:39 | call to method Next : Int32 | semmle.label | call to method Next : Int32 | | InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | semmle.label | access to local variable result : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected b/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected index b36b30253e0..b539b019f39 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected @@ -1,17 +1,14 @@ edges | UrlRedirect2.cs:14:31:14:53 | access to property QueryString : NameValueCollection | UrlRedirect2.cs:14:31:14:61 | access to indexer | provenance | | | UrlRedirect.cs:13:31:13:53 | access to property QueryString : NameValueCollection | UrlRedirect.cs:13:31:13:61 | access to indexer | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:48:29:48:31 | access to local variable url | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:64:31:64:52 | $"..." | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:76:69:76:71 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:76:74:76:76 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:23:16:23:18 | access to local variable url : String | provenance | | | UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:23:22:23:52 | access to indexer : String | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:48:29:48:31 | access to local variable url | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:64:31:64:52 | $"..." | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:76:69:76:71 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:76:74:76:76 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:48:29:48:31 | access to local variable url | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:64:31:64:52 | $"..." | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:76:69:76:71 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:76:74:76:76 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:23:16:23:18 | access to local variable url : String | provenance | | | UrlRedirect.cs:38:44:38:66 | access to property QueryString : NameValueCollection | UrlRedirect.cs:38:44:38:74 | access to indexer | provenance | | | UrlRedirect.cs:39:47:39:69 | access to property QueryString : NameValueCollection | UrlRedirect.cs:39:47:39:77 | access to indexer | provenance | | | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | UrlRedirect.cs:70:31:70:69 | call to method Format | provenance | | @@ -33,6 +30,7 @@ nodes | UrlRedirect2.cs:14:31:14:61 | access to indexer | semmle.label | access to indexer | | UrlRedirect.cs:13:31:13:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UrlRedirect.cs:13:31:13:61 | access to indexer | semmle.label | access to indexer | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | semmle.label | access to local variable url : String | | UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UrlRedirect.cs:23:22:23:52 | access to indexer : String | semmle.label | access to indexer : String | | UrlRedirect.cs:38:44:38:66 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected index daaca6c5d3a..0b963f38d7b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected @@ -1,10 +1,14 @@ edges -| StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | -| StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | -| StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | -| StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | +| StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | +| StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | +| StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | provenance | | +| StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | +| StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | +| StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | provenance | | nodes +| StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | semmle.label | access to local variable userName : String | | StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | semmle.label | call to method GetString : String | +| StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | semmle.label | access to local variable password : String | | StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | semmle.label | call to method GetString : String | | StoredXPathInjection.cs:25:45:25:148 | ... + ... | semmle.label | ... + ... | | StoredXPathInjection.cs:28:41:28:144 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected index 78652e8ea9d..f722ab15f6b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected @@ -1,39 +1,27 @@ edges +| XPathInjection.cs:10:16:10:23 | access to local variable userName : String | XPathInjection.cs:13:13:13:13 | access to local variable s : String | provenance | | +| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:10:16:10:23 | access to local variable userName : String | provenance | | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:10:27:10:61 | access to indexer : String | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:10:16:10:23 | access to local variable userName : String | provenance | | +| XPathInjection.cs:11:16:11:23 | access to local variable password : String | XPathInjection.cs:13:13:13:13 | access to local variable s : String | provenance | | +| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:11:16:11:23 | access to local variable password : String | provenance | | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:11:27:11:61 | access to indexer : String | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:11:16:11:23 | access to local variable password : String | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | nodes +| XPathInjection.cs:10:16:10:23 | access to local variable userName : String | semmle.label | access to local variable userName : String | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XPathInjection.cs:10:27:10:61 | access to indexer : String | semmle.label | access to indexer : String | +| XPathInjection.cs:11:16:11:23 | access to local variable password : String | semmle.label | access to local variable password : String | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XPathInjection.cs:11:27:11:61 | access to indexer : String | semmle.label | access to indexer : String | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | semmle.label | access to local variable s : String | | XPathInjection.cs:16:33:16:33 | access to local variable s | semmle.label | access to local variable s | | XPathInjection.cs:19:29:19:29 | access to local variable s | semmle.label | access to local variable s | | XPathInjection.cs:28:20:28:20 | access to local variable s | semmle.label | access to local variable s | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected index ed14c44e2af..8edaf59b831 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected @@ -1,16 +1,14 @@ edges +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | provenance | | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:11:28:11:63 | access to indexer : String | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | provenance | | nodes +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ExponentialRegex.cs:11:28:11:63 | access to indexer : String | semmle.label | access to indexer : String | | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | semmle.label | access to local variable userInput | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected index 989d0648f48..da9cf11906c 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected @@ -1,8 +1,10 @@ edges +| ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | provenance | | | ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:13:28:13:63 | access to indexer : String | provenance | | -| ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:13:28:13:63 | access to indexer : String | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:13:28:13:63 | access to indexer : String | ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | provenance | | nodes +| ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | | ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ExponentialRegex.cs:13:28:13:63 | access to indexer : String | semmle.label | access to indexer : String | | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | semmle.label | access to local variable userInput | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected index 7fa9f7428f4..51f0d59dec0 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected @@ -1,8 +1,10 @@ edges +| RegexInjection.cs:10:16:10:20 | access to local variable regex : String | RegexInjection.cs:14:19:14:23 | access to local variable regex | provenance | | +| RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:10:16:10:20 | access to local variable regex : String | provenance | | | RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:10:24:10:55 | access to indexer : String | provenance | | -| RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:14:19:14:23 | access to local variable regex | provenance | | -| RegexInjection.cs:10:24:10:55 | access to indexer : String | RegexInjection.cs:14:19:14:23 | access to local variable regex | provenance | | +| RegexInjection.cs:10:24:10:55 | access to indexer : String | RegexInjection.cs:10:16:10:20 | access to local variable regex : String | provenance | | nodes +| RegexInjection.cs:10:16:10:20 | access to local variable regex : String | semmle.label | access to local variable regex : String | | RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | RegexInjection.cs:10:24:10:55 | access to indexer : String | semmle.label | access to indexer : String | | RegexInjection.cs:14:19:14:23 | access to local variable regex | semmle.label | access to local variable regex | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected b/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected index 5c707971384..f6768445fe8 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected @@ -1,9 +1,11 @@ edges -| HardcodedCredentials.cs:48:30:48:60 | array creation of type Byte[] : Byte[] | HardcodedCredentials.cs:51:13:51:23 | access to local variable rawCertData | provenance | | +| HardcodedCredentials.cs:48:16:48:26 | access to local variable rawCertData : Byte[] | HardcodedCredentials.cs:51:13:51:23 | access to local variable rawCertData | provenance | | +| HardcodedCredentials.cs:48:30:48:60 | array creation of type Byte[] : Byte[] | HardcodedCredentials.cs:48:16:48:26 | access to local variable rawCertData : Byte[] | provenance | | nodes | HardcodedCredentials.cs:16:25:16:36 | "myPa55word" | semmle.label | "myPa55word" | | HardcodedCredentials.cs:32:19:32:28 | "username" | semmle.label | "username" | | HardcodedCredentials.cs:46:39:46:53 | "myNewPa55word" | semmle.label | "myNewPa55word" | +| HardcodedCredentials.cs:48:16:48:26 | access to local variable rawCertData : Byte[] | semmle.label | access to local variable rawCertData : Byte[] | | HardcodedCredentials.cs:48:30:48:60 | array creation of type Byte[] : Byte[] | semmle.label | array creation of type Byte[] : Byte[] | | HardcodedCredentials.cs:51:13:51:23 | access to local variable rawCertData | semmle.label | access to local variable rawCertData | | HardcodedCredentials.cs:52:13:52:24 | "myPa55word" | semmle.label | "myPa55word" | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected b/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected index 86f4167bd75..7a86377ccb8 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected @@ -1,28 +1,35 @@ edges +| ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | ConditionalBypass.cs:16:13:16:30 | ... == ... | provenance | | +| ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | provenance | | | ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:12:26:12:59 | access to indexer : String | provenance | | -| ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:16:13:16:30 | ... == ... | provenance | | -| ConditionalBypass.cs:12:26:12:59 | access to indexer : String | ConditionalBypass.cs:16:13:16:30 | ... == ... | provenance | | -| ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | provenance | | -| ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:12:26:12:59 | access to indexer : String | ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | provenance | | +| ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | provenance | | | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:22:13:22:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:22:13:22:29 | access to property Value : String | ConditionalBypass.cs:22:13:22:45 | call to method Equals | provenance | | | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:27:13:27:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:27:13:27:29 | access to property Value : String | ConditionalBypass.cs:27:13:27:40 | ... == ... | provenance | | -| ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | provenance | | -| ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | provenance | | +| ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | provenance | | +| ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | provenance | | +| ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | provenance | | | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:44:13:44:29 | access to property HostName : String | provenance | | | ConditionalBypass.cs:44:13:44:29 | access to property HostName : String | ConditionalBypass.cs:44:13:44:46 | ... == ... | provenance | | | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:49:13:49:29 | access to property HostName | provenance | | -| ConditionalBypass.cs:70:34:70:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:70:20:70:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:70:34:70:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:70:20:70:30 | access to local variable adminCookie : HttpCookie | provenance | | | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:72:13:72:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:72:13:72:29 | access to property Value : String | ConditionalBypass.cs:72:13:72:40 | ... == ... | provenance | | -| ConditionalBypass.cs:83:34:83:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:83:20:83:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:83:34:83:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:83:20:83:30 | access to local variable adminCookie : HttpCookie | provenance | | | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:84:13:84:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:84:13:84:29 | access to property Value : String | ConditionalBypass.cs:84:13:84:40 | ... == ... | provenance | | nodes +| ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | semmle.label | access to local variable isAdmin : String | | ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ConditionalBypass.cs:12:26:12:59 | access to indexer : String | semmle.label | access to indexer : String | | ConditionalBypass.cs:16:13:16:30 | ... == ... | semmle.label | ... == ... | +| ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | semmle.label | access to property Cookies : HttpCookieCollection | | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:22:13:22:29 | access to property Value : String | semmle.label | access to property Value : String | @@ -30,16 +37,19 @@ nodes | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:27:13:27:29 | access to property Value : String | semmle.label | access to property Value : String | | ConditionalBypass.cs:27:13:27:40 | ... == ... | semmle.label | ... == ... | +| ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | semmle.label | access to local variable hostInfo : IPHostEntry | | ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | semmle.label | call to method GetHostByAddress : IPHostEntry | | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | semmle.label | access to local variable hostInfo : IPHostEntry | | ConditionalBypass.cs:44:13:44:29 | access to property HostName : String | semmle.label | access to property HostName : String | | ConditionalBypass.cs:44:13:44:46 | ... == ... | semmle.label | ... == ... | | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | semmle.label | access to local variable hostInfo : IPHostEntry | | ConditionalBypass.cs:49:13:49:29 | access to property HostName | semmle.label | access to property HostName | +| ConditionalBypass.cs:70:20:70:30 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:70:34:70:52 | access to property Cookies : HttpCookieCollection | semmle.label | access to property Cookies : HttpCookieCollection | | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:72:13:72:29 | access to property Value : String | semmle.label | access to property Value : String | | ConditionalBypass.cs:72:13:72:40 | ... == ... | semmle.label | ... == ... | +| ConditionalBypass.cs:83:20:83:30 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:83:34:83:52 | access to property Cookies : HttpCookieCollection | semmle.label | access to property Cookies : HttpCookieCollection | | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:84:13:84:29 | access to property Value : String | semmle.label | access to property Value : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected b/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected index 4958966f788..8bde8b3631e 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected @@ -1,30 +1,40 @@ edges | HtmlEncode.cs:10:40:10:65 | call to method UrlEncode : String | HtmlEncode.cs:10:28:10:65 | ... + ... | provenance | | -| InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | InappropriateEncoding.cs:18:46:18:51 | access to local variable query1 | provenance | | -| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:35:32:35:43 | access to local variable encodedValue | provenance | | -| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:36:22:36:59 | ... + ... | provenance | | -| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | provenance | | +| InappropriateEncoding.cs:13:13:13:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:16:17:16:22 | access to local variable query1 : String | provenance | | +| InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | InappropriateEncoding.cs:13:13:13:24 | access to local variable encodedValue : String | provenance | | +| InappropriateEncoding.cs:16:17:16:22 | access to local variable query1 : String | InappropriateEncoding.cs:18:46:18:51 | access to local variable query1 | provenance | | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:35:32:35:43 | access to local variable encodedValue | provenance | | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:36:22:36:59 | ... + ... | provenance | | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | provenance | | +| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | provenance | | | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | InappropriateEncoding.cs:37:22:37:71 | call to method Format | provenance | | -| InappropriateEncoding.cs:55:28:55:56 | call to method HtmlEncode : String | InappropriateEncoding.cs:56:31:56:42 | access to local variable encodedValue | provenance | | +| InappropriateEncoding.cs:55:13:55:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:56:31:56:42 | access to local variable encodedValue | provenance | | +| InappropriateEncoding.cs:55:28:55:56 | call to method HtmlEncode : String | InappropriateEncoding.cs:55:13:55:24 | access to local variable encodedValue : String | provenance | | | InappropriateEncoding.cs:66:16:66:42 | call to method Replace : String | InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | provenance | | -| SqlEncode.cs:14:62:14:87 | call to method Replace : String | SqlEncode.cs:15:46:15:50 | access to local variable query | provenance | | +| SqlEncode.cs:14:17:14:21 | access to local variable query : String | SqlEncode.cs:15:46:15:50 | access to local variable query | provenance | | +| SqlEncode.cs:14:62:14:87 | call to method Replace : String | SqlEncode.cs:14:17:14:21 | access to local variable query : String | provenance | | | UrlEncode.cs:10:43:10:69 | call to method HtmlEncode : String | UrlEncode.cs:10:31:10:69 | ... + ... | provenance | | nodes | HtmlEncode.cs:10:28:10:65 | ... + ... | semmle.label | ... + ... | | HtmlEncode.cs:10:40:10:65 | call to method UrlEncode : String | semmle.label | call to method UrlEncode : String | +| InappropriateEncoding.cs:13:13:13:24 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | | InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | semmle.label | call to method Encode : String | +| InappropriateEncoding.cs:16:17:16:22 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | InappropriateEncoding.cs:18:46:18:51 | access to local variable query1 | semmle.label | access to local variable query1 | | InappropriateEncoding.cs:31:22:31:34 | call to method Encode | semmle.label | call to method Encode | | InappropriateEncoding.cs:32:22:32:49 | call to method UrlEncode | semmle.label | call to method UrlEncode | | InappropriateEncoding.cs:33:22:33:73 | call to method UrlEncode | semmle.label | call to method UrlEncode | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | | InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | semmle.label | call to method UrlEncode : String | | InappropriateEncoding.cs:35:32:35:43 | access to local variable encodedValue | semmle.label | access to local variable encodedValue | | InappropriateEncoding.cs:36:22:36:59 | ... + ... | semmle.label | ... + ... | | InappropriateEncoding.cs:37:22:37:71 | call to method Format | semmle.label | call to method Format | | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | +| InappropriateEncoding.cs:55:13:55:24 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | | InappropriateEncoding.cs:55:28:55:56 | call to method HtmlEncode : String | semmle.label | call to method HtmlEncode : String | | InappropriateEncoding.cs:56:31:56:42 | access to local variable encodedValue | semmle.label | access to local variable encodedValue | | InappropriateEncoding.cs:66:16:66:42 | call to method Replace : String | semmle.label | call to method Replace : String | +| SqlEncode.cs:14:17:14:21 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlEncode.cs:14:62:14:87 | call to method Replace : String | semmle.label | call to method Replace : String | | SqlEncode.cs:15:46:15:50 | access to local variable query | semmle.label | access to local variable query | | UrlEncode.cs:10:31:10:69 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/tools/tracing-config.lua b/csharp/tools/tracing-config.lua index 55f803c5adb..5fc1cc8e80e 100644 --- a/csharp/tools/tracing-config.lua +++ b/csharp/tools/tracing-config.lua @@ -23,6 +23,10 @@ function RegisterExtractorPack(id) not isDotnetPath(arg) end + local function isPathToExecutable(path) + return path:match('%.exe$') or path:match('%.dll') + end + function DotnetMatcherBuild(compilerName, compilerPath, compilerArguments, _languageId) if not isDotnet(compilerName) then @@ -56,8 +60,16 @@ function RegisterExtractorPack(id) NativeArgumentsToArgv(compilerArguments.nativeArgumentPointer) end for i, arg in ipairs(argv) do + -- if dotnet is being used to execute any application except dotnet itself, we should + -- not inject any flags. + if not match and isPathToExecutable(arg) and not isDotnetPath(arg) then + Log(1, 'Execute a .NET application usage detected') + Log(1, 'Dotnet path-to-application detected: %s', arg) + break + end if isPossibleDotnetSubcommand(arg) then - if (not match) and inSubCommandPosition then + if not match and inSubCommandPosition then + Log(1, 'Execute a .NET SDK command usage detected') Log(1, 'Dotnet subcommand detected: %s', arg) end -- only respond to strings that look like sub-command names if we have not yet @@ -85,7 +97,7 @@ function RegisterExtractorPack(id) end -- 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 isPathToExecutable(arg) then match = false break end diff --git a/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst b/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst index ddc78558496..7e19e78bd42 100644 --- a/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst +++ b/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst @@ -12,27 +12,31 @@ About testing queries in VS Code To ensure that your CodeQL queries produce the expected results, you can run tests that compare the expected query results with the actual results. -The CodeQL extension automatically prompts VS Code to install the Test Explorer extension as a dependency. The Test Explorer displays any workspace folders with a name ending in ``-tests`` and provides a UI for exploring and running tests in those folders. +The CodeQL extension automatically registers itself with the **Testing** view. The **Testing** view displays all tests found in your current workspace and provides a UI for exploring and running tests in your workspace. For more information about how CodeQL tests work, see "`Testing custom queries `__" in the CLI help. Testing the results of your queries ----------------------------------- -1. Open the Test Explorer view in the sidebar. +1. Open the **Testing** view in the sidebar. - .. image:: ../images/codeql-for-visual-studio-code/open-test-explorer.png + .. image:: ../images/codeql-for-visual-studio-code/open-testing-view.png :width: 350 - :alt: Open the Test Explorer view + :alt: Open the Testing view 2. To run a specific test, hover over the file or folder name and click the play button. To run all tests in your workspace, click the play button at the top of the view. If a test takes too long to run, you can click the stop button at the top of the view to cancel the test. -3. The icons show whether a test passed or failed. If it failed, right-click the failed test and click **CodeQL: Show Test Output Differences** to display the differences between the expected output and the actual output. +3. The icons show whether a test passed or failed. If it failed, click the test in the **Test Results** panel to display the differences between the expected output and the actual output. - .. image:: ../images/codeql-for-visual-studio-code/show-test-diff.png + .. image:: ../images/codeql-for-visual-studio-code/test-results-panel.png + :width: 800 + :alt: View the Test Results panel + +4. Compare the results. If you want to update the test with the actual output, right-click the test in the **Testing** view and click **Accept Test Output**. + + .. image:: ../images/codeql-for-visual-studio-code/accept-test-output.png :width: 400 - :alt: Show test output differences - -4. Compare the results. If you want to update the test with the actual output, click **CodeQL: Accept Test Output**. + :alt: Acccept test output in the Testing view Monitoring the performance of your queries ------------------------------------------ diff --git a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst index 0eaa4518118..d1dce1a6771 100644 --- a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst +++ b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst @@ -18,9 +18,9 @@ When you open the model editor, it analyzes the currently selected CodeQL databa The model editor has two different modes: -- Application mode (default view): The editor lists each external framework used by the selected CodeQL database. When you expand a framework, a list of all calls to and from the external API is shown with the options available to model dataflow through each call. This mode is most useful for improving the CodeQL results for a specific codebase. +- **Application mode (default view):** The editor lists each external framework used by the selected CodeQL database. When you expand a framework, a list of all calls to and from the external API is shown with the options available to model dataflow through each call. This mode is most useful for improving the CodeQL results for a specific codebase. -- Dependency mode: The editor identifies all of the publicly accessible APIs in the selected CodeQL database. This view guides you through modeling each public API that the codebase makes available. When you have finished modeling the entire API, you can save the model and use it to improve the CodeQL analysis for all codebases that use the dependency. +- **Dependency mode:** The editor identifies all of the publicly accessible APIs in the selected CodeQL database. This view guides you through modeling each public API that the codebase makes available. When you have finished modeling the entire API, you can save the model and use it to improve the CodeQL analysis for all codebases that use the dependency. Displaying the CodeQL model editor ---------------------------------- @@ -32,7 +32,7 @@ Displaying the CodeQL model editor #. The CodeQL model editor runs a series of telemetry queries to identify APIs in the code and the editor is displayed in a new tab. #. When the telemetry queries are complete, the APIs that have been identified are shown in the editor. -.. tip:: +.. pull-quote:: Tip The "CodeQL method modeling" section is a view that you can move from the primary sidebar to the secondary sidebar, when you want more space while you are modeling calls or methods. If you close the view, you can reopen it from the "Open Views" option in the **View** menu. @@ -41,6 +41,8 @@ Modeling the calls your codebase makes to external APIs You typically use this approach when you are looking at a specific codebase where you want to improve the precision of CodeQL results. This is useful when the codebase uses frameworks or libraries that are not supported by CodeQL and if the source code of the framework or library is not included in the analysis. +This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling calls to external APIs written in other static languages is similar. + #. Select the CodeQL database that you want to improve CodeQL coverage for. #. Display the CodeQL model editor. By default the editor runs in application mode, so the list of external APIs used by the selected codebase is shown. @@ -90,6 +92,8 @@ The models are stored in a series of YAML data extension files, one for each ext Modeling the public API of a codebase ------------------------------------- +This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling the public API written using other static languages is similar. + You typically use this method when you want to model a framework or library that your organization uses in more than one codebase. Once you have finished creating and testing the model, you can publish the CodeQL model pack to the GitHub Container Registry for your whole organization to use. #. Select the CodeQL database that you want to model. diff --git a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-java.rst b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-java.rst index 028e1317814..3a9b84cfcc3 100644 --- a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-java.rst +++ b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-java.rst @@ -27,7 +27,13 @@ Local data flow is data flow within a single method or callable. Local data flow Using local data flow ~~~~~~~~~~~~~~~~~~~~~ -The local data flow library is in the module ``DataFlow``, which defines the class ``Node`` denoting any element that data can flow through. ``Node``\ s are divided into expression nodes (``ExprNode``) and parameter nodes (``ParameterNode``). You can map between data flow nodes and expressions/parameters using the member predicates ``asExpr`` and ``asParameter``: +To use the data flow library you need the following import: + +.. code-block:: ql + + import semmle.code.java.dataflow.DataFlow + +The ``DataFlow`` module defines the class ``Node`` denoting any element that data can flow through. ``Node``\ s are divided into expression nodes (``ExprNode``) and parameter nodes (``ParameterNode``). You can map between data flow nodes and expressions/parameters using the member predicates ``asExpr`` and ``asParameter``: .. code-block:: ql @@ -75,7 +81,14 @@ Local taint tracking extends local data flow by including non-value-preserving f If ``x`` is a tainted string then ``y`` is also tainted. -The local taint tracking library is in the module ``TaintTracking``. Like local data flow, a predicate ``localTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo)`` holds if there is an immediate taint propagation edge from the node ``nodeFrom`` to the node ``nodeTo``. You can apply the predicate recursively by using the ``+`` and ``*`` operators, or by using the predefined recursive predicate ``localTaint``, which is equivalent to ``localTaintStep*``. + +To use the taint tracking library you need the following import: + +.. code-block:: ql + + import semmle.code.java.dataflow.TaintTracking + +Like local data flow, a predicate ``localTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo)`` holds if there is an immediate taint propagation edge from the node ``nodeFrom`` to the node ``nodeTo``. You can apply the predicate recursively by using the ``+`` and ``*`` operators, or by using the predefined recursive predicate ``localTaint``, which is equivalent to ``localTaintStep*``. For example, you can find taint propagation from a parameter ``source`` to an expression ``sink`` in zero or more local steps: diff --git a/docs/codeql/codeql-language-guides/codeql-for-csharp.rst b/docs/codeql/codeql-language-guides/codeql-for-csharp.rst index 9b692094841..491b7bf9de7 100644 --- a/docs/codeql/codeql-language-guides/codeql-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/codeql-for-csharp.rst @@ -11,6 +11,7 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat basic-query-for-csharp-code codeql-library-for-csharp analyzing-data-flow-in-csharp + customizing-library-models-for-csharp - :doc:`Basic query for C# code `: Learn to write and run a simple CodeQL query. @@ -18,4 +19,5 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat - :doc:`Analyzing data flow in C# `: You can use CodeQL to track the flow of data through a C# program to its use. +- :doc:`Customizing library models for C# `: You can model frameworks and libraries that your codebase depends on using data extensions and publish them as CodeQL model packs. diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst new file mode 100644 index 00000000000..165ce7b623e --- /dev/null +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -0,0 +1,342 @@ +.. _customizing-library-models-for-csharp: + +Customizing library models for C# +================================= + +You can model the methods and callables that control data flow in any framework or library. This is especially useful for custom frameworks or niche libraries, that are not supported by the standard CodeQL libraries. + +.. include:: ../reusables/beta-note-customizing-library-models.rst + +About this article +------------------ + +This article contains reference material about how to define custom models for sources, sinks, and flow summaries for C# dependencies in data extension files. + +About data extensions +--------------------- + +You can customize analysis by defining models (summaries, sinks, and sources) of your code's C#/.NET dependencies in data extension files. Each model defines the behavior of one or more elements of your library or framework, such as methods, properties, and callables. When you run dataflow analysis, these models expand the potential sources and sinks tracked by dataflow analysis and improve the precision of results. + +Most of the security queries search for paths from a source of untrusted input to a sink that represents a vulnerability. This is known as taint tracking. Each source is a starting point for dataflow analysis to track tainted data and each sink is an end point. + +Taint tracking queries also need to know how data can flow through elements that are not included in the source code. These are modeled as summaries. A summary model enables queries to synthesize the flow behavior through elements in dependency code that is not stored in your repository. + +Syntax used to define an element in an extension file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each model of an element is defined using a data extension where each tuple constitutes a model. +A data extension file to extend the standard C# queries included with CodeQL is a YAML file with the form: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: + data: + - + - + - ... + +Each YAML file may contain one or more top-level extensions. + +- ``addsTo`` defines the CodeQL pack name and extensible predicate that the extension is injected into. +- ``data`` defines one or more rows of tuples that are injected as values into the extensible predicate. The number of columns and their types must match the definition of the extensible predicate. + +Data extensions use union semantics, which means that the tuples of all extensions for a single extensible predicate are combined, duplicates are removed, and all of the remaining tuples are queryable by referencing the extensible predicate. + +Publish data extension files in a CodeQL model pack to share +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can group one or more data extension files into a CodeQL model pack and publish it to the GitHub Container Registry. This makes it easy for anyone to download the model pack and use it to extend their analysis. For more information, see `Creating a CodeQL model pack `__ and `Publishing and using CodeQL packs `__ in the CodeQL CLI documentation. + +Extensible predicates used to create custom models in C# +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The CodeQL library for C# analysis exposes the following extensible predicates: + +- ``sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. +- ``sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data may be used in a way that makes the code vulnerable. +- ``summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. +- ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) can be used to override generated summary models (those with a provenance such as ``df-generated``), so that the summary model will be ignored. Other than that, neutral models have no effect. + +The extensible predicates are populated using the models defined in data extension files. + +Examples of custom model definitions +------------------------------------ + +The examples in this section are taken from the standard CodeQL C# query pack published by GitHub. They demonstrate how to add tuples to extend extensible predicates that are used by the standard queries. + +Example: Taint sink in the ``System.Data.SqlClient`` namespace +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the C# query pack models the argument of the ``SqlCommand`` constructor as a SQL injection sink. +This is the constructor of the ``SqlCommand`` class, which is located in the ``System.Data.SqlClient`` namespace. + +.. code-block:: csharp + + public static void TaintSink(SqlConnection conn, string query) { + SqlCommand command = new SqlCommand(query, connection) // The argument to this method is a SQL injection sink. + ... + } + +We need to add a tuple to the ``sinkModel``\(namespace, type, subtypes, name, signature, ext, input, kind, provenance) extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: sinkModel + data: + - ["System.Data.SqlClient", "SqlCommand", False, "SqlCommand", "(System.String,System.Data.SqlClient.SqlConnection)", "", "Argument[0]", "sql-injection", "manual"] + +Since we want to add a new sink, we need to add a tuple to the ``sinkModel`` extensible predicate. +The first five values identify the callable (in this case a method) to be modeled as a sink. + +- The first value ``System.Data.SqlClient`` is the namespace name. +- The second value ``SqlCommand`` is the name of the class (type) that contains the method. +- The third value ``False`` is a flag that indicates whether or not the sink also applies to all overrides of the method. +- The fourth value ``SqlCommand`` is the method name. Constructors are named after the class. +- The fifth value ``(System.String,System.Data.SqlClient.SqlConnection)`` is the method input type signature. The type names must be fully qualified. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the sink. + +- The seventh value ``Argument[0]`` is the ``access path`` to the first argument passed to the method, which means that this is the location of the sink. +- The eighth value ``sql-injection`` is the kind of the sink. The sink kind is used to define the queries where the sink is in scope. In this case - the SQL injection queries. +- The ninth value ``manual`` is the provenance of the sink, which is used to identify the origin of the sink. + +Example: Taint source from the ``System.Net.Sockets`` namespace +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models the return value from the ``GetStream`` method as a ``remote`` source. +This is the ``GetStream`` method in the ``TcpClient`` class, which is located in the ``System.Net.Sockets`` namespace. + +.. code-block:: csharp + + public static void Tainted(TcpClient client) { + NetworkStream stream = client.GetStream(); // The return value of this method is a remote source of taint. + ... + } + +We need to add a tuple to the ``sourceModel``\(namespace, type, subtypes, name, signature, ext, output, kind, provenance) extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: sourceModel + data: + - ["System.Net.Sockets", "TcpClient", False, "GetStream", "()", "", "ReturnValue", "remote", "manual"] + + +Since we are adding a new source, we need to add a tuple to the ``sourceModel`` extensible predicate. +The first five values identify the callable (in this case a method) to be modeled as a source. + +- The first value ``System.Net.Sockets`` is the namespace name. +- The second value ``TcpClient`` is the name of the class (type) that contains the source. +- The third value ``False`` is a flag that indicates whether or not the source also applies to all overrides of the method. +- The fourth value ``GetStream`` is the method name. +- The fifth value ``()`` is the method input type signature. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the source. + +- The seventh value ``ReturnValue`` is the access path to the return of the method, which means that it is the return value that should be considered a source of tainted input. +- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. +- The ninth value ``manual`` is the provenance of the source, which is used to identify the origin of the source. + +Example: Add flow through the ``Concat`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models flow through a method for a simple case. +This pattern covers many of the cases where we need to summarize flow through a method that is stored in a library or framework outside the repository. + +.. code-block:: csharp + + public static void TaintFlow(string s1, string s2) { + string t = String.Concat(s1, s2); // There is taint flow from s1 and s2 to t. + ... + } + +We need to add tuples to the ``summaryModel``\(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance) extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System", "String", False, "Concat", "(System.Object,System.Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["System", "String", False, "Concat", "(System.Object,System.Object)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + +Since we are adding flow through a method, we need to add tuples to the ``summaryModel`` extensible predicate. +Each tuple defines flow from one argument to the return value. +The first row defines flow from the first argument (``s1`` in the example) to the return value (``t`` in the example) and the second row defines flow from the second argument (``s2`` in the example) to the return value (``t`` in the example). + +The first five values identify the callable (in this case a method) to be modeled as a summary. +These are the same for both of the rows above as we are adding two summaries for the same method. + +- The first value ``System`` is the namespace name. +- The second value ``String`` is the class (type) name. +- The third value ``False`` is a flag that indicates whether or not the summary also applies to all overrides of the method. +- The fourth value ``Concat`` is the method name. +- The fifth value ``(System.Object,System.Object)`` is the method input type signature. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the summary. + +- The seventh value is the access path to the input (where data flows from). ``Argument[0]`` is the access path to the first argument (``s1`` in the example) and ``Argument[1]`` is the access path to the second argument (``s2`` in the example). +- The eighth value ``ReturnValue`` is the access path to the output (where data flows to), in this case ``ReturnValue``, which means that the input flows to the return value. +- The ninth value ``taint`` is the kind of the flow. ``taint`` means that taint is propagated through the call. +- The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. + +It would also be possible to merge the two rows into one by using a comma-separated list in the seventh value. This would be useful if the method has many arguments and the flow is the same for all of them. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System", "String", False, "Concat", "(System.Object,System.Object)", "", "Argument[0,1]", "ReturnValue", "taint", "manual"] + +This row defines flow from both the first and the second argument to the return value. The seventh value ``Argument[0,1]`` is shorthand for specifying an access path to both ``Argument[0]`` and ``Argument[1]``. + +Example: Add flow through the ``Trim`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models flow through a method for a simple case. + +.. code-block:: csharp + + public static void TaintFlow(string s) { + string t = s.Trim(); // There is taint flow from s to t. + ... + } + +We need to add a tuple to the ``summaryModel``\(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance) extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System", "String", False, "Trim", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + +Since we are adding flow through a method, we need to add tuples to the ``summaryModel`` extensible predicate. +Each tuple defines flow from one argument to the return value. +The first row defines flow from the qualifier of the method call (``s1`` in the example) to the return value (``t`` in the example). + +The first five values identify the callable (in this case a method) to be modeled as a summary. +These are the same for both of the rows above as we are adding two summaries for the same method. + +- The first value ``System`` is the namespace name. +- The second value ``String`` is the class (type) name. +- The third value ``False`` is a flag that indicates whether or not the summary also applies to all overrides of the method. +- The fourth value ``Trim`` is the method name. +- The fifth value ``()`` is the method input type signature. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the summary. + +- The seventh value is the access path to the input (where data flows from). ``Argument[this]`` is the access path to the qualifier (``s`` in the example). +- The eighth value ``ReturnValue`` is the access path to the output (where data flows to), in this case ``ReturnValue``, which means that the input flows to the return value. +- The ninth value ``taint`` is the kind of the flow. ``taint`` means that taint is propagated through the call. +- The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. + +Example: Add flow through the ``Select`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models a more complex flow through a method. +Here we model flow through higher order methods and collection types, as well as how to handle extension methods and generics. + +.. code-block:: csharp + + public static void TaintFlow(IEnumerable stream) { + IEnumerable lines = stream.Select(item => item + "\n"); + ... + } + +We need to add tuples to the ``summaryModel``\(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance) extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Linq", "Enumerable", False, "Select", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] + - ["System.Linq", "Enumerable", False, "Select", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[1].ReturnValue", "ReturnValue.Element", "value", "manual"] + + +Since we are adding flow through a method, we need to add tuples to the ``summaryModel`` extensible predicate. +Each tuple defines part of the flow that comprises the total flow through the ``Select`` method. +The first five values identify the callable (in this case a method) to be modeled as a summary. +These are the same for both of the rows above as we are adding two summaries for the same method. + +- The first value ``System.Linq`` is the namespace name. +- The second value ``Enumerable`` is the class (type) name. +- The third value ``False`` is a flag that indicates whether or not the summary also applies to all overrides of the method. +- The fourth value ``Select`` is the method name, along with the type parameters for the method. The names of the generic type parameters provided in the model must match the names of the generic type parameters in the method signature in the source code. +- The fifth value ``(System.Collections.Generic.IEnumerable,System.Func)`` is the method input type signature. The generics in the signature must match the generics in the method signature in the source code. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the summary definition. + +- The seventh value is the access path to the ``input`` (where data flows from). +- The eighth value is the access path to the ``output`` (where data flows to). + +For the first row: + +- The seventh value is ``Argument[0].Element``, which is the access path to the elements of the qualifier (the elements of the enumerable ``stream`` in the example). +- The eight value is ``Argument[1].Parameter[0]``, which is the access path to the first parameter of the ``System.Func`` argument of ``Select`` (the lambda parameter ``item`` in the example). + +For the second row: + +- The seventh value is ``Argument[1].ReturnValue``, which is the access path to the return value of the ``System.Func`` argument of ``Select`` (the return value of the lambda in the example). +- The eighth value is ``ReturnValue.Element``, which is the access path to the elements of the return value of ``Select`` (the elements of the enumerable ``lines`` in the example). + +For the remaining values for both rows: + +- The ninth value ``value`` is the kind of the flow. ``value`` means that the value is preserved. +- The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. + +That is, the first row specifies that values can flow from the elements of the qualifier enumerable into the first argument of the function provided to ``Select``. The second row specifies that values can flow from the return value of the function to the elements of the enumerable returned from ``Select``. + +Example: Add a ``neutral`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how we can model a method as being neutral with respect to flow. We will also cover how to model a property by modeling the getter of the ``Now`` property of the ``DateTime`` class as neutral. +A neutral model is used to define that there is no flow through a method. + +.. code-block:: csharp + + public static void TaintFlow() { + System.DateTime t = System.DateTime.Now; // There is no flow from Now to t. + ... + } + +We need to add a tuple to the ``neutralModel``\(namespace, type, name, signature, kind, provenance) extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: neutralModel + data: + - ["System", "DateTime", "get_Now", "()", "summary", "manual"] + + +Since we are adding a neutral model, we need to add tuples to the ``neutralModel`` extensible predicate. +The first four values identify the callable (in this case the getter of the ``Now`` property) to be modeled as a neutral, the fifth value is the kind, and the sixth value is the provenance (origin) of the neutral. + +- The first value ``System`` is the namespace name. +- The second value ``DateTime`` is the class (type) name. +- The third value ``get_Now`` is the method name. Getter and setter methods are named ``get_`` and ``set_`` respectively. +- The fourth value ``()`` is the method input type signature. +- The fifth value ``summary`` is the kind of the neutral. +- The sixth value ``manual`` is the provenance of the neutral. diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst index 063bcf1e4a1..7ccb12c3060 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst @@ -7,7 +7,7 @@ You can model the methods and callables that control data flow in any framework .. include:: ../reusables/kotlin-beta-note.rst -.. include:: ../reusables/beta-note-model-packs-java.rst +.. include:: ../reusables/beta-note-customizing-library-models.rst About this article ------------------ @@ -61,10 +61,10 @@ Extensible predicates used to create custom models in Java and Kotlin The CodeQL library for Java and Kotlin analysis exposes the following extensible predicates: -- ``sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." +- ``sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." - ``sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data maybe used in a way that makes the code vulnerable. - ``summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. -- ``neutralModel(package, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. +- ``neutralModel(package, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) override generated summary models (those with a provenance such as ``df-generated``) so that the summary will be ignored. Other than that, neutral models have a slight impact on the dataflow dispatch logic, which is out of scope for this documentation. The extensible predicates are populated using the models defined in data extension files. @@ -151,7 +151,7 @@ The sixth value should be left empty and is out of scope for this documentation. The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the source. - The seventh value ``ReturnValue`` is the access path to the return of the method, which means that it is the return value that should be considered a source of tainted input. -- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. For more information, see ":ref:`Threat models `." +- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. For more information, see ":ref:`Threat models `." - The ninth value ``manual`` is the provenance of the source, which is used to identify the origin of the source. Example: Add flow through the ``concat`` method @@ -292,7 +292,7 @@ The first four values identify the callable (in this case a method) to be modele - The fifth value ``summary`` is the kind of the neutral. - The sixth value ``manual`` is the provenance of the neutral. -.. _threat-models: +.. _threat-models-java: Threat models ------------- diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-ruby.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-ruby.rst deleted file mode 100644 index 8de04d882da..00000000000 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-ruby.rst +++ /dev/null @@ -1,406 +0,0 @@ -.. _customizing-library-models-for-ruby: - -:orphan: -:nosearch: - -Customizing Library Models for Ruby -=================================== - -.. include:: ../reusables/beta-note-customizing-library-models.rst - -Ruby analysis can be customized by adding library models in data extension files. - -A data extension for Ruby is a YAML file of the form: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: - data: - - - - - - ... - -The CodeQL library for Ruby exposes the following extensible predicates: - -- **sourceModel**\(type, path, kind) -- **sinkModel**\(type, path, kind) -- **typeModel**\(type1, type2, path) -- **summaryModel**\(type, path, input, output, kind) - -See the `CLI documentation for how to load and use data extensions in a CodeQL evaluation run `__ (internal access required). - -We'll explain how to use these using a few examples, and provide some reference material at the end of this article. - -Example: Taint sink in the 'tty-command' gem --------------------------------------------- - -In this example, we'll show how to add the following argument, passed to **tty-command**, as a command-line injection sink: - -.. code-block:: ruby - - tty = TTY::Command.new - tty.run(cmd) # <-- add 'cmd' as a taint sink - -For this example, you can use the following data extension: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: sinkModel - data: - - ["TTY::Command", "Method[run].Argument[0]", "command-injection"] - - -- Since we're adding a new sink, we add a tuple to the **sinkModel** extensible predicate. -- The first column, **"TTY::Command"**, identifies a set of values from which to begin the search for the sink. - The string **"TTY::Command""** means we start at the places where the codebase constructs instances of the class **TTY::Command**. -- The second column is an access path that is evaluated from left to right, starting at the values that were identified by the first column. - - - **Method[run]** selects calls to the **run** method of the **TTY::Command** class. - - **Argument[0]** selects the first argument to calls to that member. - -- **command-injection** indicates that this is considered a sink for the command injection query. - -Example: Taint sources from 'sinatra' block parameters ------------------------------------------------------- - -In this example, we'll show how the 'x' parameter below could be marked as a remote flow source: - -.. code-block:: ruby - - class MyApp < Sinatra::Base - get '/' do |x| # <-- add 'x' as a taint source - # ... - end - end - -For this example you could use the following data extension: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: sourceModel - data: - - [ - "Sinatra::Base!", - "Method[get].Argument[block].Parameter[0]", - "remote", - ] - -- Since we're adding a new taint source, we add a tuple to the **sourceModel** extensible predicate. -- The first column, **"Sinatra::Base!"**, begins the search at references to the **Sinatra::Base** class. - The **!** suffix indicates that we want to search for references to the class itself, rather than instances of the class. -- **Method[get]** selects calls to the **get** method of the **Sinatra::Base** class. -- **Argument[block]** selects the block argument to the **get** method call. -- **Parameter[0]** selects the first parameter of the block argument (the parameter named **x**). -- Finally, the kind **remote** indicates that this is considered a source of remote flow. - -Example: Using types to add MySQL injection sinks -------------------------------------------------- - -In this example, we'll show how to add the following SQL injection sink: - -.. code-block:: ruby - - def submit(q) - client = Mysql2::Client.new - client.query(q) # <-- add 'q' as a SQL injection sink - end - -We can recognize this using the following extension: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: sinkModel - data: - - ["Mysql2::Client", "Method[query].Argument[0]", "sql-injection"] - -- The first column, **"Mysql2::Client"**, begins the search at any instance of the **Mysql2::Client** class. -- **Method[query]** selects any call to the **query** method on that instance. -- **Argument[0]** selects the first argument to the method call. -- **sql-injection** indicates that this is considered a sink for the SQL injection query. - -Continued example: Using type models ------------------------------------- - -Consider this variation on the previous example, the mysql2 EventMachine API is used. -The client is obtained via a call to **Mysql2::EM::Client.new**. - -.. code-block:: ruby - - def submit(client, q) - client = Mysql2::EM::Client.new - client.query(q) - end - -So far we have only one model for **Mysql2::Client**, but in the real world we -may have many models for the various methods available. Because **Mysql2::EM::Client** is a subclass of **Mysql2::Client**, it inherits all of the same methods. -Instead of updating all our models to include both classes, we can add a type -model to indicate that **Mysql2::EM::Client** is a subclass of **Mysql2::Client**: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: typeModel - data: - - ["Mysql2::Client", "Mysql2::EM::Client", ""] - -Example: Adding flow through 'URI.decode_uri_component' -------------------------------------------------------- - -In this example, we'll show how to add flow through calls to 'URI.decode_uri_component': - -.. code-block:: ruby - - y = URI.decode_uri_component(x); # add taint flow from 'x' to 'y' - -We can model this using the following data extension: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: summaryModel - data: - - [ - "URI!", - "Method[decode_uri_component]", - "Argument[0]", - "ReturnValue", - "taint", - ] - - -- Since we're adding flow through a method call, we add a tuple to the **summaryModel** extensible predicate. -- The first column, **"URI!"**, begins the search for relevant calls at references to the **URI** class. -- The **!** suffix indicates that we are looking for the class itself, rather than instances of the class. -- The second column, **Method[decode_uri_component]**, is a path leading to the method calls we wish to model. - In this case, we select references to the **decode_uri_component** method from the **URI** class. -- The third column, **Argument[0]**, indicates the input of the flow. In this case, the first argument to the method call. -- The fourth column, **ReturnValue**, indicates the output of the flow. In this case, the return value of the method call. -- The last column, **taint**, indicates the kind of flow to add. The value **taint** means the output is not necessarily equal - to the input, but was derived from the input in a taint-preserving way. - -Example: Adding flow through 'File#each' ----------------------------------------- - -In this example, we'll show how to add flow through calls to **File#each** from the standard library, which iterates over the lines of a file: - -.. code-block:: ruby - - f = File.new("example.txt") - f.each { |line| ... } # add taint flow from `f` to `line` - -We can model this using the following data extension: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: summaryModel - data: - - [ - "File", - "Method[each]", - "Argument[self]", - "Argument[block].Parameter[0]", - "taint", - ] - - -- Since we're adding flow through a method call, we add a tuple to the **summaryModel** extensible predicate. -- The first column, **"File"**, begins the search for relevant calls at places where the **File** class is used. -- The second column, **Method[each]**, selects references to the **each** method on the **File** class. -- The third column specifies the input of the flow. **Argument[self]** selects the **self** argument of **each**, which is the **File** instance being iterated over. - -- The fourth column specifies the output of the flow: - - - **Argument[block]** selects the block argument of **each** (the block which is executed for each line in the file). - - **Parameter[0]** selects the first parameter of the block (the parameter named **line**). - -- The last column, **taint**, indicates the kind of flow to add. - -Reference material ------------------- - -The following sections provide reference material for extensible predicates, access paths, types, and kinds. - -Extensible predicates ---------------------- - -sourceModel(type, path, kind) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Adds a new taint source. Most taint-tracking queries will use the new source. - -- **type**: Name of a type from which to evaluate **path**. -- **path**: Access path leading to the source. -- **kind**: Kind of source to add. Currently only **remote** is used. - -Example: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: sourceModel - data: - - ["User", "Method[name]", "remote"] - -sinkModel(type, path, kind) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Adds a new taint sink. Sinks are query-specific and will typically affect one or two queries. - -- **type**: Name of a type from which to evaluate **path**. -- **path**: Access path leading to the sink. -- **kind**: Kind of sink to add. See the section on sink kinds for a list of supported kinds. - -Example: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: sinkModel - data: - - ["ExecuteShell", "Method[run].Argument[0]", "command-injection"] - -summaryModel(type, path, input, output, kind) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Adds flow through a method call. - -- **type**: Name of a type from which to evaluate **path**. -- **path**: Access path leading to a method call. -- **input**: Path relative to the method call that leads to input of the flow. -- **output**: Path relative to the method call leading to the output of the flow. -- **kind**: Kind of summary to add. Can be **taint** for taint-propagating flow, or **value** for value-preserving flow. - -Example: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: summaryModel - data: - - [ - "URI", - "Method[decode_uri_component]", - "Argument[0]", - "ReturnValue", - "taint", - ] - -typeModel(type1, type2, path) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Adds a new definition of a type. - -- **type1**: Name of the type to define. -- **type2**: Name of the type from which to evaluate **path**. -- **path**: Access path leading from **type2** to **type1**. - -Example: - -.. code-block:: yaml - - extensions: - - addsTo: - pack: codeql/ruby-all - extensible: typeModel - data: - - [ - "Mysql2::Client", - "MyDbWrapper", - "Method[getConnection].ReturnValue", - ] - -Types ------ - -A type is a string that identifies a set of values. -In each of the extensible predicates mentioned in previous section, the first column is always the name of a type. -A type can be defined by adding **typeModel** tuples for that type. - -Access paths ------------- - -The **path**, **input**, and **output** columns consist of a **.**-separated list of components, which is evaluated from left to right, -with each step selecting a new set of values derived from the previous set of values. - -The following components are supported: - -- **Argument[**\ `number`\ **]** selects the argument at the given index. -- **Argument[**\ `string`:\ **]** selects the keyword argument with the given name. -- **Argument[self]** selects the receiver of a method call. -- **Argument[block]** selects the block argument. -- **Argument[any]** selects any argument, except self or block arguments. -- **Argument[any-named]** selects any keyword argument. -- **Argument[hash-splat]** selects a special argument representing all keyword arguments passed in the method call. -- **Parameter[**\ `number`\ **]** selects the argument at the given index. -- **Parameter[**\ `string`:\ **]** selects the keyword argument with the given name. -- **Parameter[self]** selects the **self** parameter of a method. -- **Parameter[block]** selects the block parameter. -- **Parameter[any]** selects any parameter, except self or block parameters. -- **Parameter[any-named]** selects any keyword parameter. -- **Parameter[hash-splat]** selects the hash splat parameter, often written as **\*\*kwargs**. -- **ReturnValue** selects the return value of a call. -- **Method[**\ `name`\ **]** selects a call to the method with the given name. -- **Element[any]** selects any element of an array or hash. -- **Element[**\ `number`\ **]** selects an array element at the given index. -- **Element[**\ `string`\ **]** selects a hash element at the given key. -- **Field[@**\ `string`\ **]** selects an instance variable with the given name. -- **Fuzzy** selects all values that are derived from the current value through a combination of the other operations described in this list. - For example, this can be used to find all values that appear to originate from a particular class. This can be useful for finding method calls - from a known class, but where the receiver type is not known or is difficult to model. - -Additional notes about the syntax of operands: - -- Multiple operands may be given to a single component, as a shorthand for the union of the operands. For example, **Method[foo,bar]** matches the union of **Method[foo]** and **Method[bar]**. -- Numeric operands to **Argument**, **Parameter**, and **Element** may be given as a lower bound. For example, **Argument[1..]** matches all arguments except 0. - -Kinds ------ - -Source kinds -~~~~~~~~~~~~ - -- **remote**: A generic source of remote flow. Most taint-tracking queries will use such a source. Currently this is the only supported source kind. - -Sink kinds -~~~~~~~~~~ - -Unlike sources, sinks tend to be highly query-specific, rarely affecting more than one or two queries. -Not every query supports customizable sinks. If the following sinks are not suitable for your use case, you should add a new query. - -- **code-injection**: A sink that can be used to inject code, such as in calls to **eval**. -- **command-injection**: A sink that can be used to inject shell commands, such as in calls to **Process.spawn**. -- **path-injection**: A sink that can be used for path injection in a file system access, such as in calls to **File.open**. -- **sql-injection**: A sink that can be used for SQL injection, such as in an ActiveRecord **where** call. -- **url-redirection**: A sink that can be used to redirect the user to a malicious URL. -- **log-injection**: A sink that can be used for log injection, such as in a **Rails.logger** call. - -Summary kinds -~~~~~~~~~~~~~ - -- **taint**: A summary that propagates taint. This means the output is not necessarily equal to the input, but it was derived from the input in an unrestrictive way. An attacker who controls the input will have significant control over the output as well. -- **value**: A summary that preserves the value of the input or creates a copy of the input such that all of its object properties are preserved. diff --git a/docs/codeql/codeql-language-guides/extensible-predicates.rst b/docs/codeql/codeql-language-guides/extensible-predicates.rst index 0ed962df4af..7b00f09785e 100644 --- a/docs/codeql/codeql-language-guides/extensible-predicates.rst +++ b/docs/codeql/codeql-language-guides/extensible-predicates.rst @@ -8,7 +8,7 @@ Extensible predicates and their interaction with data extensions You can use data extensions to model the methods and callables that control dataflow in any framework or library. This is especially useful for custom frameworks or niche libraries, that are not supported by the standard CodeQL libraries. -.. include:: ../reusables/beta-note-model-packs-java.rst +.. include:: ../reusables/beta-note-customizing-library-models.rst About this article ------------------ diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.3.rst new file mode 100644 index 00000000000..af699a301c4 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.3.rst @@ -0,0 +1,194 @@ +.. _codeql-cli-2.16.3: + +========================== +CodeQL 2.16.3 (2024-02-22) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.16.3 runs a total of 408 security queries when configured with the Default suite (covering 160 CWE). The Extended suite enables an additional 131 queries (covering 34 more CWE). 2 security queries have been added with this release. + +CodeQL CLI +---------- + +Bug Fixes +~~~~~~~~~ + +* Fixed a bug where CodeQL may produce an invalid database when it exhausts all available ID numbers. Now it detects the condition and reports an error instead. + +New Features +~~~~~~~~~~~~ + +* A new extractor option has been added to the Python extractor: :code:`python_executable_name`. + You can use this option to override the default process the extractor uses to find and select a Python executable. + Pass one of :code:`--extractor-option python_executable_name=py` or :code:`--extractor-option python_executable_name=python` or :code:`--extractor-option python_executable_name=python3` to commands that run the extractor, for example: :code:`codeql database create`. + + On Windows machines, the Python extractor will expect to find :code:`py.exe` on the system :code:`PATH` by default. + If the Python executable has a different name, you can set the new extractor option to override this value and look for :code:`python.exe` or :code:`python3.exe`. + + For more information about using the extractor option with the CodeQL CLI, see `Extractor options `__. + +Security Updates +~~~~~~~~~~~~~~~~ + +* Fixes CVE-2024-25129, a limited data exfiltration vulnerability that could be triggered by untrusted databases or QL packs. See the + \ `security advisory `__ for more information. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +JavaScript/TypeScript +""""""""""""""""""""" + +* The left operand of the :code:`&&` operator no longer propagates data flow by default. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Golang +"""""" + +* The query "Use of a hardcoded key for signing JWT" (:code:`go/hardcoded-key`) has been promoted from experimental to the main query pack. Its results will now appear by default as part of :code:`go/hardcoded-credentials`. This query was originally `submitted as an experimental query by @porcupineyhairs `__. + +Java +"""" + +* The sinks of the queries :code:`java/path-injection` and :code:`java/path-injection-local` have been reworked. Path creation sinks have been converted to summaries instead, while sinks now are actual file read/write operations only. This has reduced the false positive ratio of both queries. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* The "non-constant format string" query (:code:`cpp/non-constant-format`) has been updated to produce fewer false positives. +* Added dataflow models for the :code:`gettext` function variants. + +C# +"" + +* Added sanitizers for relative URLs, :code:`List.Contains()`, and checking the :code:`.Host` property on an URI to the :code:`cs/web/unvalidated-url-redirection` query. + +Java +"""" + +* The sanitizer for the path injection queries has been improved to handle more cases where :code:`equals` is used to check an exact path match. +* The query :code:`java/unvalidated-url-redirection` now sanitizes results following the same logic as the query :code:`java/ssrf`. URLs where the destination cannot be controlled externally are no longer reported. + +New Queries +~~~~~~~~~~~ + +Golang +"""""" + +* The query "Missing JWT signature check" (:code:`go/missing-jwt-signature-check`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally `submitted as an experimental query by @am0o0 `__. + +Java +"""" + +* Added a new query :code:`java/android/insecure-local-authentication` for finding uses of biometric authentication APIs that do not make use of a :code:`KeyStore`\ -backed key and thus may be bypassed. + +Swift +""""" + +* Added a new experimental query, :code:`swift/unsafe-unpacking`, that detects unpacking user controlled zips without validating the destination file path is within the destination directory. + +Query Metadata Changes +~~~~~~~~~~~~~~~~~~~~~~ + +Java +"""" + +* The :code:`security-severity` score of the query :code:`java/relative-path-command` has been reduced to better adjust it to the specific conditions needed for exploitation. + +Language Libraries +------------------ + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* C# 12: The QL and data flow library now support primary constructors. +* Added a new database relation to store key-value pairs corresponding to compilations. The new relation is used in buildless mode to surface information related to dependency fetching. + +Java +"""" + +* An extension point for sanitizers of the query :code:`java/unvalidated-url-redirection` has been added. + +* Added models for the following packages: + + * java.io + * java.lang + * java.net + * java.net.http + * java.nio.file + * java.util.zip + * javax.servlet + * org.apache.commons.io + * org.apache.hadoop.fs + * org.apache.hadoop.fs.s3a + * org.eclipse.jetty.client + * org.gradle.api.file + +JavaScript/TypeScript +""""""""""""""""""""" + +* The name "certification" is no longer seen as possibly being a certificate, and will therefore no longer be flagged in queries like "clear-text-logging" which look for sensitive data. + +Python +"""""" + +* The name "certification" is no longer seen as possibly being a certificate, and will therefore no longer be flagged in queries like "clear-text-logging" which look for sensitive data. +* Added modeling of the :code:`psycopg` PyPI package as a SQL database library. + +Ruby +"""" + +* Raw output ERB tags of the form :code:`<%== ... %>` are now recognised as cross-site scripting sinks. +* The name "certification" is no longer seen as possibly being a certificate, and will therefore no longer be flagged in queries like "clear-text-logging" which look for sensitive data. + +Swift +""""" + +* The name "certification" is no longer seen as possibly being a certificate, and will therefore no longer be flagged in queries like "clear-text-logging" which look for sensitive data. + +Deprecated APIs +~~~~~~~~~~~~~~~ + +Java +"""" + +* The :code:`PathCreation` class in :code:`PathCreation.qll` has been deprecated. + +New Features +~~~~~~~~~~~~ + +C/C++ +""""" + +* A :code:`getInitialization` predicate was added to the :code:`RangeBasedForStmt` class that yields the C++20-style initializer of the range-based :code:`for` statement when it exists. + +Shared Libraries +---------------- + +Breaking Changes +~~~~~~~~~~~~~~~~ + +Dataflow Analysis +""""""""""""""""" + +* The :code:`edges` predicate contained in :code:`PathGraph` now contains two additional columns for propagating model provenance information. This is primarily an internal change without any impact on any APIs, except for specialised queries making use of :code:`MergePathGraph` in conjunction with custom :code:`PathGraph` implementations. Such queries will need to be updated to reference the two new columns. This is expected to be very rare, as :code:`MergePathGraph` is an advanced feature, but it is a breaking change for any such affected queries. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index 2c1de5b5957..a04f37ad9e4 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here `_,"``github.com/couchbase/gocb*``, ``gopkg.in/couchbase/gocb*``",,36, `Couchbase unofficial client `_,``github.com/couchbaselabs/gocb*``,,18, `Echo `_,``github.com/labstack/echo*``,,2, + `Fosite `_,``github.com/ory/fosite*``,,,2 `Gin `_,``github.com/gin-gonic/gin*``,,2, + `Go kit `_,``github.com/go-kit/kit*``,,,1 + `Iris `_,``github.com/kataras/iris*``,,,1 `Kubernetes `_,"``k8s.io/api*``, ``k8s.io/apimachinery*``",,57, `Macaron `_,``gopkg.in/macaron*``,,1, `Revel `_,"``github.com/revel/revel*``, ``github.com/robfig/revel*``",,20, `SendGrid `_,``github.com/sendgrid/sendgrid-go*``,,1, - `Standard library `_,"````, ``archive/*``, ``bufio``, ``bytes``, ``cmp``, ``compress/*``, ``container/*``, ``context``, ``crypto``, ``crypto/*``, ``database/*``, ``debug/*``, ``embed``, ``encoding``, ``encoding/*``, ``errors``, ``expvar``, ``flag``, ``fmt``, ``go/*``, ``hash``, ``hash/*``, ``html``, ``html/*``, ``image``, ``image/*``, ``index/*``, ``io``, ``io/*``, ``log``, ``log/*``, ``maps``, ``math``, ``math/*``, ``mime``, ``mime/*``, ``net``, ``net/*``, ``os``, ``os/*``, ``path``, ``path/*``, ``plugin``, ``reflect``, ``reflect/*``, ``regexp``, ``regexp/*``, ``slices``, ``sort``, ``strconv``, ``strings``, ``sync``, ``sync/*``, ``syscall``, ``syscall/*``, ``testing``, ``testing/*``, ``text/*``, ``time``, ``time/*``, ``unicode``, ``unicode/*``, ``unsafe``",8,577, + `Standard library `_,"````, ``archive/*``, ``bufio``, ``bytes``, ``cmp``, ``compress/*``, ``container/*``, ``context``, ``crypto``, ``crypto/*``, ``database/*``, ``debug/*``, ``embed``, ``encoding``, ``encoding/*``, ``errors``, ``expvar``, ``flag``, ``fmt``, ``go/*``, ``hash``, ``hash/*``, ``html``, ``html/*``, ``image``, ``image/*``, ``index/*``, ``io``, ``io/*``, ``log``, ``log/*``, ``maps``, ``math``, ``math/*``, ``mime``, ``mime/*``, ``net``, ``net/*``, ``os``, ``os/*``, ``path``, ``path/*``, ``plugin``, ``reflect``, ``reflect/*``, ``regexp``, ``regexp/*``, ``slices``, ``sort``, ``strconv``, ``strings``, ``sync``, ``sync/*``, ``syscall``, ``syscall/*``, ``testing``, ``testing/*``, ``text/*``, ``time``, ``time/*``, ``unicode``, ``unicode/*``, ``unsafe``",8,578, `beego `_,"``github.com/astaxie/beego*``, ``github.com/beego/beego*``",,42, + `cristalhq/jwt `_,``github.com/cristalhq/jwt*``,,,1 `fasthttp `_,``github.com/valyala/fasthttp*``,,5, `go-pg `_,``github.com/go-pg/pg*``,,6, `golang.org/x/net `_,``golang.org/x/net*``,,21, `goproxy `_,``github.com/elazarl/goproxy*``,,2, `json-iterator `_,``github.com/json-iterator/go*``,,4, `jsonpatch `_,``github.com/evanphx/json-patch*``,,12, + `jwt-go `_,"``github.com/golang-jwt/jwt*``, ``github.com/form3tech-oss/jwt-go*``, ``github.com/dgrijalva/jwt-go*``",,20,8 + `jwtauth `_,``github.com/go-chi/jwtauth*``,,,1 + `kataras/jwt `_,``github.com/kataras/jwt*``,,,5 + `lestrrat-go/jwx `_,"``github.com/lestrrat-go/jwx*``, ``github.com/lestrrat/go-jwx*``",,,3 `protobuf `_,"``github.com/golang/protobuf*``, ``google.golang.org/protobuf*``",,16, `yaml `_,``gopkg.in/yaml*``,,9, `zap `_,``go.uber.org/zap*``,,11, - Totals,,8,842, + Others,"``github.com/go-jose/go-jose/$ANYVERSION/jwt``, ``gopkg.in/square/go-jose.v2/jwt``",,8,2 + Totals,,8,871,24 diff --git a/go/extractor/autobuilder/autobuilder.go b/go/extractor/autobuilder/autobuilder.go index 11c49735eaa..eec9ba84c04 100644 --- a/go/extractor/autobuilder/autobuilder.go +++ b/go/extractor/autobuilder/autobuilder.go @@ -70,12 +70,33 @@ func tryBuild(cmd string, args ...string) bool { return res && (!CheckExtracted || checkExtractorRun()) } -// Autobuild attempts to detect build system and run the corresponding command. -func Autobuild() bool { - return tryBuildIfExists("Makefile", "make") || - tryBuildIfExists("makefile", "make") || - tryBuildIfExists("GNUmakefile", "make") || - tryBuildIfExists("build.ninja", "ninja") || - tryBuildIfExists("build", "./build") || - tryBuildIfExists("build.sh", "./build.sh") +// If a project is accompanied by a build script (such as a makefile), then we try executing such +// build scripts to build the project. This type represents pairs of script names to check for +// and the names of corresponding build tools to invoke if those scripts exist. +type BuildScript struct { + Tool string // The name of the command to execute if the build script exists + Filename string // The name of the build script to check for +} + +// An array of build scripts to check for and corresponding commands that we can execute +// if they exist. +var BuildScripts = []BuildScript{ + {Tool: "make", Filename: "Makefile"}, + {Tool: "make", Filename: "makefile"}, + {Tool: "make", Filename: "GNUmakefile"}, + {Tool: "ninja", Filename: "build.ninja"}, + {Tool: "./build", Filename: "build"}, + {Tool: "./build.sh", Filename: "build.sh"}, +} + +// Autobuild attempts to detect build systems based on the presence of build scripts from the +// list in `BuildScripts` and run the corresponding command. This may invoke zero or more +// build scripts in the order given by `BuildScripts`. +func Autobuild() bool { + for _, script := range BuildScripts { + if tryBuildIfExists(script.Filename, script.Tool) { + return true + } + } + return false } diff --git a/go/extractor/autobuilder/build-environment.go b/go/extractor/autobuilder/build-environment.go index 485786ed946..3f03ff922af 100644 --- a/go/extractor/autobuilder/build-environment.go +++ b/go/extractor/autobuilder/build-environment.go @@ -12,7 +12,7 @@ import ( ) const minGoVersion = "1.11" -const maxGoVersion = "1.21" +const maxGoVersion = "1.22" type versionInfo struct { goModVersion string // The version of Go found in the go directive in the `go.mod` file. @@ -267,15 +267,22 @@ func outputEnvironmentJson(version string) { // Get the version of Go to install and output it to stdout as json. func IdentifyEnvironment() { var v versionInfo - buildInfo := project.GetBuildInfo(false) - goVersionInfo := project.TryReadGoDirective(buildInfo) - v.goModVersion, v.goModVersionFound = goVersionInfo.Version, goVersionInfo.Found + workspaces := project.GetWorkspaceInfo(false) + // Remove temporary extractor files (e.g. auto-generated go.mod files) when we are done + defer project.RemoveTemporaryExtractorFiles() + + // Find the greatest Go version required by any of the workspaces. + greatestGoVersion := project.RequiredGoVersion(&workspaces) + v.goModVersion, v.goModVersionFound = greatestGoVersion.Version, greatestGoVersion.Found + + // Find which, if any, version of Go is installed on the system already. v.goEnvVersionFound = toolchain.IsInstalled() if v.goEnvVersionFound { v.goEnvVersion = toolchain.GetEnvGoVersion()[2:] } + // Determine which version of Go we should recommend to install. msg, versionToInstall := getVersionToInstall(v) log.Println(msg) diff --git a/go/extractor/cli/go-autobuilder/go-autobuilder.go b/go/extractor/cli/go-autobuilder/go-autobuilder.go index 0fcbfd4686c..b2e2a78666f 100644 --- a/go/extractor/cli/go-autobuilder/go-autobuilder.go +++ b/go/extractor/cli/go-autobuilder/go-autobuilder.go @@ -3,7 +3,6 @@ package main import ( "fmt" "log" - "net/url" "os" "os/exec" "path/filepath" @@ -56,80 +55,6 @@ Build behavior: fmt.Fprintf(os.Stderr, "Usage:\n\n %s\n", os.Args[0]) } -// Returns the current Go version in semver format, e.g. v1.14.4 -func getEnvGoSemVer() string { - goVersion := toolchain.GetEnvGoVersion() - if !strings.HasPrefix(goVersion, "go") { - log.Fatalf("Expected 'go version' output of the form 'go1.2.3'; got '%s'", goVersion) - } - // Go versions don't follow the SemVer format, but the only exception we normally care about - // is release candidates; so this is a horrible hack to convert e.g. `go1.22rc1` into `go1.22-rc1` - // which is compatible with the SemVer specification - rcIndex := strings.Index(goVersion, "rc") - if rcIndex != -1 { - return semver.Canonical("v"+goVersion[2:rcIndex]) + "-" + goVersion[rcIndex:] - } else { - return semver.Canonical("v" + goVersion[2:]) - } -} - -// Returns the import path of the package being built, or "" if it cannot be determined. -func getImportPath() (importpath string) { - importpath = os.Getenv("LGTM_INDEX_IMPORT_PATH") - if importpath == "" { - repourl := os.Getenv("SEMMLE_REPO_URL") - if repourl == "" { - githubrepo := os.Getenv("GITHUB_REPOSITORY") - if githubrepo == "" { - log.Printf("Unable to determine import path, as neither LGTM_INDEX_IMPORT_PATH nor GITHUB_REPOSITORY is set\n") - return "" - } else { - importpath = "github.com/" + githubrepo - } - } else { - importpath = getImportPathFromRepoURL(repourl) - if importpath == "" { - log.Printf("Failed to determine import path from SEMMLE_REPO_URL '%s'\n", repourl) - return - } - } - } - log.Printf("Import path is '%s'\n", importpath) - return -} - -// Returns the import path of the package being built from `repourl`, or "" if it cannot be -// determined. -func getImportPathFromRepoURL(repourl string) string { - // check for scp-like URL as in "git@github.com:github/codeql-go.git" - shorturl := regexp.MustCompile(`^([^@]+@)?([^:]+):([^/].*?)(\.git)?$`) - m := shorturl.FindStringSubmatch(repourl) - if m != nil { - return m[2] + "/" + m[3] - } - - // otherwise parse as proper URL - u, err := url.Parse(repourl) - if err != nil { - log.Fatalf("Malformed repository URL '%s'\n", repourl) - } - - if u.Scheme == "file" { - // we can't determine import paths from file paths - return "" - } - - if u.Hostname() == "" || u.Path == "" { - return "" - } - - host := u.Hostname() - path := u.Path - // strip off leading slashes and trailing `.git` if present - path = regexp.MustCompile(`^/+|\.git$`).ReplaceAllString(path, "") - return host + "/" + path -} - func restoreRepoLayout(fromDir string, dirEntries []string, scratchDirName string, toDir string) { for _, dirEntry := range dirEntries { if dirEntry != scratchDirName { @@ -177,8 +102,8 @@ func getSourceDir() string { } // fixGoVendorIssues fixes issues with go vendor for go version >= 1.14 -func fixGoVendorIssues(buildInfo *project.BuildInfo, goModVersionFound bool) { - if buildInfo.ModMode == project.ModVendor { +func fixGoVendorIssues(workspace *project.GoWorkspace, goModVersionFound bool) { + if workspace.ModMode == project.ModVendor { // fix go vendor issues with go versions >= 1.14 when no go version is specified in the go.mod // if this is the case, and dependencies were vendored with an old go version (and therefore // do not contain a '## explicit' annotation, the go command will fail and refuse to do any @@ -186,7 +111,7 @@ func fixGoVendorIssues(buildInfo *project.BuildInfo, goModVersionFound bool) { // // we work around this by adding an explicit go version of 1.13, which is the last version // where this is not an issue - if buildInfo.DepMode == project.GoGetWithModules { + if workspace.DepMode == project.GoGetWithModules { if !goModVersionFound { // if the go.mod does not contain a version line modulesTxt, err := os.ReadFile("vendor/modules.txt") @@ -197,7 +122,7 @@ func fixGoVendorIssues(buildInfo *project.BuildInfo, goModVersionFound bool) { log.Println("Adding a version directive to the go.mod file as the modules.txt does not have explicit annotations") if !addVersionToMod("1.13") { log.Println("Failed to add a version to the go.mod file to fix explicitly required package bug; not using vendored dependencies") - buildInfo.ModMode = project.ModMod + workspace.ModMode = project.ModMod } } } @@ -206,9 +131,9 @@ func fixGoVendorIssues(buildInfo *project.BuildInfo, goModVersionFound bool) { } // Determines whether the project needs a GOPATH set up -func getNeedGopath(buildInfo project.BuildInfo, importpath string) bool { +func getNeedGopath(workspace project.GoWorkspace, importpath string) bool { needGopath := true - if buildInfo.DepMode == project.GoGetWithModules { + if workspace.DepMode == project.GoGetWithModules { needGopath = false } // if `LGTM_INDEX_NEED_GOPATH` is set, it overrides the value for `needGopath` inferred above @@ -229,44 +154,46 @@ func getNeedGopath(buildInfo project.BuildInfo, importpath string) bool { } // Try to update `go.mod` and `go.sum` if the go version is >= 1.16. -func tryUpdateGoModAndGoSum(buildInfo project.BuildInfo) { +func tryUpdateGoModAndGoSum(workspace project.GoWorkspace) { // Go 1.16 and later won't automatically attempt to update go.mod / go.sum during package loading, so try to update them here: - if buildInfo.ModMode != project.ModVendor && buildInfo.DepMode == project.GoGetWithModules && semver.Compare(getEnvGoSemVer(), "v1.16") >= 0 { - // stat go.mod and go.sum - goModPath := filepath.Join(buildInfo.BaseDir, "go.mod") - beforeGoModFileInfo, beforeGoModErr := os.Stat(goModPath) - if beforeGoModErr != nil { - log.Println("Failed to stat go.mod before running `go mod tidy -e`") - } - - goSumPath := filepath.Join(buildInfo.BaseDir, "go.sum") - beforeGoSumFileInfo, beforeGoSumErr := os.Stat(goSumPath) - - // run `go mod tidy -e` - cmd := exec.Command("go", "mod", "tidy", "-e") - cmd.Dir = buildInfo.BaseDir - res := util.RunCmd(cmd) - - if !res { - log.Println("Failed to run `go mod tidy -e`") - } else { - if beforeGoModFileInfo != nil { - afterGoModFileInfo, afterGoModErr := os.Stat(goModPath) - if afterGoModErr != nil { - log.Println("Failed to stat go.mod after running `go mod tidy -e`") - } else if afterGoModFileInfo.ModTime().After(beforeGoModFileInfo.ModTime()) { - // if go.mod has been changed then notify the user - log.Println("We have run `go mod tidy -e` and it altered go.mod. You may wish to check these changes into version control. ") - } + if workspace.ModMode != project.ModVendor && workspace.DepMode == project.GoGetWithModules && semver.Compare(toolchain.GetEnvGoSemVer(), "v1.16") >= 0 { + for _, goMod := range workspace.Modules { + // stat go.mod and go.sum + goModPath := goMod.Path + goModDir := filepath.Dir(goModPath) + beforeGoModFileInfo, beforeGoModErr := os.Stat(goModPath) + if beforeGoModErr != nil { + log.Printf("Failed to stat %s before running `go mod tidy -e`\n", goModPath) } - afterGoSumFileInfo, afterGoSumErr := os.Stat(goSumPath) - if afterGoSumErr != nil { - log.Println("Failed to stat go.sum after running `go mod tidy -e`") + goSumPath := filepath.Join(goModDir, "go.sum") + beforeGoSumFileInfo, beforeGoSumErr := os.Stat(goSumPath) + + // run `go mod tidy -e` + cmd := toolchain.TidyModule(goModDir) + res := util.RunCmd(cmd) + + if !res { + log.Printf("Failed to run `go mod tidy -e` in %s\n", goModDir) } else { - if beforeGoSumErr != nil || afterGoSumFileInfo.ModTime().After(beforeGoSumFileInfo.ModTime()) { - // if go.sum has been changed then notify the user - log.Println("We have run `go mod tidy -e` and it altered go.sum. You may wish to check these changes into version control. ") + if beforeGoModFileInfo != nil { + afterGoModFileInfo, afterGoModErr := os.Stat(goModPath) + if afterGoModErr != nil { + log.Printf("Failed to stat %s after running `go mod tidy -e`: %s\n", goModPath, afterGoModErr.Error()) + } else if afterGoModFileInfo.ModTime().After(beforeGoModFileInfo.ModTime()) { + // if go.mod has been changed then notify the user + log.Println("We have run `go mod tidy -e` and it altered go.mod. You may wish to check these changes into version control. ") + } + } + + afterGoSumFileInfo, afterGoSumErr := os.Stat(goSumPath) + if afterGoSumErr != nil { + log.Printf("Failed to stat %s after running `go mod tidy -e`: %s\n", goSumPath, afterGoSumErr.Error()) + } else { + if beforeGoSumErr != nil || afterGoSumFileInfo.ModTime().After(beforeGoSumFileInfo.ModTime()) { + // if go.sum has been changed then notify the user + log.Println("We have run `go mod tidy -e` and it altered go.sum. You may wish to check these changes into version control. ") + } } } } @@ -406,7 +333,7 @@ func buildWithoutCustomCommands(modMode project.ModMode) bool { log.Println("Build failed, continuing to install dependencies.") shouldInstallDependencies = true - } else if util.DepErrors("./...", modMode.ArgsForGoVersion(getEnvGoSemVer())...) { + } else if util.DepErrors("./...", modMode.ArgsForGoVersion(toolchain.GetEnvGoSemVer())...) { log.Println("Dependencies are still not resolving after the build, continuing to install dependencies.") shouldInstallDependencies = true @@ -449,10 +376,10 @@ func buildWithCustomCommands(inst string) { } // Install dependencies using the given dependency installer mode. -func installDependencies(buildInfo project.BuildInfo) { +func installDependencies(workspace project.GoWorkspace) { // automatically determine command to install dependencies var install *exec.Cmd - if buildInfo.DepMode == project.Dep { + if workspace.DepMode == project.Dep { // set up the dep cache if SEMMLE_CACHE is set cacheDir := os.Getenv("SEMMLE_CACHE") if cacheDir != "" { @@ -482,47 +409,80 @@ func installDependencies(buildInfo project.BuildInfo) { install = exec.Command("dep", "ensure", "-v") } log.Println("Installing dependencies using `dep ensure`.") - } else if buildInfo.DepMode == project.Glide { + util.RunCmd(install) + } else if workspace.DepMode == project.Glide { install = exec.Command("glide", "install") log.Println("Installing dependencies using `glide install`") + util.RunCmd(install) } else { - // explicitly set go module support - if buildInfo.DepMode == project.GoGetWithModules { - os.Setenv("GO111MODULE", "on") - } else if buildInfo.DepMode == project.GoGetNoModules { - os.Setenv("GO111MODULE", "off") + if workspace.Modules == nil { + project.InitGoModForLegacyProject(workspace.BaseDir) + workspace.Modules = project.LoadGoModules([]string{filepath.Join(workspace.BaseDir, "go.mod")}) } - // get dependencies - install = exec.Command("go", "get", "-v", "./...") - install.Dir = buildInfo.BaseDir - log.Printf("Installing dependencies using `go get -v ./...` in `%s`.\n", buildInfo.BaseDir) + // get dependencies for all modules + for _, module := range workspace.Modules { + path := filepath.Dir(module.Path) + + if util.DirExists(filepath.Join(path, "vendor")) { + vendor := toolchain.VendorModule(path) + log.Printf("Synchronizing vendor file using `go mod vendor` in %s.\n", path) + util.RunCmd(vendor) + } + + install = exec.Command("go", "get", "-v", "./...") + install.Dir = path + log.Printf("Installing dependencies using `go get -v ./...` in `%s`.\n", path) + util.RunCmd(install) + } } - util.RunCmd(install) } // Run the extractor. -func extract(buildInfo project.BuildInfo) { +func extract(workspace project.GoWorkspace) bool { extractor, err := util.GetExtractorPath() if err != nil { log.Fatalf("Could not determine path of extractor: %v.\n", err) } extractorArgs := []string{} - if buildInfo.DepMode == project.GoGetWithModules { - extractorArgs = append(extractorArgs, buildInfo.ModMode.ArgsForGoVersion(getEnvGoSemVer())...) + if workspace.DepMode == project.GoGetWithModules { + extractorArgs = append(extractorArgs, workspace.ModMode.ArgsForGoVersion(toolchain.GetEnvGoSemVer())...) } - extractorArgs = append(extractorArgs, "./...") - log.Printf("Running extractor command '%s %v' from directory '%s'.\n", extractor, extractorArgs, buildInfo.BaseDir) + if len(workspace.Modules) == 0 { + // There may be no modules if we are using e.g. Dep or Glide + extractorArgs = append(extractorArgs, "./...") + } else { + for _, module := range workspace.Modules { + relModPath, relErr := filepath.Rel(workspace.BaseDir, filepath.Dir(module.Path)) + + if relErr != nil { + log.Printf( + "Unable to make module path %s relative to workspace base dir %s: %s\n", + filepath.Dir(module.Path), workspace.BaseDir, relErr.Error()) + } else { + if relModPath != "." { + extractorArgs = append(extractorArgs, "."+string(os.PathSeparator)+relModPath+"/...") + } else { + extractorArgs = append(extractorArgs, relModPath+"/...") + } + } + } + } + + log.Printf("Running extractor command '%s %v' from directory '%s'.\n", extractor, extractorArgs, workspace.BaseDir) cmd := exec.Command(extractor, extractorArgs...) - cmd.Dir = buildInfo.BaseDir + cmd.Dir = workspace.BaseDir cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err = cmd.Run() if err != nil { - log.Fatalf("Extraction failed: %s\n", err.Error()) + log.Printf("Extraction failed for %s: %s\n", workspace.BaseDir, err.Error()) + return false } + + return true } // Build the project and run the extractor. @@ -536,75 +496,118 @@ func installDependenciesAndBuild() { // determine how to install dependencies and whether a GOPATH needs to be set up before // extraction - buildInfo := project.GetBuildInfo(true) + workspaces := project.GetWorkspaceInfo(true) if _, present := os.LookupEnv("GO111MODULE"); !present { os.Setenv("GO111MODULE", "auto") } - goVersionInfo := project.TryReadGoDirective(buildInfo) + // Remove temporary extractor files (e.g. auto-generated go.mod files) when we are done + defer project.RemoveTemporaryExtractorFiles() + + // If there is only one workspace and it needs a GOPATH set up, which may be the case if + // we don't use Go modules, then we move the repository to a temporary directory and set + // the GOPATH to it. + if len(workspaces) == 1 { + workspace := workspaces[0] + + importpath := util.GetImportPath() + needGopath := getNeedGopath(workspace, importpath) + + inLGTM := os.Getenv("LGTM_SRC") != "" || os.Getenv("LGTM_INDEX_NEED_GOPATH") != "" + + if inLGTM && needGopath { + paths := moveToTemporaryGopath(srcdir, importpath) + + // schedule restoring the contents of newdir to their original location after this function completes: + defer restoreRepoLayout(paths.newdir, paths.files, filepath.Base(paths.scratch), srcdir) + + pt := createPathTransformerFile(paths.newdir) + defer os.Remove(pt.Name()) + + writePathTransformerFile(pt, paths.realSrc, paths.root, paths.newdir) + setGopath(paths.root) + } + } + + // Find the greatest version of Go that is required by the workspaces to check it against the version + // of Go that is installed on the system. + greatestGoVersion := project.RequiredGoVersion(&workspaces) // This diagnostic is not required if the system Go version is 1.21 or greater, since the // Go tooling should install required Go versions as needed. - if semver.Compare(getEnvGoSemVer(), "v1.21.0") < 0 && goVersionInfo.Found && semver.Compare("v"+goVersionInfo.Version, getEnvGoSemVer()) > 0 { - diagnostics.EmitNewerGoVersionNeeded(getEnvGoSemVer(), "v"+goVersionInfo.Version) + if semver.Compare(toolchain.GetEnvGoSemVer(), "v1.21.0") < 0 && greatestGoVersion.Found && semver.Compare("v"+greatestGoVersion.Version, toolchain.GetEnvGoSemVer()) > 0 { + diagnostics.EmitNewerGoVersionNeeded(toolchain.GetEnvGoSemVer(), "v"+greatestGoVersion.Version) if val, _ := os.LookupEnv("GITHUB_ACTIONS"); val == "true" { log.Printf( - "The go.mod file requires version %s of Go, but version %s is installed. Consider adding an actions/setup-go step to your workflow.\n", - "v"+goVersionInfo.Version, - getEnvGoSemVer()) + "A go.mod file requires version %s of Go, but version %s is installed. Consider adding an actions/setup-go step to your workflow.\n", + "v"+greatestGoVersion.Version, + toolchain.GetEnvGoSemVer()) } } - fixGoVendorIssues(&buildInfo, goVersionInfo.Found) + // Track all projects which could not be extracted successfully + var unsuccessfulProjects = []string{} - tryUpdateGoModAndGoSum(buildInfo) + // Attempt to extract all workspaces; we will tolerate individual extraction failures here + for i, workspace := range workspaces { + goVersionInfo := workspace.RequiredGoVersion() - importpath := getImportPath() - needGopath := getNeedGopath(buildInfo, importpath) + fixGoVendorIssues(&workspace, goVersionInfo.Found) - inLGTM := os.Getenv("LGTM_SRC") != "" || os.Getenv("LGTM_INDEX_NEED_GOPATH") != "" + tryUpdateGoModAndGoSum(workspace) - if inLGTM && needGopath { - paths := moveToTemporaryGopath(srcdir, importpath) - - // schedule restoring the contents of newdir to their original location after this function completes: - defer restoreRepoLayout(paths.newdir, paths.files, filepath.Base(paths.scratch), srcdir) - - pt := createPathTransformerFile(paths.newdir) - defer os.Remove(pt.Name()) - - writePathTransformerFile(pt, paths.realSrc, paths.root, paths.newdir) - setGopath(paths.root) - } - - // check whether an explicit dependency installation command was provided - inst := util.Getenv("CODEQL_EXTRACTOR_GO_BUILD_COMMAND", "LGTM_INDEX_BUILD_COMMAND") - shouldInstallDependencies := false - if inst == "" { - shouldInstallDependencies = buildWithoutCustomCommands(buildInfo.ModMode) - } else { - buildWithCustomCommands(inst) - } - - if buildInfo.ModMode == project.ModVendor { - // test if running `go` with -mod=vendor works, and if it doesn't, try to fallback to -mod=mod - // or not set if the go version < 1.14. Note we check this post-build in case the build brings - // the vendor directory up to date. - if !checkVendor() { - buildInfo.ModMode = project.ModMod - log.Println("The vendor directory is not consistent with the go.mod; not using vendored dependencies.") - } - } - - if shouldInstallDependencies { - if buildInfo.ModMode == project.ModVendor { - log.Printf("Skipping dependency installation because a Go vendor directory was found.") + // check whether an explicit dependency installation command was provided + inst := util.Getenv("CODEQL_EXTRACTOR_GO_BUILD_COMMAND", "LGTM_INDEX_BUILD_COMMAND") + shouldInstallDependencies := false + if inst == "" { + shouldInstallDependencies = buildWithoutCustomCommands(workspace.ModMode) } else { - installDependencies(buildInfo) + buildWithCustomCommands(inst) + } + + if workspace.ModMode == project.ModVendor { + // test if running `go` with -mod=vendor works, and if it doesn't, try to fallback to -mod=mod + // or not set if the go version < 1.14. Note we check this post-build in case the build brings + // the vendor directory up to date. + if !checkVendor() { + workspace.ModMode = project.ModMod + log.Println("The vendor directory is not consistent with the go.mod; not using vendored dependencies.") + } + } + + if shouldInstallDependencies { + if workspace.ModMode == project.ModVendor { + log.Printf("Skipping dependency installation because a Go vendor directory was found.") + } else { + installDependencies(workspace) + } + } + + workspaces[i].Extracted = extract(workspace) + + if !workspaces[i].Extracted { + unsuccessfulProjects = append(unsuccessfulProjects, workspace.BaseDir) } } - extract(buildInfo) + // If all projects could not be extracted successfully, we fail the overall extraction. + if len(unsuccessfulProjects) == len(workspaces) { + log.Fatalln("Extraction failed for all discovered Go projects.") + } + + // If there is at least one project that could not be extracted successfully, + // emit a diagnostic that reports which projects we could not extract successfully. + // We only consider this a warning, since there may be test projects etc. which + // do not matter if they cannot be extracted successfully. + if len(unsuccessfulProjects) > 0 { + log.Printf( + "Warning: extraction failed for %d project(s): %s\n", + len(unsuccessfulProjects), + strings.Join(unsuccessfulProjects, ", ")) + diagnostics.EmitExtractionFailedForProjects(unsuccessfulProjects) + } else { + log.Printf("Success: extraction succeeded for all %d discovered project(s).\n", len(workspaces)) + } } func main() { diff --git a/go/extractor/diagnostics/diagnostics.go b/go/extractor/diagnostics/diagnostics.go index 6a3c4175318..c02af8afb92 100644 --- a/go/extractor/diagnostics/diagnostics.go +++ b/go/extractor/diagnostics/diagnostics.go @@ -493,3 +493,18 @@ func EmitNewerSystemGoRequired(requiredVersion string) { noLocation, ) } + +func EmitExtractionFailedForProjects(path []string) { + emitDiagnostic( + "go/autobuilder/extraction-failed-for-project", + fmt.Sprintf("Unable to extract %d Go projects", len(path)), + fmt.Sprintf( + "The following %d Go project%s could not be extracted successfully:\n\n`%s`\n", + len(path), + plural(len(path), "", "s"), + strings.Join(path, "`, `")), + severityWarning, + fullVisibility, + noLocation, + ) +} diff --git a/go/extractor/go.mod b/go/extractor/go.mod index c1aa66b49b3..9dafc31bbbe 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -1,6 +1,6 @@ module github.com/github/codeql-go/extractor -go 1.21 +go 1.22.0 require ( golang.org/x/mod v0.15.0 diff --git a/go/extractor/go.work b/go/extractor/go.work new file mode 100644 index 00000000000..96b89a39cb9 --- /dev/null +++ b/go/extractor/go.work @@ -0,0 +1,3 @@ +go 1.22.0 + +use . diff --git a/go/extractor/go.work.sum b/go/extractor/go.work.sum new file mode 100644 index 00000000000..e3856dfbfa5 --- /dev/null +++ b/go/extractor/go.work.sum @@ -0,0 +1,5 @@ +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= diff --git a/go/extractor/project/project.go b/go/extractor/project/project.go index baef8bdefb8..22c0f856c79 100644 --- a/go/extractor/project/project.go +++ b/go/extractor/project/project.go @@ -5,22 +5,104 @@ import ( "os" "path/filepath" "regexp" + "slices" "sort" "strings" "github.com/github/codeql-go/extractor/diagnostics" + "github.com/github/codeql-go/extractor/toolchain" "github.com/github/codeql-go/extractor/util" + "golang.org/x/mod/modfile" "golang.org/x/mod/semver" ) -func getDirs(paths []string) []string { - dirs := make([]string, len(paths)) - for i, path := range paths { - dirs[i] = filepath.Dir(path) - } - return dirs +// DependencyInstallerMode is an enum describing how dependencies should be installed +type DependencyInstallerMode int + +const ( + // GoGetNoModules represents dependency installation using `go get` without modules + GoGetNoModules DependencyInstallerMode = iota + // GoGetWithModules represents dependency installation using `go get` with modules + GoGetWithModules + // Dep represent dependency installation using `dep ensure` + Dep + // Glide represents dependency installation using `glide install` + Glide +) + +// Represents information about a `go.mod` file: this is at least the path to the `go.mod` file, +// plus the parsed contents of the file, if available. +type GoModule struct { + Path string // The path to the `go.mod` file + Module *modfile.File // The parsed contents of the `go.mod` file } +// Represents information about a Go project workspace: this may either be a folder containing +// a `go.work` file or a collection of `go.mod` files. +type GoWorkspace struct { + BaseDir string // The base directory for this workspace + WorkspaceFile *modfile.WorkFile // The `go.work` file for this workspace + Modules []*GoModule // A list of `go.mod` files + DepMode DependencyInstallerMode // A value indicating how to install dependencies for this workspace + ModMode ModMode // A value indicating which module mode to use for this workspace + Extracted bool // A value indicating whether this workspace was extracted successfully +} + +// Represents a nullable version string. +type GoVersionInfo struct { + // The version string, if any + Version string + // A value indicating whether a version string was found + Found bool +} + +// Determines the version of Go that is required by this workspace. This is, in order of preference: +// 1. The Go version specified in the `go.work` file, if any. +// 2. The greatest Go version specified in any `go.mod` file, if any. +func (workspace *GoWorkspace) RequiredGoVersion() GoVersionInfo { + if workspace.WorkspaceFile != nil && workspace.WorkspaceFile.Go != nil { + // If we have parsed a `go.work` file, return the version number from it. + return GoVersionInfo{Version: workspace.WorkspaceFile.Go.Version, Found: true} + } else if workspace.Modules != nil && len(workspace.Modules) > 0 { + // Otherwise, if we have `go.work` files, find the greatest Go version in those. + var greatestVersion string = "" + for _, module := range workspace.Modules { + if module.Module != nil && module.Module.Go != nil { + // If we have parsed the file, retrieve the version number we have already obtained. + if greatestVersion == "" || semver.Compare("v"+module.Module.Go.Version, "v"+greatestVersion) > 0 { + greatestVersion = module.Module.Go.Version + } + } else { + modVersion := tryReadGoDirective(module.Path) + if modVersion.Found && (greatestVersion == "" || semver.Compare("v"+modVersion.Version, "v"+greatestVersion) > 0) { + greatestVersion = modVersion.Version + } + } + } + + // If we have found some version, return it. + if greatestVersion != "" { + return GoVersionInfo{Version: greatestVersion, Found: true} + } + } + + return GoVersionInfo{Version: "", Found: false} +} + +// Finds the greatest Go version required by any of the given `workspaces`. +// Returns a `GoVersionInfo` value with `Found: false` if no version information is available. +func RequiredGoVersion(workspaces *[]GoWorkspace) GoVersionInfo { + greatestGoVersion := GoVersionInfo{Version: "", Found: false} + for _, workspace := range *workspaces { + goVersionInfo := workspace.RequiredGoVersion() + if goVersionInfo.Found && (!greatestGoVersion.Found || semver.Compare("v"+goVersionInfo.Version, "v"+greatestGoVersion.Version) > 0) { + greatestGoVersion = goVersionInfo + } + } + return greatestGoVersion +} + +// Determines whether any of the directory paths in the input are nested. func checkDirsNested(inputDirs []string) (string, bool) { // replace "." with "" so that we can check if all the paths are nested dirs := make([]string, len(inputDirs)) @@ -42,72 +124,376 @@ func checkDirsNested(inputDirs []string) (string, bool) { return dirs[0], true } -// Returns the directory to run the go build in and whether to use a go.mod -// file. -func findGoModFiles(emitDiagnostics bool) (baseDir string, useGoMod bool) { - goModPaths := util.FindAllFilesWithName(".", "go.mod", "vendor") - if len(goModPaths) == 0 { - baseDir = "." - useGoMod = false +// A list of files we created that should be removed after we are done. +var filesToRemove []string = []string{} + +// Try to initialize a go.mod file for projects that do not already have one. +func InitGoModForLegacyProject(path string) { + log.Printf("The code in %s seems to be missing a go.mod file. Attempting to initialize one...\n", path) + + modInit := toolchain.InitModule(path) + + if !util.RunCmd(modInit) { + log.Printf("Failed to initialize go.mod file for this project.") return } - goModDirs := getDirs(goModPaths) - if util.AnyGoFilesOutsideDirs(".", goModDirs...) { + + // Add the go.mod file to a list of files we should remove later. + filesToRemove = append(filesToRemove, filepath.Join(path, "go.mod")) + + modTidy := toolchain.TidyModule(path) + out, err := modTidy.CombinedOutput() + log.Println(string(out)) + + if err != nil { + log.Printf("Failed to determine module requirements for this project.") + } + + if strings.Contains(string(out), "is relative, but relative import paths are not supported in module mode") { + diagnostics.EmitRelativeImportPaths() + } +} + +// Attempts to remove all files that we created. +func RemoveTemporaryExtractorFiles() { + for _, path := range filesToRemove { + err := os.Remove(path) + if err != nil { + log.Printf("Unable to remove file we created at %s: %s\n", path, err.Error()) + } + } + + filesToRemove = []string{} +} + +// Find all go.work files in the working directory and its subdirectories +func findGoWorkFiles() []string { + return util.FindAllFilesWithName(".", "go.work", "vendor") +} + +// Find all go.mod files in the specified directory and its subdirectories +func findGoModFiles(root string) []string { + return util.FindAllFilesWithName(root, "go.mod", "vendor") +} + +// Given a list of `go.mod` file paths, try to parse them all. The resulting array of `GoModule` objects +// will be the same length as the input array and the objects will contain at least the `go.mod` path. +// If parsing the corresponding file is successful, then the parsed contents will also be available. +func LoadGoModules(goModFilePaths []string) []*GoModule { + results := make([]*GoModule, len(goModFilePaths)) + + for i, goModFilePath := range goModFilePaths { + results[i] = new(GoModule) + results[i].Path = goModFilePath + + modFileSrc, err := os.ReadFile(goModFilePath) + + if err != nil { + log.Printf("Unable to read %s: %s.\n", goModFilePath, err.Error()) + continue + } + + modFile, err := modfile.ParseLax(goModFilePath, modFileSrc, nil) + + if err != nil { + log.Printf("Unable to parse %s: %s.\n", goModFilePath, err.Error()) + continue + } + + results[i].Module = modFile + } + + return results +} + +// Given a path to a `go.work` file, this function attempts to parse the `go.work` file. If unsuccessful, +// we attempt to discover `go.mod` files within subdirectories of the directory containing the `go.work` +// file ourselves. +func discoverWorkspace(workFilePath string) GoWorkspace { + log.Printf("Loading %s...\n", workFilePath) + baseDir := filepath.Dir(workFilePath) + workFileSrc, err := os.ReadFile(workFilePath) + + if err != nil { + // We couldn't read the `go.work` file for some reason; let's try to find `go.mod` files ourselves + log.Printf("Unable to read %s, falling back to finding `go.mod` files manually:\n%s\n", workFilePath, err.Error()) + + goModFilePaths := findGoModFiles(baseDir) + log.Printf("Discovered the following Go modules in %s:\n%s\n", baseDir, strings.Join(goModFilePaths, "\n")) + + return GoWorkspace{ + BaseDir: baseDir, + Modules: LoadGoModules(goModFilePaths), + DepMode: GoGetWithModules, + ModMode: getModMode(GoGetWithModules, baseDir), + } + } + + workFile, err := modfile.ParseWork(workFilePath, workFileSrc, nil) + + if err != nil { + // The `go.work` file couldn't be parsed for some reason; let's try to find `go.mod` files ourselves + log.Printf("Unable to parse %s, falling back to finding `go.mod` files manually:\n%s\n", workFilePath, err.Error()) + + goModFilePaths := findGoModFiles(baseDir) + log.Printf("Discovered the following Go modules in %s:\n%s\n", baseDir, strings.Join(goModFilePaths, "\n")) + + return GoWorkspace{ + BaseDir: baseDir, + Modules: LoadGoModules(goModFilePaths), + DepMode: GoGetWithModules, + ModMode: getModMode(GoGetWithModules, baseDir), + } + } + + // Get the paths of all of the `go.mod` files that we read from the `go.work` file. + goModFilePaths := make([]string, len(workFile.Use)) + + for i, use := range workFile.Use { + if filepath.IsAbs(use.Path) { + // TODO: This case might be problematic for some other logic (e.g. stray file detection) + goModFilePaths[i] = filepath.Join(use.Path, "go.mod") + } else { + goModFilePaths[i] = filepath.Join(filepath.Dir(workFilePath), use.Path, "go.mod") + } + } + + log.Printf("%s uses the following Go modules:\n%s\n", workFilePath, strings.Join(goModFilePaths, "\n")) + + return GoWorkspace{ + BaseDir: baseDir, + WorkspaceFile: workFile, + Modules: LoadGoModules(goModFilePaths), + DepMode: GoGetWithModules, + ModMode: ModReadonly, // Workspaces only support "readonly" + } +} + +// Analyse the working directory to discover workspaces. +func discoverWorkspaces(emitDiagnostics bool) []GoWorkspace { + // Try to find any `go.work` files which may exist in the working directory. + goWorkFiles := findGoWorkFiles() + + if len(goWorkFiles) == 0 { + // There is no `go.work` file. Find all `go.mod` files in the working directory. + log.Println("Found no go.work files in the workspace; looking for go.mod files...") + + goModFiles := findGoModFiles(".") + + // Return a separate workspace for each `go.mod` file that we found. + results := make([]GoWorkspace, len(goModFiles)) + + for i, goModFile := range goModFiles { + results[i] = GoWorkspace{ + BaseDir: filepath.Dir(goModFile), + Modules: LoadGoModules([]string{goModFile}), + DepMode: GoGetWithModules, + ModMode: getModMode(GoGetWithModules, filepath.Dir(goModFile)), + } + } + + return results + } else { + // We have found `go.work` files, try to load them all. + log.Printf("Found go.work file(s) in: %s.\n", strings.Join(goWorkFiles, ", ")) + + if emitDiagnostics { + diagnostics.EmitGoWorkFound(goWorkFiles) + } + + results := make([]GoWorkspace, len(goWorkFiles)) + for i, workFilePath := range goWorkFiles { + results[i] = discoverWorkspace(workFilePath) + } + + // Add all stray `go.mod` files (i.e. those not referenced by `go.work` files) + // as separate workspaces. + goModFiles := findGoModFiles(".") + + for _, goModFile := range goModFiles { + // Check to see whether we already have this module file under an existing workspace. + found := false + for _, workspace := range results { + if workspace.Modules == nil { + break + } + + for _, module := range workspace.Modules { + if module.Path == goModFile { + found = true + break + } + } + + if found { + break + } + } + + // If not, add it to the array. + if !found { + log.Printf("Module %s is not referenced by any go.work file; adding it separately.\n", goModFile) + results = append(results, GoWorkspace{ + BaseDir: filepath.Dir(goModFile), + Modules: LoadGoModules([]string{goModFile}), + DepMode: GoGetWithModules, + ModMode: getModMode(GoGetWithModules, filepath.Dir(goModFile)), + }) + } + } + + return results + } +} + +// Discovers Go workspaces in the current working directory. +// Returns an array of Go workspaces and the total number of module files which we discovered. +func getBuildRoots(emitDiagnostics bool) (goWorkspaces []GoWorkspace, totalModuleFiles int) { + goWorkspaces = discoverWorkspaces(emitDiagnostics) + + // Determine the total number of `go.mod` files that we discovered. + totalModuleFiles = 0 + + for _, goWorkspace := range goWorkspaces { + totalModuleFiles += len(goWorkspace.Modules) + } + + // If there are no `go.mod` files at all, create one in line with https://go.dev/blog/migrating-to-go-modules + if totalModuleFiles == 0 { + // Check for other, legacy package managers + if util.FileExists("Gopkg.toml") { + if emitDiagnostics { + diagnostics.EmitGopkgTomlFound() + } + log.Println("Found Gopkg.toml, using dep instead of go get") + goWorkspaces = []GoWorkspace{{ + BaseDir: ".", + DepMode: Dep, + ModMode: ModUnset, + }} + totalModuleFiles = 0 + return + } + + if util.FileExists("glide.yaml") { + if emitDiagnostics { + diagnostics.EmitGlideYamlFound() + } + log.Println("Found glide.yaml, using Glide instead of go get") + goWorkspaces = []GoWorkspace{{ + BaseDir: ".", + DepMode: Glide, + ModMode: ModUnset, + }} + totalModuleFiles = 0 + return + } + + // If we have no `go.mod` files, then the project appears to be a legacy project without + // a `go.mod` file. Check that there are actually Go source files before initializing a module + // so that we correctly fail the extraction later. + if !util.FindGoFiles(".") { + goWorkspaces = []GoWorkspace{{ + BaseDir: ".", + DepMode: GoGetNoModules, + ModMode: ModUnset, + }} + totalModuleFiles = 0 + return + } + + goWorkspaces = []GoWorkspace{{ + BaseDir: ".", + DepMode: GoGetNoModules, + ModMode: getModMode(GoGetWithModules, "."), + }} + totalModuleFiles = 0 + return + } + + // Get the paths to all `go.mod` files + i := 0 + goModPaths := make([]string, totalModuleFiles) + + for _, goWorkspace := range goWorkspaces { + for _, goModule := range goWorkspace.Modules { + goModPaths[i] = goModule.Path + i++ + } + } + + goModDirs := util.GetParentDirs(goModPaths) + straySourceFiles := util.GoFilesOutsideDirs(".", goModDirs...) + if len(straySourceFiles) > 0 { if emitDiagnostics { diagnostics.EmitGoFilesOutsideGoModules(goModPaths) } - baseDir = "." - useGoMod = false + + // We need to initialise Go modules for the stray source files. Our goal is to initialise + // as few Go modules as possible, in locations which do not overlap with existing Go + // modules. + for _, straySourceFile := range straySourceFiles { + path := "." + components := strings.Split(filepath.Dir(straySourceFile), string(os.PathSeparator)) + + for _, component := range components { + path = filepath.Join(path, component) + + // Try to initialize a `go.mod` file automatically for the stray source files if + // doing so would not place it in a parent directory of an existing `go.mod` file. + if !startsWithAnyOf(path, goModDirs) { + goWorkspaces = append(goWorkspaces, GoWorkspace{ + BaseDir: path, + DepMode: GoGetNoModules, + ModMode: ModUnset, + }) + goModDirs = append(goModDirs, path) + break + } + } + } + return } - if len(goModPaths) > 1 { - // currently not supported - baseDir = "." - commonRoot, nested := checkDirsNested(goModDirs) - if nested && commonRoot == "" { - useGoMod = true - } else { - useGoMod = false - } - if emitDiagnostics { + + // If we are emitted diagnostics, report some details about the workspace structure. + if emitDiagnostics { + if totalModuleFiles > 1 { + _, nested := checkDirsNested(goModDirs) + if nested { diagnostics.EmitMultipleGoModFoundNested(goModPaths) } else { diagnostics.EmitMultipleGoModFoundNotNested(goModPaths) } - } - return - } - if emitDiagnostics { - if goModDirs[0] == "." { - diagnostics.EmitSingleRootGoModFound(goModPaths[0]) - } else { - diagnostics.EmitSingleNonRootGoModFound(goModPaths[0]) + } else if totalModuleFiles == 1 { + if goModDirs[0] == "." { + diagnostics.EmitSingleRootGoModFound(goModPaths[0]) + } else { + diagnostics.EmitSingleNonRootGoModFound(goModPaths[0]) + } } } - baseDir = goModDirs[0] - useGoMod = true + return } -// DependencyInstallerMode is an enum describing how dependencies should be installed -type DependencyInstallerMode int +// Determines whether `str` starts with any of `prefixes`. +func startsWithAnyOf(str string, prefixes []string) bool { + for _, prefix := range prefixes { + if relPath, err := filepath.Rel(str, prefix); err == nil && !strings.HasPrefix(relPath, "..") { + return true + } + } + return false +} -const ( - // GoGetNoModules represents dependency installation using `go get` without modules - GoGetNoModules DependencyInstallerMode = iota - // GoGetWithModules represents dependency installation using `go get` with modules - GoGetWithModules - // Dep represent dependency installation using `dep ensure` - Dep - // Glide represents dependency installation using `glide install` - Glide -) - -// Returns the appropriate DependencyInstallerMode for the current project -func getDepMode(emitDiagnostics bool) (DependencyInstallerMode, string) { - bazelPaths := util.FindAllFilesWithName(".", "BUILD", "vendor") - bazelPaths = append(bazelPaths, util.FindAllFilesWithName(".", "BUILD.bazel", "vendor")...) +// Finds Go workspaces in the current working directory. +func GetWorkspaceInfo(emitDiagnostics bool) []GoWorkspace { + bazelPaths := slices.Concat( + util.FindAllFilesWithName(".", "BUILD", "vendor"), + util.FindAllFilesWithName(".", "BUILD.bazel", "vendor"), + ) if len(bazelPaths) > 0 { // currently not supported if emitDiagnostics { @@ -115,36 +501,10 @@ func getDepMode(emitDiagnostics bool) (DependencyInstallerMode, string) { } } - goWorkPaths := util.FindAllFilesWithName(".", "go.work", "vendor") - if len(goWorkPaths) > 0 { - // currently not supported - if emitDiagnostics { - diagnostics.EmitGoWorkFound(goWorkPaths) - } - } + goWorkspaces, totalModuleFiles := getBuildRoots(emitDiagnostics) + log.Printf("Found %d go.mod file(s).\n", totalModuleFiles) - baseDir, useGoMod := findGoModFiles(emitDiagnostics) - if useGoMod { - log.Println("Found go.mod, enabling go modules") - return GoGetWithModules, baseDir - } - - if util.FileExists("Gopkg.toml") { - if emitDiagnostics { - diagnostics.EmitGopkgTomlFound() - } - log.Println("Found Gopkg.toml, using dep instead of go get") - return Dep, "." - } - - if util.FileExists("glide.yaml") { - if emitDiagnostics { - diagnostics.EmitGlideYamlFound() - } - log.Println("Found glide.yaml, using Glide instead of go get") - return Glide, "." - } - return GoGetNoModules, "." + return goWorkspaces } // ModMode corresponds to the possible values of the -mod flag for the Go compiler @@ -194,38 +554,18 @@ func getModMode(depMode DependencyInstallerMode, baseDir string) ModMode { return ModUnset } -type BuildInfo struct { - DepMode DependencyInstallerMode - ModMode ModMode - BaseDir string -} - -func GetBuildInfo(emitDiagnostics bool) BuildInfo { - depMode, baseDir := getDepMode(true) - modMode := getModMode(depMode, baseDir) - return BuildInfo{depMode, modMode, baseDir} -} - -type GoVersionInfo struct { - // The version string, if any - Version string - // A value indicating whether a version string was found - Found bool -} - // Tries to open `go.mod` and read a go directive, returning the version and whether it was found. -func TryReadGoDirective(buildInfo BuildInfo) GoVersionInfo { - if buildInfo.DepMode == GoGetWithModules { - versionRe := regexp.MustCompile(`(?m)^go[ \t\r]+([0-9]+\.[0-9]+(\.[0-9]+)?)$`) - goMod, err := os.ReadFile(filepath.Join(buildInfo.BaseDir, "go.mod")) - if err != nil { - log.Println("Failed to read go.mod to check for missing Go version") - } else { - matches := versionRe.FindSubmatch(goMod) - if matches != nil { - if len(matches) > 1 { - return GoVersionInfo{string(matches[1]), true} - } +// The version string is returned in the "1.2.3" format. +func tryReadGoDirective(path string) GoVersionInfo { + versionRe := regexp.MustCompile(`(?m)^go[ \t\r]+([0-9]+\.[0-9]+(\.[0-9]+)?)$`) + goMod, err := os.ReadFile(path) + if err != nil { + log.Println("Failed to read go.mod to check for missing Go version") + } else { + matches := versionRe.FindSubmatch(goMod) + if matches != nil { + if len(matches) > 1 { + return GoVersionInfo{string(matches[1]), true} } } } diff --git a/go/extractor/project/project_test.go b/go/extractor/project/project_test.go new file mode 100644 index 00000000000..f2de420773f --- /dev/null +++ b/go/extractor/project/project_test.go @@ -0,0 +1,27 @@ +package project + +import ( + "path/filepath" + "testing" +) + +func testStartsWithAnyOf(t *testing.T, path string, prefix string, expectation bool) { + result := startsWithAnyOf(path, []string{prefix}) + if result != expectation { + t.Errorf("Expected startsWithAnyOf(%s, %s) to be %t, but it is %t.", path, prefix, expectation, result) + } +} + +func TestStartsWithAnyOf(t *testing.T) { + testStartsWithAnyOf(t, ".", ".", true) + testStartsWithAnyOf(t, ".", "dir", true) + testStartsWithAnyOf(t, ".", filepath.Join("foo", "bar"), true) + testStartsWithAnyOf(t, "dir", "dir", true) + testStartsWithAnyOf(t, "foo", filepath.Join("foo", "bar"), true) + testStartsWithAnyOf(t, filepath.Join("foo", "bar"), filepath.Join("foo", "bar"), true) + testStartsWithAnyOf(t, filepath.Join("foo", "bar"), filepath.Join("foo", "bar", "baz"), true) + + testStartsWithAnyOf(t, filepath.Join("foo", "bar"), "foo", false) + testStartsWithAnyOf(t, filepath.Join("foo", "bar"), "bar", false) + testStartsWithAnyOf(t, filepath.Join("foo", "bar"), filepath.Join("foo", "baz"), false) +} diff --git a/go/extractor/toolchain/toolchain.go b/go/extractor/toolchain/toolchain.go index 01e35bc177b..104894c5975 100644 --- a/go/extractor/toolchain/toolchain.go +++ b/go/extractor/toolchain/toolchain.go @@ -5,7 +5,11 @@ import ( "log" "os" "os/exec" + "path/filepath" "strings" + + "github.com/github/codeql-go/extractor/util" + "golang.org/x/mod/semver" ) // Check if Go is installed in the environment. @@ -36,6 +40,23 @@ func GetEnvGoVersion() string { return goVersion } +// Returns the current Go version in semver format, e.g. v1.14.4 +func GetEnvGoSemVer() string { + goVersion := GetEnvGoVersion() + if !strings.HasPrefix(goVersion, "go") { + log.Fatalf("Expected 'go version' output of the form 'go1.2.3'; got '%s'", goVersion) + } + // Go versions don't follow the SemVer format, but the only exception we normally care about + // is release candidates; so this is a horrible hack to convert e.g. `go1.22rc1` into `go1.22-rc1` + // which is compatible with the SemVer specification + rcIndex := strings.Index(goVersion, "rc") + if rcIndex != -1 { + return semver.Canonical("v"+goVersion[2:rcIndex]) + "-" + goVersion[rcIndex:] + } else { + return semver.Canonical("v" + goVersion[2:]) + } +} + // The 'go version' command may output warnings on separate lines before // the actual version string is printed. This function parses the output // to retrieve just the version string. @@ -47,3 +68,42 @@ func parseGoVersion(data string) string { } return strings.Fields(lastLine)[2] } + +// Returns a value indicating whether the system Go toolchain supports workspaces. +func SupportsWorkspaces() bool { + return semver.Compare(GetEnvGoSemVer(), "v1.18.0") >= 0 +} + +// Run `go mod tidy -e` in the directory given by `path`. +func TidyModule(path string) *exec.Cmd { + cmd := exec.Command("go", "mod", "tidy", "-e") + cmd.Dir = path + return cmd +} + +// Run `go mod init` in the directory given by `path`. +func InitModule(path string) *exec.Cmd { + moduleName := "codeql/auto-project" + + if importpath := util.GetImportPath(); importpath != "" { + // This should be something like `github.com/user/repo` + moduleName = importpath + + // If we are not initialising the new module in the root directory of the workspace, + // append the relative path to the module name. + if relPath, err := filepath.Rel(".", path); err != nil && relPath != "." { + moduleName = moduleName + "/" + relPath + } + } + + modInit := exec.Command("go", "mod", "init", moduleName) + modInit.Dir = path + return modInit +} + +// Constructs a command to run `go mod vendor -e` in the directory given by `path`. +func VendorModule(path string) *exec.Cmd { + modVendor := exec.Command("go", "mod", "vendor", "-e") + modVendor.Dir = path + return modVendor +} diff --git a/go/extractor/util/util.go b/go/extractor/util/util.go index 313c000d30d..2ae6a2b0cd2 100644 --- a/go/extractor/util/util.go +++ b/go/extractor/util/util.go @@ -6,10 +6,13 @@ import ( "io" "io/fs" "log" + "net/url" "os" "os/exec" "path/filepath" + "regexp" "runtime" + "slices" "strings" ) @@ -204,13 +207,13 @@ func RunCmd(cmd *exec.Cmd) bool { in, _ := cmd.StdinPipe() err := cmd.Start() if err != nil { - log.Printf("Running %s failed, continuing anyway: %s\n", cmd.Path, err.Error()) + log.Printf("Running %s %v failed, continuing anyway: %s\n", cmd.Path, cmd.Args, err.Error()) return false } in.Close() err = cmd.Wait() if err != nil { - log.Printf("Running %s failed, continuing anyway: %s\n", cmd.Path, err.Error()) + log.Printf("Running %s %v failed, continuing anyway: %s\n", cmd.Path, cmd.Args, err.Error()) return false } @@ -319,24 +322,90 @@ func FindAllFilesWithName(root string, name string, dirsToSkip ...string) []stri return paths } -func AnyGoFilesOutsideDirs(root string, dirsToSkip ...string) bool { - found := false +// Returns an array of any Go source files in locations which do not have a `go.mod` +// file in the same directory or higher up in the file hierarchy, relative to the `root`. +func GoFilesOutsideDirs(root string, dirsToSkip ...string) []string { + result := []string{} + filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { if err != nil { return err } - if d.IsDir() { - for _, dirToSkip := range dirsToSkip { - if path == dirToSkip { - return filepath.SkipDir - } - } + if d.IsDir() && slices.Contains(dirsToSkip, path) { + return filepath.SkipDir } if filepath.Ext(d.Name()) == ".go" { - found = true - return filepath.SkipAll + log.Printf("Found stray Go source file in %s.\n", path) + result = append(result, path) } return nil }) - return found + + return result +} + +// For every file path in the input array, return the parent directory. +func GetParentDirs(paths []string) []string { + dirs := make([]string, len(paths)) + for i, path := range paths { + dirs[i] = filepath.Dir(path) + } + return dirs +} + +// Returns the import path of the package being built, or "" if it cannot be determined. +func GetImportPath() (importpath string) { + importpath = os.Getenv("LGTM_INDEX_IMPORT_PATH") + if importpath == "" { + repourl := os.Getenv("SEMMLE_REPO_URL") + if repourl == "" { + githubrepo := os.Getenv("GITHUB_REPOSITORY") + if githubrepo == "" { + log.Printf("Unable to determine import path, as neither LGTM_INDEX_IMPORT_PATH nor GITHUB_REPOSITORY is set\n") + return "" + } else { + importpath = "github.com/" + githubrepo + } + } else { + importpath = getImportPathFromRepoURL(repourl) + if importpath == "" { + log.Printf("Failed to determine import path from SEMMLE_REPO_URL '%s'\n", repourl) + return + } + } + } + log.Printf("Import path is '%s'\n", importpath) + return +} + +// Returns the import path of the package being built from `repourl`, or "" if it cannot be +// determined. +func getImportPathFromRepoURL(repourl string) string { + // check for scp-like URL as in "git@github.com:github/codeql-go.git" + shorturl := regexp.MustCompile(`^([^@]+@)?([^:]+):([^/].*?)(\.git)?$`) + m := shorturl.FindStringSubmatch(repourl) + if m != nil { + return m[2] + "/" + m[3] + } + + // otherwise parse as proper URL + u, err := url.Parse(repourl) + if err != nil { + log.Fatalf("Malformed repository URL '%s'\n", repourl) + } + + if u.Scheme == "file" { + // we can't determine import paths from file paths + return "" + } + + if u.Hostname() == "" || u.Path == "" { + return "" + } + + host := u.Hostname() + path := u.Path + // strip off leading slashes and trailing `.git` if present + path = regexp.MustCompile(`^/+|\.git$`).ReplaceAllString(path, "") + return host + "/" + path } diff --git a/go/extractor/cli/go-autobuilder/go-autobuilder_test.go b/go/extractor/util/util_test.go similarity index 98% rename from go/extractor/cli/go-autobuilder/go-autobuilder_test.go rename to go/extractor/util/util_test.go index f4e8405fe36..45d32bda3e1 100644 --- a/go/extractor/cli/go-autobuilder/go-autobuilder_test.go +++ b/go/extractor/util/util_test.go @@ -1,4 +1,4 @@ -package main +package util import "testing" diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index fba2a870356..a59e560c415 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/0.0.9.md b/go/ql/consistency-queries/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index b4cc9a2e037..d5a2fbee5f1 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 0.0.8 +version: 0.0.9 groups: - go - queries diff --git a/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.expected b/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.expected new file mode 100644 index 00000000000..abc02314890 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.expected @@ -0,0 +1,4 @@ +extractedFiles +| work/subdir/go.mod:0:0:0:0 | work/subdir/go.mod | +| work/subdir/test.go:0:0:0:0 | work/subdir/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.py b/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.py index 778af4464c7..23de1b1600a 100644 --- a/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.py +++ b/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.py @@ -10,7 +10,7 @@ from diagnostics_test_utils import * goPath = os.path.join(os.path.abspath(os.getcwd()), ".go") os.environ['GOPATH'] = goPath os.environ['LGTM_INDEX_IMPORT_PATH'] = "test" -run_codeql_database_create([], lang="go", source="work", db=None, runFunction=runUnsuccessfully) +run_codeql_database_create([], lang="go", source="work") check_diagnostics() diff --git a/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.ql b/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.ql new file mode 100644 index 00000000000..459a4301560 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/diagnostics/go-files-found-not-processed/test.ql @@ -0,0 +1,8 @@ +import go +import semmle.go.DiagnosticsReporting + +query predicate extractedFiles(File f) { any() } + +from string msg, int sev +where reportableDiagnostics(_, msg, sev) +select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/diagnostics/unsupported-relative-path/test.py b/go/ql/integration-tests/all-platforms/go/diagnostics/unsupported-relative-path/test.py index 21a6cd40ef7..841351c4f67 100644 --- a/go/ql/integration-tests/all-platforms/go/diagnostics/unsupported-relative-path/test.py +++ b/go/ql/integration-tests/all-platforms/go/diagnostics/unsupported-relative-path/test.py @@ -10,7 +10,7 @@ from diagnostics_test_utils import * goPath = os.path.join(os.path.abspath(os.getcwd()), ".go") os.environ['GOPATH'] = goPath os.environ['GITHUB_REPOSITORY'] = "a/b" -run_codeql_database_create([], lang="go", source="work", db=None, runFunction=runUnsuccessfully) +run_codeql_database_create([], lang="go", source="work", db=None) check_diagnostics() diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/diagnostics.expected new file mode 100644 index 00000000000..56d774b7037 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/diagnostics.expected @@ -0,0 +1,14 @@ +{ + "markdownMessage": "A single `go.mod` file was found.\n\n`go.mod`", + "severity": "note", + "source": { + "extractorName": "go", + "id": "go/autobuilder/single-root-go-mod-found", + "name": "A single `go.mod` file was found in the root" + }, + "visibility": { + "cliSummaryTable": false, + "statusPage": false, + "telemetry": true + } +} diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/force_sequential_test_execution b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/force_sequential_test_execution new file mode 100644 index 00000000000..47ca9929099 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/force_sequential_test_execution @@ -0,0 +1,2 @@ +# go get has been observed to sometimes fail when multiple tests try to simultaneously fetch the same package. +goget diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/go.mod b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/go.mod new file mode 100644 index 00000000000..ead01aaaab6 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/go.mod @@ -0,0 +1,3 @@ +require golang.org/x/net v0.0.0-20200505041828-1ed23360d12c + +module test diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/go.sum b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/go.sum new file mode 100644 index 00000000000..6c5ffa613d0 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/go.sum @@ -0,0 +1,7 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c h1:zJ0mtu4jCalhKg6Oaukv6iIkb+cOvDrajDH9DH46Q4M= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/subdir/add.go b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/subdir/add.go new file mode 100644 index 00000000000..910b449d808 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/subdir/add.go @@ -0,0 +1,5 @@ +package subdir + +func Add(a, b int) int { + return a + b +} diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/test.go b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/test.go new file mode 100644 index 00000000000..15e54322353 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/src/test.go @@ -0,0 +1,14 @@ +package test + +import ( + "test/subdir" + + "golang.org/x/net/ipv4" +) + +func test() { + + header := ipv4.Header{} + header.Version = subdir.Add(2, 2) + +} diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.expected b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.expected new file mode 100644 index 00000000000..0bdb5f221d9 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.expected @@ -0,0 +1,5 @@ +extractedFiles +| src/go.mod:0:0:0:0 | src/go.mod | +| src/subdir/add.go:0:0:0:0 | src/subdir/add.go | +| src/test.go:0:0:0:0 | src/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.py b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.py new file mode 100644 index 00000000000..43c7d1b38e8 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.py @@ -0,0 +1,18 @@ +import os +import subprocess + +from create_database_utils import * +from diagnostics_test_utils import * + +# Set up a GOPATH relative to this test's root directory; +# we set os.environ instead of using extra_env because we +# need it to be set for the call to "go clean -modcache" later +goPath = os.path.join(os.path.abspath(os.getcwd()), ".go") +os.environ['GOPATH'] = goPath +run_codeql_database_create([], lang="go", source="src") + +check_diagnostics() + +# Clean up the temporary GOPATH to prevent Bazel failures next +# time the tests are run; see https://github.com/golang/go/issues/27161 +subprocess.call(["go", "clean", "-modcache"]) diff --git a/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.ql b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.ql new file mode 100644 index 00000000000..459a4301560 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/go-mod-without-version/test.ql @@ -0,0 +1,8 @@ +import go +import semmle.go.DiagnosticsReporting + +query predicate extractedFiles(File f) { any() } + +from string msg, int sev +where reportableDiagnostics(_, msg, sev) +select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/mixed-layout/diagnostics.expected new file mode 100644 index 00000000000..bbbdd515d68 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/diagnostics.expected @@ -0,0 +1,28 @@ +{ + "markdownMessage": "1 `go.work` file was found:\n\n`workspace/go.work`", + "severity": "note", + "source": { + "extractorName": "go", + "id": "go/autobuilder/go-work-found", + "name": "`go.work` file found" + }, + "visibility": { + "cliSummaryTable": false, + "statusPage": false, + "telemetry": true + } +} +{ + "markdownMessage": "Go files were found outside of the Go modules corresponding to these `go.mod` files.\n\n`workspace/subdir/go.mod`, `module/go.mod`", + "severity": "note", + "source": { + "extractorName": "go", + "id": "go/autobuilder/go-files-outside-go-modules", + "name": "Go files were found outside Go modules" + }, + "visibility": { + "cliSummaryTable": false, + "statusPage": false, + "telemetry": true + } +} diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/force_sequential_test_execution b/go/ql/integration-tests/all-platforms/go/mixed-layout/force_sequential_test_execution new file mode 100644 index 00000000000..47ca9929099 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/force_sequential_test_execution @@ -0,0 +1,2 @@ +# go get has been observed to sometimes fail when multiple tests try to simultaneously fetch the same package. +goget diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/go.mod b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/go.mod new file mode 100644 index 00000000000..0b8f33b9069 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/go.mod @@ -0,0 +1,5 @@ +go 1.14 + +require golang.org/x/net v0.0.0-20200505041828-1ed23360d12c + +module module diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/go.sum b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/go.sum new file mode 100644 index 00000000000..6c5ffa613d0 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/go.sum @@ -0,0 +1,7 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c h1:zJ0mtu4jCalhKg6Oaukv6iIkb+cOvDrajDH9DH46Q4M= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/test.go b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/test.go new file mode 100644 index 00000000000..afc86ac3a12 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/module/test.go @@ -0,0 +1,13 @@ +package subdir + +import ( + "fmt" + + "golang.org/x/net/ipv4" +) + +func test() { + + header := ipv4.Header{} + fmt.Print(header.String()) +} diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/stray-files/test.go b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/stray-files/test.go new file mode 100644 index 00000000000..afc86ac3a12 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/stray-files/test.go @@ -0,0 +1,13 @@ +package subdir + +import ( + "fmt" + + "golang.org/x/net/ipv4" +) + +func test() { + + header := ipv4.Header{} + fmt.Print(header.String()) +} diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/go.work b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/go.work new file mode 100644 index 00000000000..e7e866fbe27 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/go.work @@ -0,0 +1,3 @@ +go 1.22.0 + +use ./subdir diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/go.mod b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/go.mod new file mode 100644 index 00000000000..40a3b330c38 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/go.mod @@ -0,0 +1,5 @@ +go 1.22.0 + +require golang.org/x/net v0.0.0-20200505041828-1ed23360d12c + +module subdir diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/go.sum b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/go.sum new file mode 100644 index 00000000000..6c5ffa613d0 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/go.sum @@ -0,0 +1,7 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c h1:zJ0mtu4jCalhKg6Oaukv6iIkb+cOvDrajDH9DH46Q4M= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/test.go b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/test.go new file mode 100644 index 00000000000..afc86ac3a12 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/src/workspace/subdir/test.go @@ -0,0 +1,13 @@ +package subdir + +import ( + "fmt" + + "golang.org/x/net/ipv4" +) + +func test() { + + header := ipv4.Header{} + fmt.Print(header.String()) +} diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/test.expected b/go/ql/integration-tests/all-platforms/go/mixed-layout/test.expected new file mode 100644 index 00000000000..ddd1888562f --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/test.expected @@ -0,0 +1,8 @@ +extractedFiles +| src/module/go.mod:0:0:0:0 | src/module/go.mod | +| src/module/test.go:0:0:0:0 | src/module/test.go | +| src/stray-files/go.mod:0:0:0:0 | src/stray-files/go.mod | +| src/stray-files/test.go:0:0:0:0 | src/stray-files/test.go | +| src/workspace/subdir/go.mod:0:0:0:0 | src/workspace/subdir/go.mod | +| src/workspace/subdir/test.go:0:0:0:0 | src/workspace/subdir/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/test.py b/go/ql/integration-tests/all-platforms/go/mixed-layout/test.py new file mode 100644 index 00000000000..43c7d1b38e8 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/test.py @@ -0,0 +1,18 @@ +import os +import subprocess + +from create_database_utils import * +from diagnostics_test_utils import * + +# Set up a GOPATH relative to this test's root directory; +# we set os.environ instead of using extra_env because we +# need it to be set for the call to "go clean -modcache" later +goPath = os.path.join(os.path.abspath(os.getcwd()), ".go") +os.environ['GOPATH'] = goPath +run_codeql_database_create([], lang="go", source="src") + +check_diagnostics() + +# Clean up the temporary GOPATH to prevent Bazel failures next +# time the tests are run; see https://github.com/golang/go/issues/27161 +subprocess.call(["go", "clean", "-modcache"]) diff --git a/go/ql/integration-tests/all-platforms/go/mixed-layout/test.ql b/go/ql/integration-tests/all-platforms/go/mixed-layout/test.ql new file mode 100644 index 00000000000..459a4301560 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/mixed-layout/test.ql @@ -0,0 +1,8 @@ +import go +import semmle.go.DiagnosticsReporting + +query predicate extractedFiles(File f) { any() } + +from string msg, int sev +where reportableDiagnostics(_, msg, sev) +select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/diagnostics.expected index ed2d87ac207..9cf8eb1761f 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/diagnostics.expected +++ b/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/diagnostics.expected @@ -1,17 +1,3 @@ -{ - "markdownMessage": "1 package could not be found:\n\n`subdir/subsubdir`.\n\nDefinitions in those packages may not be recognized by CodeQL, and files that use them may only be partially analyzed.\n\nCheck that the paths are correct and make sure any private packages can be accessed. If any of the packages are present in the repository then you may need a [custom build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", - "severity": "warning", - "source": { - "extractorName": "go", - "id": "go/autobuilder/package-not-found", - "name": "Some packages could not be found" - }, - "visibility": { - "cliSummaryTable": true, - "statusPage": true, - "telemetry": true - } -} { "markdownMessage": "Go files were found outside of the Go modules corresponding to these `go.mod` files.\n\n`subdir/go.mod`", "severity": "note", diff --git a/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.expected b/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.expected index 18120f350ef..66ba3ef588f 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.expected +++ b/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.expected @@ -1,2 +1,5 @@ -| Extraction failed in subdir/test.go with error cannot find package "subdir/subsubdir" in any of:\n\t(absolute path) (from $GOROOT)\n\t(absolute path) (from $GOPATH) | 2 | -| Extraction failed in subdir/test.go with error could not import subdir/subsubdir (invalid package name: "") | 2 | +extractedFiles +| src/subdir/go.mod:0:0:0:0 | src/subdir/go.mod | +| src/subdir/subsubdir/add.go:0:0:0:0 | src/subdir/subsubdir/add.go | +| src/subdir/test.go:0:0:0:0 | src/subdir/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.ql b/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.ql index e817bb2938a..459a4301560 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.ql +++ b/go/ql/integration-tests/all-platforms/go/single-go-mod-and-go-files-not-under-it/test.ql @@ -1,6 +1,8 @@ import go import semmle.go.DiagnosticsReporting +query predicate extractedFiles(File f) { any() } + from string msg, int sev where reportableDiagnostics(_, msg, sev) select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.expected b/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.expected index e69de29bb2d..0bdb5f221d9 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.expected +++ b/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.expected @@ -0,0 +1,5 @@ +extractedFiles +| src/go.mod:0:0:0:0 | src/go.mod | +| src/subdir/add.go:0:0:0:0 | src/subdir/add.go | +| src/test.go:0:0:0:0 | src/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.ql b/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.ql index e817bb2938a..459a4301560 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.ql +++ b/go/ql/integration-tests/all-platforms/go/single-go-mod-in-root/test.ql @@ -1,6 +1,8 @@ import go import semmle.go.DiagnosticsReporting +query predicate extractedFiles(File f) { any() } + from string msg, int sev where reportableDiagnostics(_, msg, sev) select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.expected b/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.expected index e69de29bb2d..66ba3ef588f 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.expected +++ b/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.expected @@ -0,0 +1,5 @@ +extractedFiles +| src/subdir/go.mod:0:0:0:0 | src/subdir/go.mod | +| src/subdir/subsubdir/add.go:0:0:0:0 | src/subdir/subsubdir/add.go | +| src/subdir/test.go:0:0:0:0 | src/subdir/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.ql b/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.ql index e817bb2938a..459a4301560 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.ql +++ b/go/ql/integration-tests/all-platforms/go/single-go-mod-not-in-root/test.ql @@ -1,6 +1,8 @@ import go import semmle.go.DiagnosticsReporting +query predicate extractedFiles(File f) { any() } + from string msg, int sev where reportableDiagnostics(_, msg, sev) select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/diagnostics.expected index dc018d92b3d..82821f25224 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/diagnostics.expected +++ b/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/diagnostics.expected @@ -26,17 +26,3 @@ "telemetry": true } } -{ - "markdownMessage": "2 packages could not be found:\n\n`subdir1/subsubdir1`, `subdir2/subsubdir2`.\n\nDefinitions in those packages may not be recognized by CodeQL, and files that use them may only be partially analyzed.\n\nCheck that the paths are correct and make sure any private packages can be accessed. If any of the packages are present in the repository then you may need a [custom build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", - "severity": "warning", - "source": { - "extractorName": "go", - "id": "go/autobuilder/package-not-found", - "name": "Some packages could not be found" - }, - "visibility": { - "cliSummaryTable": true, - "statusPage": true, - "telemetry": true - } -} diff --git a/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.expected b/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.expected index a2c09b1171a..ec39eb9a9dd 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.expected +++ b/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.expected @@ -1,4 +1,8 @@ -| Extraction failed in modules/subdir1/test.go with error cannot find package "subdir1/subsubdir1" in any of:\n\t(absolute path) (from $GOROOT)\n\t(absolute path) (from $GOPATH) | 2 | -| Extraction failed in modules/subdir1/test.go with error could not import subdir1/subsubdir1 (invalid package name: "") | 2 | -| Extraction failed in modules/subdir2/test.go with error cannot find package "subdir2/subsubdir2" in any of:\n\t(absolute path) (from $GOROOT)\n\t(absolute path) (from $GOPATH) | 2 | -| Extraction failed in modules/subdir2/test.go with error could not import subdir2/subsubdir2 (invalid package name: "") | 2 | +extractedFiles +| src/modules/subdir1/go.mod:0:0:0:0 | src/modules/subdir1/go.mod | +| src/modules/subdir1/subsubdir1/add.go:0:0:0:0 | src/modules/subdir1/subsubdir1/add.go | +| src/modules/subdir1/test.go:0:0:0:0 | src/modules/subdir1/test.go | +| src/modules/subdir2/go.mod:0:0:0:0 | src/modules/subdir2/go.mod | +| src/modules/subdir2/subsubdir2/add.go:0:0:0:0 | src/modules/subdir2/subsubdir2/add.go | +| src/modules/subdir2/test.go:0:0:0:0 | src/modules/subdir2/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.ql b/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.ql index e817bb2938a..459a4301560 100644 --- a/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.ql +++ b/go/ql/integration-tests/all-platforms/go/single-go-work-not-in-root/test.ql @@ -1,6 +1,8 @@ import go import semmle.go.DiagnosticsReporting +query predicate extractedFiles(File f) { any() } + from string msg, int sev where reportableDiagnostics(_, msg, sev) select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/diagnostics.expected index 226eb35d3ab..8d84d3efe44 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/diagnostics.expected +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/diagnostics.expected @@ -12,17 +12,3 @@ "telemetry": true } } -{ - "markdownMessage": "2 packages could not be found:\n\n`test/subdir2`, `subdir1/subsubdir1`.\n\nDefinitions in those packages may not be recognized by CodeQL, and files that use them may only be partially analyzed.\n\nCheck that the paths are correct and make sure any private packages can be accessed. If any of the packages are present in the repository then you may need a [custom build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", - "severity": "warning", - "source": { - "extractorName": "go", - "id": "go/autobuilder/package-not-found", - "name": "Some packages could not be found" - }, - "visibility": { - "cliSummaryTable": true, - "statusPage": true, - "telemetry": true - } -} diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.expected b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.expected index 38b4f954433..c19a77a7547 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.expected +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.expected @@ -1,4 +1,8 @@ -| Extraction failed in subdir0/subdir1/test.go with error cannot find package "subdir1/subsubdir1" in any of:\n\t(absolute path) (from $GOROOT)\n\t(absolute path) (from $GOPATH) | 2 | -| Extraction failed in subdir0/subdir1/test.go with error could not import subdir1/subsubdir1 (invalid package name: "") | 2 | -| Extraction failed in subdir0/test.go with error cannot find package "test/subdir2" in any of:\n\t(absolute path) (from $GOROOT)\n\t(absolute path) (from $GOPATH) | 2 | -| Extraction failed in subdir0/test.go with error could not import test/subdir2 (invalid package name: "") | 2 | +extractedFiles +| src/subdir0/go.mod:0:0:0:0 | src/subdir0/go.mod | +| src/subdir0/subdir1/go.mod:0:0:0:0 | src/subdir0/subdir1/go.mod | +| src/subdir0/subdir1/subsubdir1/add.go:0:0:0:0 | src/subdir0/subdir1/subsubdir1/add.go | +| src/subdir0/subdir1/test.go:0:0:0:0 | src/subdir0/subdir1/test.go | +| src/subdir0/subdir2/add.go:0:0:0:0 | src/subdir0/subdir2/add.go | +| src/subdir0/test.go:0:0:0:0 | src/subdir0/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.ql b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.ql index e817bb2938a..459a4301560 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.ql +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-none-in-root/test.ql @@ -1,6 +1,8 @@ import go import semmle.go.DiagnosticsReporting +query predicate extractedFiles(File f) { any() } + from string msg, int sev where reportableDiagnostics(_, msg, sev) select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.expected b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.expected index e69de29bb2d..d3e7328fe5a 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.expected +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.expected @@ -0,0 +1,8 @@ +extractedFiles +| src/go.mod:0:0:0:0 | src/go.mod | +| src/subdir1/go.mod:0:0:0:0 | src/subdir1/go.mod | +| src/subdir1/subsubdir1/add.go:0:0:0:0 | src/subdir1/subsubdir1/add.go | +| src/subdir1/test.go:0:0:0:0 | src/subdir1/test.go | +| src/subdir2/add.go:0:0:0:0 | src/subdir2/add.go | +| src/test.go:0:0:0:0 | src/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.ql b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.ql index e817bb2938a..459a4301560 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.ql +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-nested-one-in-root/test.ql @@ -1,6 +1,8 @@ import go import semmle.go.DiagnosticsReporting +query predicate extractedFiles(File f) { any() } + from string msg, int sev where reportableDiagnostics(_, msg, sev) select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/diagnostics.expected index e07da8154d4..bb26aa9aca4 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/diagnostics.expected +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/diagnostics.expected @@ -12,17 +12,3 @@ "telemetry": true } } -{ - "markdownMessage": "2 packages could not be found:\n\n`subdir1/subsubdir1`, `subdir2/subsubdir2`.\n\nDefinitions in those packages may not be recognized by CodeQL, and files that use them may only be partially analyzed.\n\nCheck that the paths are correct and make sure any private packages can be accessed. If any of the packages are present in the repository then you may need a [custom build command](https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-the-codeql-workflow-for-compiled-languages).", - "severity": "warning", - "source": { - "extractorName": "go", - "id": "go/autobuilder/package-not-found", - "name": "Some packages could not be found" - }, - "visibility": { - "cliSummaryTable": true, - "statusPage": true, - "telemetry": true - } -} diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.expected b/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.expected index 8435a54f44a..917ad8beba8 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.expected +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.expected @@ -1,4 +1,8 @@ -| Extraction failed in subdir1/test.go with error cannot find package "subdir1/subsubdir1" in any of:\n\t(absolute path) (from $GOROOT)\n\t(absolute path) (from $GOPATH) | 2 | -| Extraction failed in subdir1/test.go with error could not import subdir1/subsubdir1 (invalid package name: "") | 2 | -| Extraction failed in subdir2/test.go with error cannot find package "subdir2/subsubdir2" in any of:\n\t(absolute path) (from $GOROOT)\n\t(absolute path) (from $GOPATH) | 2 | -| Extraction failed in subdir2/test.go with error could not import subdir2/subsubdir2 (invalid package name: "") | 2 | +extractedFiles +| src/subdir1/go.mod:0:0:0:0 | src/subdir1/go.mod | +| src/subdir1/subsubdir1/add.go:0:0:0:0 | src/subdir1/subsubdir1/add.go | +| src/subdir1/test.go:0:0:0:0 | src/subdir1/test.go | +| src/subdir2/go.mod:0:0:0:0 | src/subdir2/go.mod | +| src/subdir2/subsubdir2/add.go:0:0:0:0 | src/subdir2/subsubdir2/add.go | +| src/subdir2/test.go:0:0:0:0 | src/subdir2/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.ql b/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.ql index e817bb2938a..459a4301560 100644 --- a/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.ql +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-not-nested/test.ql @@ -1,6 +1,8 @@ import go import semmle.go.DiagnosticsReporting +query predicate extractedFiles(File f) { any() } + from string msg, int sev where reportableDiagnostics(_, msg, sev) select msg, sev diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/diagnostics.expected new file mode 100644 index 00000000000..02805a60c99 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/diagnostics.expected @@ -0,0 +1,28 @@ +{ + "markdownMessage": "2 `go.mod` files were found:\n\n`subdir1/go.mod`, `subdir2/go.mod`", + "severity": "note", + "source": { + "extractorName": "go", + "id": "go/autobuilder/multiple-go-mod-found-not-nested", + "name": "Multiple `go.mod` files found, not all nested under one root `go.mod` file" + }, + "visibility": { + "cliSummaryTable": false, + "statusPage": false, + "telemetry": true + } +} +{ + "markdownMessage": "The following 1 Go project could not be extracted successfully:\n\n`subdir2`\n", + "severity": "warning", + "source": { + "extractorName": "go", + "id": "go/autobuilder/extraction-failed-for-project", + "name": "Unable to extract 1 Go projects" + }, + "visibility": { + "cliSummaryTable": true, + "statusPage": true, + "telemetry": true + } +} diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/force_sequential_test_execution b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/force_sequential_test_execution new file mode 100644 index 00000000000..47ca9929099 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/force_sequential_test_execution @@ -0,0 +1,2 @@ +# go get has been observed to sometimes fail when multiple tests try to simultaneously fetch the same package. +goget diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/go.mod b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/go.mod new file mode 100644 index 00000000000..147c51b8386 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/go.mod @@ -0,0 +1,5 @@ +go 1.14 + +require golang.org/x/net v0.0.0-20200505041828-1ed23360d12c + +module subdir1 diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/go.sum b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/go.sum new file mode 100644 index 00000000000..6c5ffa613d0 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/go.sum @@ -0,0 +1,7 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c h1:zJ0mtu4jCalhKg6Oaukv6iIkb+cOvDrajDH9DH46Q4M= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/subsubdir1/add.go b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/subsubdir1/add.go new file mode 100644 index 00000000000..900c2b5f266 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/subsubdir1/add.go @@ -0,0 +1,5 @@ +package subsubdir1 + +func Add(a, b int) int { + return a + b +} diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/test.go b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/test.go new file mode 100644 index 00000000000..6081be52248 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir1/test.go @@ -0,0 +1,14 @@ +package subdir + +import ( + "subdir1/subsubdir1" + + "golang.org/x/net/ipv4" +) + +func test() { + + header := ipv4.Header{} + header.Version = subsubdir1.Add(2, 2) + +} diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/go.mod b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/go.mod new file mode 100644 index 00000000000..7a2ca787004 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/go.mod @@ -0,0 +1,7 @@ +go 1.14 + +require ( + github.com/microsoft/go-mssqldb v0.12.0 +) + +module subdir2 diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/go.sum b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/go.sum new file mode 100644 index 00000000000..432407e3db0 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/go.sum @@ -0,0 +1,30 @@ +github.com/Azure/go-autorest v13.3.2+incompatible h1:VxzPyuhtnlBOzc4IWCZHqpyH2d+QMLQEuy3wREyY4oc= +github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.4 h1:1cM+NmKw91+8h5vfjgzK4ZGLuN72k87XVZBWyGwNjUM= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.1 h1:pZdL8o72rK+avFWl+p9nE8RWi1JInZrWJYlnpfXJwHk= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/microsoft/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73 h1:OGNva6WhsKst5OZf7eZOklDztV3hwtTHovdrLHV+MsA= +github.com/microsoft/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/subsubdir2/add.go b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/subsubdir2/add.go new file mode 100644 index 00000000000..99810d11db0 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/subsubdir2/add.go @@ -0,0 +1,5 @@ +package subsubdir2 + +func Add(a, b int) int { + return a + b +} diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/test.go b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/test.go new file mode 100644 index 00000000000..29ea91b58df --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/src/subdir2/test.go @@ -0,0 +1,12 @@ +package subdir + +import ( + mssql "github.com/microsoft/go-mssqldb" +) + +func test() { + connString := "hello" + connector, err := mssql.NewAccessTokenConnector( + connString, nil) + +} diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.expected b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.expected new file mode 100644 index 00000000000..8d83defa1bb --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.expected @@ -0,0 +1,5 @@ +extractedFiles +| src/subdir1/go.mod:0:0:0:0 | src/subdir1/go.mod | +| src/subdir1/subsubdir1/add.go:0:0:0:0 | src/subdir1/subsubdir1/add.go | +| src/subdir1/test.go:0:0:0:0 | src/subdir1/test.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.py b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.py new file mode 100644 index 00000000000..43c7d1b38e8 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.py @@ -0,0 +1,18 @@ +import os +import subprocess + +from create_database_utils import * +from diagnostics_test_utils import * + +# Set up a GOPATH relative to this test's root directory; +# we set os.environ instead of using extra_env because we +# need it to be set for the call to "go clean -modcache" later +goPath = os.path.join(os.path.abspath(os.getcwd()), ".go") +os.environ['GOPATH'] = goPath +run_codeql_database_create([], lang="go", source="src") + +check_diagnostics() + +# Clean up the temporary GOPATH to prevent Bazel failures next +# time the tests are run; see https://github.com/golang/go/issues/27161 +subprocess.call(["go", "clean", "-modcache"]) diff --git a/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.ql b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.ql new file mode 100644 index 00000000000..459a4301560 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/two-go-mods-one-failure/test.ql @@ -0,0 +1,8 @@ +import go +import semmle.go.DiagnosticsReporting + +query predicate extractedFiles(File f) { any() } + +from string msg, int sev +where reportableDiagnostics(_, msg, sev) +select msg, sev diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 65a2376217b..fee5fd37a26 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.7.10 + +### Major Analysis Improvements + +* We have significantly improved the Go autobuilder to understand a greater range of project layouts, which allows Go source files to be analysed that could previously not be processed. +* Go 1.22 has been included in the range of supported Go versions. + +### Bug Fixes + +* Fixed dataflow out of a `map` using a `range` statement. + ## 0.7.9 No user-facing changes. diff --git a/go/ql/lib/change-notes/released/0.7.10.md b/go/ql/lib/change-notes/released/0.7.10.md new file mode 100644 index 00000000000..55954f8a394 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.7.10.md @@ -0,0 +1,10 @@ +## 0.7.10 + +### Major Analysis Improvements + +* We have significantly improved the Go autobuilder to understand a greater range of project layouts, which allows Go source files to be analysed that could previously not be processed. +* Go 1.22 has been included in the range of supported Go versions. + +### Bug Fixes + +* Fixed dataflow out of a `map` using a `range` statement. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 576395f3405..67518567297 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.9 +lastReleaseVersion: 0.7.10 diff --git a/go/ql/lib/ideContextual.qll b/go/ql/lib/ideContextual.qll index b729aa81c8f..b28a23a6e00 100644 --- a/go/ql/lib/ideContextual.qll +++ b/go/ql/lib/ideContextual.qll @@ -4,6 +4,7 @@ */ import go +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -11,13 +12,5 @@ import go */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 02333bd3cad..8cc190fa880 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 0.7.9 +version: 0.7.10 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll index ad985e2c5b5..e6a21a06dec 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -41,11 +41,11 @@ predicate containerStoreStep(Node node1, Node node2, Content c) { or c instanceof MapKeyContent and node2.getType() instanceof MapType and - exists(Write w | w.writesElement(node2, node1, _)) + exists(Write w | w.writesElement(node2.(PostUpdateNode).getPreUpdateNode(), node1, _)) or c instanceof MapValueContent and node2.getType() instanceof MapType and - exists(Write w | w.writesElement(node2, _, node1)) + exists(Write w | w.writesElement(node2.(PostUpdateNode).getPreUpdateNode(), _, node1)) } /** @@ -57,11 +57,11 @@ predicate containerStoreStep(Node node1, Node node2, Content c) { predicate containerReadStep(Node node1, Node node2, Content c) { c instanceof ArrayContent and ( - node2.(Read).readsElement(node1, _) and - ( - node1.getType() instanceof ArrayType or - node1.getType() instanceof SliceType - ) + node1.getType() instanceof ArrayType or + node1.getType() instanceof SliceType + ) and + ( + node2.(Read).readsElement(node1, _) or node2.(RangeElementNode).getBase() = node1 or @@ -85,5 +85,5 @@ predicate containerReadStep(Node node1, Node node2, Content c) { or c instanceof MapValueContent and node1.getType() instanceof MapType and - node2.(Read).readsElement(node1, _) + (node2.(Read).readsElement(node1, _) or node2.(RangeElementNode).getBase() = node1) } diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index d95165a3a34..24e38b9890e 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.10 + +No user-facing changes. + ## 0.7.9 ### New Queries diff --git a/go/ql/src/change-notes/released/0.7.10.md b/go/ql/src/change-notes/released/0.7.10.md new file mode 100644 index 00000000000..989c5b8f682 --- /dev/null +++ b/go/ql/src/change-notes/released/0.7.10.md @@ -0,0 +1,3 @@ +## 0.7.10 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 576395f3405..67518567297 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.9 +lastReleaseVersion: 0.7.10 diff --git a/go/ql/src/experimental/CWE-525/WebCacheDeception.expected b/go/ql/src/experimental/CWE-525/WebCacheDeception.expected new file mode 100644 index 00000000000..70e70de3037 --- /dev/null +++ b/go/ql/src/experimental/CWE-525/WebCacheDeception.expected @@ -0,0 +1,5 @@ +| WebCacheDeceptionBad.go:82:18:82:31 | "/adminusers/" | "/adminusers/" is used as wildcard endpoint. | +| WebCacheDeceptionFiber.go:15:10:15:17 | "/api/*" | "/api/*" is used as wildcard endpoint. | +| WebCacheDeceptionFiber.go:20:11:20:18 | "/api/*" | "/api/*" is used as wildcard endpoint. | +| WebCacheDeceptionGoChi.go:13:8:13:11 | "/*" | "/*" is used as wildcard endpoint. | +| WebCacheDeceptionHTTPRouter.go:21:13:21:25 | "/test/*test" | "/test/*test" is used as wildcard endpoint. | diff --git a/go/ql/src/experimental/CWE-525/WebCacheDeception.qhelp b/go/ql/src/experimental/CWE-525/WebCacheDeception.qhelp index f2958304383..deea709abcf 100644 --- a/go/ql/src/experimental/CWE-525/WebCacheDeception.qhelp +++ b/go/ql/src/experimental/CWE-525/WebCacheDeception.qhelp @@ -17,13 +17,31 @@

Vulnerable code example: A web server is configured to cache all responses ending in '.css'. An attacker requests 'profile.css', and the server processes 'profile', a sensitive page, and caches it.

- +

Secure code example: The server is configured with strict cache controls and URL validation, preventing caching of dynamic or sensitive pages regardless of their URL pattern.

- + +
+ +

+ Vulnerable code example: The server is configured with strict cache controls and URL validation, preventing caching of dynamic or sensitive pages regardless of their URL pattern. +

+ +
+ +

+ Vulnerable code example: The server is configured with strict cache controls and URL validation, preventing caching of dynamic or sensitive pages regardless of their URL pattern. +

+ +
+ +

+ Vulnerable code example: The server is configured with strict cache controls and URL validation, preventing caching of dynamic or sensitive pages regardless of their URL pattern. +

+
  • diff --git a/go/ql/src/experimental/CWE-525/WebCacheDeception.ql b/go/ql/src/experimental/CWE-525/WebCacheDeception.ql index 2af70ee490c..eb488b0b0d1 100644 --- a/go/ql/src/experimental/CWE-525/WebCacheDeception.ql +++ b/go/ql/src/experimental/CWE-525/WebCacheDeception.ql @@ -11,17 +11,7 @@ */ import go +import WebCacheDeceptionLib -from - DataFlow::CallNode httpHandleFuncCall, DataFlow::ReadNode rn, Http::HeaderWrite::Range hw, - DeclaredFunction f -where - httpHandleFuncCall.getTarget().hasQualifiedName("net/http", "HandleFunc") and - httpHandleFuncCall.getArgument(0).getStringValue().matches("%/") and - httpHandleFuncCall.getArgument(1) = rn and - rn.reads(f) and - f.getParameter(0) = hw.getResponseWriter() and - hw.getHeaderName() = "cache-control" -select httpHandleFuncCall.getArgument(0), - "Wildcard Endpoint used with " + httpHandleFuncCall.getArgument(0) + " and '" + hw.getHeaderName() - + "' Header is used" +from WebCacheDeception::Sink httpHandleFuncCall +select httpHandleFuncCall, httpHandleFuncCall + " is used as wildcard endpoint." diff --git a/go/ql/src/experimental/CWE-525/WebCacheDeceptionLib.qll b/go/ql/src/experimental/CWE-525/WebCacheDeceptionLib.qll new file mode 100644 index 00000000000..32223cf98eb --- /dev/null +++ b/go/ql/src/experimental/CWE-525/WebCacheDeceptionLib.qll @@ -0,0 +1,61 @@ +import go +import StringOps + +module WebCacheDeception { + abstract class Sink extends DataFlow::Node { } + + private class GoNetHttp extends Sink { + GoNetHttp() { + exists( + DataFlow::CallNode m, DataFlow::ReadNode rn, Http::HeaderWrite::Range hw, DeclaredFunction f + | + m.getTarget().hasQualifiedName("net/http", "HandleFunc") and + m.getArgument(0).getStringValue().matches("%/") and + m.getArgument(1) = rn and + rn.reads(f) and + f.getParameter(0) = hw.getResponseWriter() and + hw.getHeaderName() = "cache-control" and + this = m.getArgument(0) + ) + } + } + + private class GoFiber extends Sink { + GoFiber() { + exists(ImportSpec i | + i.getPath() = "github.com/gofiber/fiber" or + i.getPath() = "github.com/gofiber/fiber/v2" + | + exists(DataFlow::CallNode m | + m.getCall().getArgument(0).toString().matches("%/*%") and + this = m.getArgument(0) + ) + ) + } + } + + private class GoChi extends Sink { + GoChi() { + exists(ImportSpec i | + i.getPath() = "github.com/go-chi/chi/v5" or + i.getPath() = "github.com/go-chi/chi/v5/middleware" + | + exists(DataFlow::CallNode m | + m.getCall().getArgument(0).toString().matches("%/*%") and + this = m.getArgument(0) + ) + ) + } + } + + private class GoHttpRouter extends Sink { + GoHttpRouter() { + exists(string pkg | pkg = "github.com/julienschmidt/httprouter" | + exists(DataFlow::CallNode m | + m.getCall().getArgument(0).toString().matches("%/*%") and + this = m.getArgument(0) + ) + ) + } + } +} diff --git a/go/ql/src/experimental/CWE-525/WebCacheDeceptionBad.go b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionBad.go similarity index 100% rename from go/ql/src/experimental/CWE-525/WebCacheDeceptionBad.go rename to go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionBad.go diff --git a/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionFiber.go b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionFiber.go new file mode 100644 index 00000000000..e6107de430a --- /dev/null +++ b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionFiber.go @@ -0,0 +1,38 @@ +package fiber + +import ( + "fmt" + "log" + + "github.com/gofiber/fiber/v2" +) + +func main() { + app := fiber.New() + log.Println("We are logging in Golang!") + + // GET /api/register + app.Get("/api/*", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("✋") + return c.SendString(msg) // => ✋ register + }) + + app.Post("/api/*", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("✋") + return c.SendString(msg) // => ✋ register + }) + + // GET /flights/LAX-SFO + app.Get("/flights/:from-:to", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to")) + return c.SendString(msg) // => 💸 From: LAX, To: SFO + }) + + // GET /dictionary.txt + app.Get("/:file.:ext", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext")) + return c.SendString(msg) // => 📃 dictionary.txt + }) + + log.Fatal(app.Listen(":3000")) +} diff --git a/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionGoChi.go b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionGoChi.go new file mode 100644 index 00000000000..fcfa7911cc4 --- /dev/null +++ b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionGoChi.go @@ -0,0 +1,17 @@ +package main + +import ( + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func main() { + r := chi.NewRouter() + r.Use(middleware.Logger) + r.Get("/*", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("welcome")) + }) + http.ListenAndServe(":3000", r) +} diff --git a/go/ql/src/experimental/CWE-525/WebCacheDeceptionGood.go b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionGood.go similarity index 100% rename from go/ql/src/experimental/CWE-525/WebCacheDeceptionGood.go rename to go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionGood.go diff --git a/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionHTTPRouter.go b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionHTTPRouter.go new file mode 100644 index 00000000000..79369565051 --- /dev/null +++ b/go/ql/src/experimental/CWE-525/examples/WebCacheDeceptionHTTPRouter.go @@ -0,0 +1,25 @@ +package httprouter + +import ( + "fmt" + "log" + "net/http" + + "github.com/julienschmidt/httprouter" +) + +func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + fmt.Fprint(w, "Welcome!\n") +} + +func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name")) +} + +func main() { + router := httprouter.New() + router.GET("/test/*test", Index) + router.GET("/hello/:name", Hello) + + log.Fatal(http.ListenAndServe(":8082", router)) +} diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index e601e8088ce..4ded3a52f63 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 0.7.9 +version: 0.7.10 groups: - go - queries diff --git a/go/ql/test/experimental/CWE-525/WebCacheDeception.expected b/go/ql/test/experimental/CWE-525/WebCacheDeception.expected index 969ba863fa0..70e70de3037 100644 --- a/go/ql/test/experimental/CWE-525/WebCacheDeception.expected +++ b/go/ql/test/experimental/CWE-525/WebCacheDeception.expected @@ -1 +1,5 @@ -| WebCacheDeceptionBad.go:82:18:82:31 | "/adminusers/" | Wildcard Endpoint used with "/adminusers/" and 'cache-control' Header is used | \ No newline at end of file +| WebCacheDeceptionBad.go:82:18:82:31 | "/adminusers/" | "/adminusers/" is used as wildcard endpoint. | +| WebCacheDeceptionFiber.go:15:10:15:17 | "/api/*" | "/api/*" is used as wildcard endpoint. | +| WebCacheDeceptionFiber.go:20:11:20:18 | "/api/*" | "/api/*" is used as wildcard endpoint. | +| WebCacheDeceptionGoChi.go:13:8:13:11 | "/*" | "/*" is used as wildcard endpoint. | +| WebCacheDeceptionHTTPRouter.go:21:13:21:25 | "/test/*test" | "/test/*test" is used as wildcard endpoint. | diff --git a/go/ql/test/experimental/CWE-525/WebCacheDeceptionBad.go b/go/ql/test/experimental/CWE-525/WebCacheDeceptionBad.go index b3c0d345bd1..577fbd78c06 100644 --- a/go/ql/test/experimental/CWE-525/WebCacheDeceptionBad.go +++ b/go/ql/test/experimental/CWE-525/WebCacheDeceptionBad.go @@ -1,4 +1,4 @@ -package bad +package main import ( "fmt" @@ -74,7 +74,7 @@ func ShowAdminPageCache(w http.ResponseWriter, r *http.Request) { } -func main() { +func badRoutingNet() { fmt.Println("Vulnapp server listening : 1337") http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets/")))) diff --git a/go/ql/test/experimental/CWE-525/WebCacheDeceptionFiber.go b/go/ql/test/experimental/CWE-525/WebCacheDeceptionFiber.go new file mode 100644 index 00000000000..80f396c26df --- /dev/null +++ b/go/ql/test/experimental/CWE-525/WebCacheDeceptionFiber.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + "log" + + "github.com/gofiber/fiber/v2" +) + +func badRouting() { + app := fiber.New() + log.Println("We are logging in Golang!") + + // GET /api/register + app.Get("/api/*", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("✋") + return c.SendString(msg) // => ✋ register + }) + + app.Post("/api/*", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("✋") + return c.SendString(msg) // => ✋ register + }) + + // GET /flights/LAX-SFO + app.Get("/flights/:from-:to", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to")) + return c.SendString(msg) // => 💸 From: LAX, To: SFO + }) + + // GET /dictionary.txt + app.Get("/:file.:ext", func(c *fiber.Ctx) error { + msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext")) + return c.SendString(msg) // => 📃 dictionary.txt + }) + + log.Fatal(app.Listen(":3000")) +} diff --git a/go/ql/test/experimental/CWE-525/WebCacheDeceptionGoChi.go b/go/ql/test/experimental/CWE-525/WebCacheDeceptionGoChi.go new file mode 100644 index 00000000000..539dae1dee9 --- /dev/null +++ b/go/ql/test/experimental/CWE-525/WebCacheDeceptionGoChi.go @@ -0,0 +1,17 @@ +package main + +import ( + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func badRoutingChi() { + r := chi.NewRouter() + r.Use(middleware.Logger) + r.Get("/*", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("welcome")) + }) + http.ListenAndServe(":3000", r) +} diff --git a/go/ql/test/experimental/CWE-525/WebCacheDeceptionHTTPRouter.go b/go/ql/test/experimental/CWE-525/WebCacheDeceptionHTTPRouter.go new file mode 100644 index 00000000000..864c6c5e31c --- /dev/null +++ b/go/ql/test/experimental/CWE-525/WebCacheDeceptionHTTPRouter.go @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "log" + "net/http" + + "github.com/julienschmidt/httprouter" +) + +func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + fmt.Fprint(w, "Welcome!\n") +} + +func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name")) +} + +func badHTTPRouter() { + router := httprouter.New() + router.GET("/test/*test", Index) + router.GET("/hello/:name", Hello) + + log.Fatal(http.ListenAndServe(":8082", router)) +} diff --git a/go/ql/test/experimental/CWE-525/go.mod b/go/ql/test/experimental/CWE-525/go.mod new file mode 100644 index 00000000000..a3190908392 --- /dev/null +++ b/go/ql/test/experimental/CWE-525/go.mod @@ -0,0 +1,23 @@ +module wcd + +go 1.21 + +require ( + github.com/go-chi/chi/v5 v5.0.10 + github.com/gofiber/fiber/v2 v2.51.0 + github.com/julienschmidt/httprouter v1.3.0 +) + +require ( + github.com/andybalholm/brotli v1.0.5 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.50.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + golang.org/x/sys v0.14.0 // indirect +) diff --git a/go/ql/test/experimental/CWE-525/vendor/github.com/go-chi/chi/v5/middleware/stub.go b/go/ql/test/experimental/CWE-525/vendor/github.com/go-chi/chi/v5/middleware/stub.go new file mode 100644 index 00000000000..7bfbedf3a61 --- /dev/null +++ b/go/ql/test/experimental/CWE-525/vendor/github.com/go-chi/chi/v5/middleware/stub.go @@ -0,0 +1,16 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for github.com/go-chi/chi/v5/middleware, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: github.com/go-chi/chi/v5/middleware (exports: ; functions: Logger) + +// Package middleware is a stub of github.com/go-chi/chi/v5/middleware, generated by depstubber. +package middleware + +import ( + http "net/http" +) + +func Logger(_ http.Handler) http.Handler { + return nil +} diff --git a/go/ql/test/experimental/CWE-525/vendor/github.com/go-chi/chi/v5/stub.go b/go/ql/test/experimental/CWE-525/vendor/github.com/go-chi/chi/v5/stub.go new file mode 100644 index 00000000000..6a75474c6de --- /dev/null +++ b/go/ql/test/experimental/CWE-525/vendor/github.com/go-chi/chi/v5/stub.go @@ -0,0 +1,160 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for github.com/go-chi/chi/v5, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: github.com/go-chi/chi/v5 (exports: ; functions: NewRouter) + +// Package chi is a stub of github.com/go-chi/chi/v5, generated by depstubber. +package chi + +import ( + http "net/http" +) + +type Context struct { + Routes Routes + RoutePath string + RouteMethod string + URLParams RouteParams + RoutePatterns []string +} + +func (_ *Context) Reset() {} + +func (_ *Context) RoutePattern() string { + return "" +} + +func (_ *Context) URLParam(_ string) string { + return "" +} + +type Middlewares []func(http.Handler) http.Handler + +func (_ Middlewares) Handler(_ http.Handler) http.Handler { + return nil +} + +func (_ Middlewares) HandlerFunc(_ http.HandlerFunc) http.Handler { + return nil +} + +type Mux struct{} + +func (_ *Mux) Connect(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Delete(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Get(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Group(_ func(Router)) Router { + return nil +} + +func (_ *Mux) Handle(_ string, _ http.Handler) {} + +func (_ *Mux) HandleFunc(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Head(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Match(_ *Context, _ string, _ string) bool { + return false +} + +func (_ *Mux) Method(_ string, _ string, _ http.Handler) {} + +func (_ *Mux) MethodFunc(_ string, _ string, _ http.HandlerFunc) {} + +func (_ *Mux) MethodNotAllowed(_ http.HandlerFunc) {} + +func (_ *Mux) MethodNotAllowedHandler(_ ...interface{}) http.HandlerFunc { + return nil +} + +func (_ *Mux) Middlewares() Middlewares { + return nil +} + +func (_ *Mux) Mount(_ string, _ http.Handler) {} + +func (_ *Mux) NotFound(_ http.HandlerFunc) {} + +func (_ *Mux) NotFoundHandler() http.HandlerFunc { + return nil +} + +func (_ *Mux) Options(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Patch(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Post(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Put(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Route(_ string, _ func(Router)) Router { + return nil +} + +func (_ *Mux) Routes() []Route { + return nil +} + +func (_ *Mux) ServeHTTP(_ http.ResponseWriter, _ *http.Request) {} + +func (_ *Mux) Trace(_ string, _ http.HandlerFunc) {} + +func (_ *Mux) Use(_ ...func(http.Handler) http.Handler) {} + +func (_ *Mux) With(_ ...func(http.Handler) http.Handler) Router { + return nil +} + +func NewRouter() *Mux { + return nil +} + +type Route struct { + SubRoutes Routes + Handlers map[string]http.Handler + Pattern string +} + +type RouteParams struct { + Keys []string + Values []string +} + +func (_ *RouteParams) Add(_ string, _ string) {} + +type Router interface { + Connect(_ string, _ http.HandlerFunc) + Delete(_ string, _ http.HandlerFunc) + Get(_ string, _ http.HandlerFunc) + Group(_ func(Router)) Router + Handle(_ string, _ http.Handler) + HandleFunc(_ string, _ http.HandlerFunc) + Head(_ string, _ http.HandlerFunc) + Match(_ *Context, _ string, _ string) bool + Method(_ string, _ string, _ http.Handler) + MethodFunc(_ string, _ string, _ http.HandlerFunc) + MethodNotAllowed(_ http.HandlerFunc) + Middlewares() Middlewares + Mount(_ string, _ http.Handler) + NotFound(_ http.HandlerFunc) + Options(_ string, _ http.HandlerFunc) + Patch(_ string, _ http.HandlerFunc) + Post(_ string, _ http.HandlerFunc) + Put(_ string, _ http.HandlerFunc) + Route(_ string, _ func(Router)) Router + Routes() []Route + ServeHTTP(_ http.ResponseWriter, _ *http.Request) + Trace(_ string, _ http.HandlerFunc) + Use(_ ...func(http.Handler) http.Handler) + With(_ ...func(http.Handler) http.Handler) Router +} + +type Routes interface { + Match(_ *Context, _ string, _ string) bool + Middlewares() Middlewares + Routes() []Route +} diff --git a/go/ql/test/experimental/CWE-525/vendor/github.com/gofiber/fiber/v2/stub.go b/go/ql/test/experimental/CWE-525/vendor/github.com/gofiber/fiber/v2/stub.go new file mode 100644 index 00000000000..ccd2ccda0ee --- /dev/null +++ b/go/ql/test/experimental/CWE-525/vendor/github.com/gofiber/fiber/v2/stub.go @@ -0,0 +1,1033 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for github.com/gofiber/fiber/v2, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: github.com/gofiber/fiber/v2 (exports: ; functions: New,Get,Post) + +// Package fiber is a stub of github.com/gofiber/fiber/v2, generated by depstubber. +package fiber + +import ( + context "context" + tls "crypto/tls" + x509 "crypto/x509" + io "io" + multipart "mime/multipart" + net "net" + http "net/http" + time "time" +) + +type Agent struct { + Name string + NoDefaultUserAgentHeader bool + HostClient interface{} +} + +func (_ Agent) CloseIdleConnections() {} + +func (_ Agent) ConnsCount() int { + return 0 +} + +func (_ Agent) Do(_ interface{}, _ interface{}) error { + return nil +} + +func (_ Agent) DoDeadline(_ interface{}, _ interface{}, _ time.Time) error { + return nil +} + +func (_ Agent) DoRedirects(_ interface{}, _ interface{}, _ int) error { + return nil +} + +func (_ Agent) DoTimeout(_ interface{}, _ interface{}, _ time.Duration) error { + return nil +} + +func (_ Agent) Get(_ []byte, _ string) (int, []byte, error) { + return 0, nil, nil +} + +func (_ Agent) GetDeadline(_ []byte, _ string, _ time.Time) (int, []byte, error) { + return 0, nil, nil +} + +func (_ Agent) GetTimeout(_ []byte, _ string, _ time.Duration) (int, []byte, error) { + return 0, nil, nil +} + +func (_ Agent) LastUseTime() time.Time { + return time.Time{} +} + +func (_ Agent) PendingRequests() int { + return 0 +} + +func (_ Agent) Post(_ []byte, _ string, _ interface{}) (int, []byte, error) { + return 0, nil, nil +} + +func (_ Agent) SetMaxConns(_ int) {} + +func (_ *Agent) Add(_ string, _ string) *Agent { + return nil +} + +func (_ *Agent) AddBytesK(_ []byte, _ string) *Agent { + return nil +} + +func (_ *Agent) AddBytesKV(_ []byte, _ []byte) *Agent { + return nil +} + +func (_ *Agent) AddBytesV(_ string, _ []byte) *Agent { + return nil +} + +func (_ *Agent) BasicAuth(_ string, _ string) *Agent { + return nil +} + +func (_ *Agent) BasicAuthBytes(_ []byte, _ []byte) *Agent { + return nil +} + +func (_ *Agent) Body(_ []byte) *Agent { + return nil +} + +func (_ *Agent) BodyStream(_ io.Reader, _ int) *Agent { + return nil +} + +func (_ *Agent) BodyString(_ string) *Agent { + return nil +} + +func (_ *Agent) Boundary(_ string) *Agent { + return nil +} + +func (_ *Agent) Bytes() (int, []byte, []error) { + return 0, nil, nil +} + +func (_ *Agent) ConnectionClose() *Agent { + return nil +} + +func (_ *Agent) ContentType(_ string) *Agent { + return nil +} + +func (_ *Agent) ContentTypeBytes(_ []byte) *Agent { + return nil +} + +func (_ *Agent) Cookie(_ string, _ string) *Agent { + return nil +} + +func (_ *Agent) CookieBytesK(_ []byte, _ string) *Agent { + return nil +} + +func (_ *Agent) CookieBytesKV(_ []byte, _ []byte) *Agent { + return nil +} + +func (_ *Agent) Cookies(_ ...string) *Agent { + return nil +} + +func (_ *Agent) CookiesBytesKV(_ ...[]byte) *Agent { + return nil +} + +func (_ *Agent) Debug(_ ...io.Writer) *Agent { + return nil +} + +func (_ *Agent) Dest(_ []byte) *Agent { + return nil +} + +func (_ *Agent) FileData(_ ...*FormFile) *Agent { + return nil +} + +func (_ *Agent) Form(_ interface{}) *Agent { + return nil +} + +func (_ *Agent) Host(_ string) *Agent { + return nil +} + +func (_ *Agent) HostBytes(_ []byte) *Agent { + return nil +} + +func (_ *Agent) InsecureSkipVerify() *Agent { + return nil +} + +func (_ *Agent) JSON(_ interface{}, _ ...string) *Agent { + return nil +} + +func (_ *Agent) JSONDecoder(_ interface{}) *Agent { + return nil +} + +func (_ *Agent) JSONEncoder(_ interface{}) *Agent { + return nil +} + +func (_ *Agent) MaxRedirectsCount(_ int) *Agent { + return nil +} + +func (_ *Agent) MultipartForm(_ interface{}) *Agent { + return nil +} + +func (_ *Agent) Parse() error { + return nil +} + +func (_ *Agent) QueryString(_ string) *Agent { + return nil +} + +func (_ *Agent) QueryStringBytes(_ []byte) *Agent { + return nil +} + +func (_ *Agent) Referer(_ string) *Agent { + return nil +} + +func (_ *Agent) RefererBytes(_ []byte) *Agent { + return nil +} + +func (_ *Agent) Request() interface{} { + return nil +} + +func (_ *Agent) RetryIf(_ interface{}) *Agent { + return nil +} + +func (_ *Agent) Reuse() *Agent { + return nil +} + +func (_ *Agent) SendFile(_ string, _ ...string) *Agent { + return nil +} + +func (_ *Agent) SendFiles(_ ...string) *Agent { + return nil +} + +func (_ *Agent) Set(_ string, _ string) *Agent { + return nil +} + +func (_ *Agent) SetBytesK(_ []byte, _ string) *Agent { + return nil +} + +func (_ *Agent) SetBytesKV(_ []byte, _ []byte) *Agent { + return nil +} + +func (_ *Agent) SetBytesV(_ string, _ []byte) *Agent { + return nil +} + +func (_ *Agent) SetResponse(_ interface{}) *Agent { + return nil +} + +func (_ *Agent) String() (int, string, []error) { + return 0, "", nil +} + +func (_ *Agent) Struct(_ interface{}) (int, []byte, []error) { + return 0, nil, nil +} + +func (_ *Agent) TLSConfig(_ *tls.Config) *Agent { + return nil +} + +func (_ *Agent) Timeout(_ time.Duration) *Agent { + return nil +} + +func (_ *Agent) UserAgent(_ string) *Agent { + return nil +} + +func (_ *Agent) UserAgentBytes(_ []byte) *Agent { + return nil +} + +func (_ *Agent) XML(_ interface{}) *Agent { + return nil +} + +type App struct{} + +func (_ *App) AcquireCtx(_ interface{}) *Ctx { + return nil +} + +func (_ *App) Add(_ string, _ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) All(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Config() Config { + return Config{} +} + +func (_ *App) Connect(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Delete(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) ErrorHandler(_ *Ctx, _ error) error { + return nil +} + +func (_ *App) Get(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) GetRoute(_ string) Route { + return Route{} +} + +func (_ *App) GetRoutes(_ ...bool) []Route { + return nil +} + +func (_ *App) Group(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Handler() interface{} { + return nil +} + +func (_ *App) HandlersCount() uint32 { + return 0 +} + +func (_ *App) Head(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Hooks() *Hooks { + return nil +} + +func (_ *App) Listen(_ string) error { + return nil +} + +func (_ *App) ListenMutualTLS(_ string, _ string, _ string, _ string) error { + return nil +} + +func (_ *App) ListenMutualTLSWithCertificate(_ string, _ tls.Certificate, _ *x509.CertPool) error { + return nil +} + +func (_ *App) ListenTLS(_ string, _ string, _ string) error { + return nil +} + +func (_ *App) ListenTLSWithCertificate(_ string, _ tls.Certificate) error { + return nil +} + +func (_ *App) Listener(_ net.Listener) error { + return nil +} + +func (_ *App) Mount(_ string, _ *App) Router { + return nil +} + +func (_ *App) MountPath() string { + return "" +} + +func (_ *App) Name(_ string) Router { + return nil +} + +func (_ *App) Options(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Patch(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Post(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Put(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) ReleaseCtx(_ *Ctx) {} + +func (_ *App) Route(_ string, _ func(Router), _ ...string) Router { + return nil +} + +func (_ *App) Server() interface{} { + return nil +} + +func (_ *App) SetTLSHandler(_ *TLSHandler) {} + +func (_ *App) Shutdown() error { + return nil +} + +func (_ *App) ShutdownWithContext(_ context.Context) error { + return nil +} + +func (_ *App) ShutdownWithTimeout(_ time.Duration) error { + return nil +} + +func (_ *App) Stack() [][]*Route { + return nil +} + +func (_ *App) Static(_ string, _ string, _ ...Static) Router { + return nil +} + +func (_ *App) Test(_ *http.Request, _ ...int) (*http.Response, error) { + return nil, nil +} + +func (_ *App) Trace(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *App) Use(_ ...interface{}) Router { + return nil +} + +type Colors struct { + Black string + Red string + Green string + Yellow string + Blue string + Magenta string + Cyan string + White string + Reset string +} + +type Config struct { + Prefork bool + ServerHeader string + StrictRouting bool + CaseSensitive bool + Immutable bool + UnescapePath bool + ETag bool + BodyLimit int + Concurrency int + Views Views + ViewsLayout string + PassLocalsToViews bool + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration + ReadBufferSize int + WriteBufferSize int + CompressedFileSuffix string + ProxyHeader string + GETOnly bool + ErrorHandler func(*Ctx, error) error + DisableKeepalive bool + DisableDefaultDate bool + DisableDefaultContentType bool + DisableHeaderNormalizing bool + DisableStartupMessage bool + AppName string + StreamRequestBody bool + DisablePreParseMultipartForm bool + ReduceMemoryUsage bool + JSONEncoder interface{} + JSONDecoder interface{} + XMLEncoder interface{} + Network string + EnableTrustedProxyCheck bool + TrustedProxies []string + EnableIPValidation bool + EnablePrintRoutes bool + ColorScheme Colors + RequestMethods []string + EnableSplittingOnParsers bool +} + +type Cookie struct { + Name string + Value string + Path string + Domain string + MaxAge int + Expires time.Time + Secure bool + HTTPOnly bool + SameSite string + SessionOnly bool +} + +type Ctx struct{} + +func (_ *Ctx) Accepts(_ ...string) string { + return "" +} + +func (_ *Ctx) AcceptsCharsets(_ ...string) string { + return "" +} + +func (_ *Ctx) AcceptsEncodings(_ ...string) string { + return "" +} + +func (_ *Ctx) AcceptsLanguages(_ ...string) string { + return "" +} + +func (_ *Ctx) AllParams() map[string]string { + return nil +} + +func (_ *Ctx) App() *App { + return nil +} + +func (_ *Ctx) Append(_ string, _ ...string) {} + +func (_ *Ctx) Attachment(_ ...string) {} + +func (_ *Ctx) BaseURL() string { + return "" +} + +func (_ *Ctx) Bind(_ Map) error { + return nil +} + +func (_ *Ctx) Body() []byte { + return nil +} + +func (_ *Ctx) BodyParser(_ interface{}) error { + return nil +} + +func (_ *Ctx) BodyRaw() []byte { + return nil +} + +func (_ *Ctx) ClearCookie(_ ...string) {} + +func (_ *Ctx) ClientHelloInfo() *tls.ClientHelloInfo { + return nil +} + +func (_ *Ctx) Context() interface{} { + return nil +} + +func (_ *Ctx) Cookie(_ *Cookie) {} + +func (_ *Ctx) CookieParser(_ interface{}) error { + return nil +} + +func (_ *Ctx) Cookies(_ string, _ ...string) string { + return "" +} + +func (_ *Ctx) Download(_ string, _ ...string) error { + return nil +} + +func (_ *Ctx) FormFile(_ string) (*multipart.FileHeader, error) { + return nil, nil +} + +func (_ *Ctx) FormValue(_ string, _ ...string) string { + return "" +} + +func (_ *Ctx) Format(_ interface{}) error { + return nil +} + +func (_ *Ctx) Fresh() bool { + return false +} + +func (_ *Ctx) Get(_ string, _ ...string) string { + return "" +} + +func (_ *Ctx) GetReqHeaders() map[string][]string { + return nil +} + +func (_ *Ctx) GetRespHeader(_ string, _ ...string) string { + return "" +} + +func (_ *Ctx) GetRespHeaders() map[string][]string { + return nil +} + +func (_ *Ctx) GetRouteURL(_ string, _ Map) (string, error) { + return "", nil +} + +func (_ *Ctx) Hostname() string { + return "" +} + +func (_ *Ctx) IP() string { + return "" +} + +func (_ *Ctx) IPs() []string { + return nil +} + +func (_ *Ctx) Is(_ string) bool { + return false +} + +func (_ *Ctx) IsFromLocal() bool { + return false +} + +func (_ *Ctx) IsProxyTrusted() bool { + return false +} + +func (_ *Ctx) JSON(_ interface{}, _ ...string) error { + return nil +} + +func (_ *Ctx) JSONP(_ interface{}, _ ...string) error { + return nil +} + +func (_ *Ctx) Links(_ ...string) {} + +func (_ *Ctx) Locals(_ interface{}, _ ...interface{}) interface{} { + return nil +} + +func (_ *Ctx) Location(_ string) {} + +func (_ *Ctx) Method(_ ...string) string { + return "" +} + +func (_ *Ctx) MultipartForm() (*multipart.Form, error) { + return nil, nil +} + +func (_ *Ctx) Next() error { + return nil +} + +func (_ *Ctx) OriginalURL() string { + return "" +} + +func (_ *Ctx) Params(_ string, _ ...string) string { + return "" +} + +func (_ *Ctx) ParamsInt(_ string, _ ...int) (int, error) { + return 0, nil +} + +func (_ *Ctx) ParamsParser(_ interface{}) error { + return nil +} + +func (_ *Ctx) Path(_ ...string) string { + return "" +} + +func (_ *Ctx) Port() string { + return "" +} + +func (_ *Ctx) Protocol() string { + return "" +} + +func (_ *Ctx) Queries() map[string]string { + return nil +} + +func (_ *Ctx) Query(_ string, _ ...string) string { + return "" +} + +func (_ *Ctx) QueryBool(_ string, _ ...bool) bool { + return false +} + +func (_ *Ctx) QueryFloat(_ string, _ ...float64) float64 { + return 0 +} + +func (_ *Ctx) QueryInt(_ string, _ ...int) int { + return 0 +} + +func (_ *Ctx) QueryParser(_ interface{}) error { + return nil +} + +func (_ *Ctx) Range(_ int) (Range, error) { + return Range{}, nil +} + +func (_ *Ctx) Redirect(_ string, _ ...int) error { + return nil +} + +func (_ *Ctx) RedirectBack(_ string, _ ...int) error { + return nil +} + +func (_ *Ctx) RedirectToRoute(_ string, _ Map, _ ...int) error { + return nil +} + +func (_ *Ctx) Render(_ string, _ interface{}, _ ...string) error { + return nil +} + +func (_ *Ctx) ReqHeaderParser(_ interface{}) error { + return nil +} + +func (_ *Ctx) Request() interface{} { + return nil +} + +func (_ *Ctx) Response() interface{} { + return nil +} + +func (_ *Ctx) RestartRouting() error { + return nil +} + +func (_ *Ctx) Route() *Route { + return nil +} + +func (_ *Ctx) SaveFile(_ *multipart.FileHeader, _ string) error { + return nil +} + +func (_ *Ctx) SaveFileToStorage(_ *multipart.FileHeader, _ string, _ Storage) error { + return nil +} + +func (_ *Ctx) Secure() bool { + return false +} + +func (_ *Ctx) Send(_ []byte) error { + return nil +} + +func (_ *Ctx) SendFile(_ string, _ ...bool) error { + return nil +} + +func (_ *Ctx) SendStatus(_ int) error { + return nil +} + +func (_ *Ctx) SendStream(_ io.Reader, _ ...int) error { + return nil +} + +func (_ *Ctx) SendString(_ string) error { + return nil +} + +func (_ *Ctx) Set(_ string, _ string) {} + +func (_ *Ctx) SetUserContext(_ context.Context) {} + +func (_ *Ctx) Stale() bool { + return false +} + +func (_ *Ctx) Status(_ int) *Ctx { + return nil +} + +func (_ *Ctx) String() string { + return "" +} + +func (_ *Ctx) Subdomains(_ ...int) []string { + return nil +} + +func (_ *Ctx) Type(_ string, _ ...string) *Ctx { + return nil +} + +func (_ *Ctx) UserContext() context.Context { + return nil +} + +func (_ *Ctx) Vary(_ ...string) {} + +func (_ *Ctx) Write(_ []byte) (int, error) { + return 0, nil +} + +func (_ *Ctx) WriteString(_ string) (int, error) { + return 0, nil +} + +func (_ *Ctx) Writef(_ string, _ ...interface{}) (int, error) { + return 0, nil +} + +func (_ *Ctx) XHR() bool { + return false +} + +func (_ *Ctx) XML(_ interface{}) error { + return nil +} + +type FormFile struct { + Fieldname string + Name string + Content []byte +} + +func Get(_ string) *Agent { + return nil +} + +type Group struct { + Prefix string +} + +func (_ *Group) Add(_ string, _ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) All(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Connect(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Delete(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Get(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Group(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Head(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Mount(_ string, _ *App) Router { + return nil +} + +func (_ *Group) Name(_ string) Router { + return nil +} + +func (_ *Group) Options(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Patch(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Post(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Put(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Route(_ string, _ func(Router), _ ...string) Router { + return nil +} + +func (_ *Group) Static(_ string, _ string, _ ...Static) Router { + return nil +} + +func (_ *Group) Trace(_ string, _ ...func(*Ctx) error) Router { + return nil +} + +func (_ *Group) Use(_ ...interface{}) Router { + return nil +} + +type Hooks struct{} + +func (_ *Hooks) OnFork(_ ...func(int) error) {} + +func (_ *Hooks) OnGroup(_ ...func(Group) error) {} + +func (_ *Hooks) OnGroupName(_ ...func(Group) error) {} + +func (_ *Hooks) OnListen(_ ...func(ListenData) error) {} + +func (_ *Hooks) OnMount(_ ...func(*App) error) {} + +func (_ *Hooks) OnName(_ ...func(Route) error) {} + +func (_ *Hooks) OnRoute(_ ...func(Route) error) {} + +func (_ *Hooks) OnShutdown(_ ...func() error) {} + +type ListenData struct { + Host string + Port string + TLS bool +} + +type Map map[string]interface{} + +func New(_ ...Config) *App { + return nil +} + +func Post(_ string) *Agent { + return nil +} + +type Range struct { + Type string + Ranges []RangeSet +} + +type RangeSet struct { + Start int + End int +} + +type Route struct { + Method string + Name string + Path string + Params []string + Handlers []func(*Ctx) error +} + +type Router interface { + Add(_ string, _ string, _ ...func(*Ctx) error) Router + All(_ string, _ ...func(*Ctx) error) Router + Connect(_ string, _ ...func(*Ctx) error) Router + Delete(_ string, _ ...func(*Ctx) error) Router + Get(_ string, _ ...func(*Ctx) error) Router + Group(_ string, _ ...func(*Ctx) error) Router + Head(_ string, _ ...func(*Ctx) error) Router + Mount(_ string, _ *App) Router + Name(_ string) Router + Options(_ string, _ ...func(*Ctx) error) Router + Patch(_ string, _ ...func(*Ctx) error) Router + Post(_ string, _ ...func(*Ctx) error) Router + Put(_ string, _ ...func(*Ctx) error) Router + Route(_ string, _ func(Router), _ ...string) Router + Static(_ string, _ string, _ ...Static) Router + Trace(_ string, _ ...func(*Ctx) error) Router + Use(_ ...interface{}) Router +} + +type Static struct { + Compress bool + ByteRange bool + Browse bool + Download bool + Index string + CacheDuration time.Duration + MaxAge int + ModifyResponse func(*Ctx) error + Next func(*Ctx) bool +} + +type Storage interface { + Close() error + Delete(_ string) error + Get(_ string) ([]byte, error) + Reset() error + Set(_ string, _ []byte, _ time.Duration) error +} + +type TLSHandler struct{} + +func (_ *TLSHandler) GetClientInfo(_ *tls.ClientHelloInfo) (*tls.Certificate, error) { + return nil, nil +} + +type Views interface { + Load() error + Render(_ io.Writer, _ string, _ interface{}, _ ...string) error +} diff --git a/go/ql/test/experimental/CWE-525/vendor/github.com/julienschmidt/httprouter/stub.go b/go/ql/test/experimental/CWE-525/vendor/github.com/julienschmidt/httprouter/stub.go new file mode 100644 index 00000000000..2515bf4fc90 --- /dev/null +++ b/go/ql/test/experimental/CWE-525/vendor/github.com/julienschmidt/httprouter/stub.go @@ -0,0 +1,68 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for github.com/julienschmidt/httprouter, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: github.com/julienschmidt/httprouter (exports: ; functions: New) + +// Package httprouter is a stub of github.com/julienschmidt/httprouter, generated by depstubber. +package httprouter + +import ( + http "net/http" +) + +type Handle func(http.ResponseWriter, *http.Request, Params) + +func New() *Router { + return nil +} + +type Param struct { + Key string + Value string +} + +type Params []Param + +func (_ Params) ByName(_ string) string { + return "" +} + +type Router struct { + RedirectTrailingSlash bool + RedirectFixedPath bool + HandleMethodNotAllowed bool + HandleOPTIONS bool + GlobalOPTIONS http.Handler + NotFound http.Handler + MethodNotAllowed http.Handler + PanicHandler func(http.ResponseWriter, *http.Request, interface{}) +} + +func (_ *Router) DELETE(_ string, _ Handle) {} + +func (_ *Router) GET(_ string, _ Handle) {} + +func (_ *Router) HEAD(_ string, _ Handle) {} + +func (_ *Router) Handle(_ string, _ string, _ Handle) {} + +func (_ *Router) Handler(_ string, _ string, _ http.Handler) {} + +func (_ *Router) HandlerFunc(_ string, _ string, _ http.HandlerFunc) {} + +func (_ *Router) Lookup(_ string, _ string) (Handle, Params, bool) { + return nil, nil, false +} + +func (_ *Router) OPTIONS(_ string, _ Handle) {} + +func (_ *Router) PATCH(_ string, _ Handle) {} + +func (_ *Router) POST(_ string, _ Handle) {} + +func (_ *Router) PUT(_ string, _ Handle) {} + +func (_ *Router) ServeFiles(_ string, _ http.FileSystem) {} + +func (_ *Router) ServeHTTP(_ http.ResponseWriter, _ *http.Request) {} diff --git a/go/ql/test/experimental/CWE-525/vendor/modules.txt b/go/ql/test/experimental/CWE-525/vendor/modules.txt new file mode 100644 index 00000000000..cc5c287610c --- /dev/null +++ b/go/ql/test/experimental/CWE-525/vendor/modules.txt @@ -0,0 +1,42 @@ +# github.com/go-chi/chi/v5 v5.0.10 +## explicit +github.com/go-chi/chi/v5 +# github.com/gofiber/fiber/v2 v2.51.0 +## explicit +github.com/gofiber/fiber/v2 +# github.com/julienschmidt/httprouter v1.3.0 +## explicit +github.com/julienschmidt/httprouter +# github.com/andybalholm/brotli v1.0.5 +## explicit +github.com/andybalholm/brotli +# github.com/google/uuid v1.4.0 +## explicit +github.com/google/uuid +# github.com/klauspost/compress v1.16.7 +## explicit +github.com/klauspost/compress +# github.com/mattn/go-colorable v0.1.13 +## explicit +github.com/mattn/go-colorable +# github.com/mattn/go-isatty v0.0.20 +## explicit +github.com/mattn/go-isatty +# github.com/mattn/go-runewidth v0.0.15 +## explicit +github.com/mattn/go-runewidth +# github.com/rivo/uniseg v0.2.0 +## explicit +github.com/rivo/uniseg +# github.com/valyala/bytebufferpool v1.0.0 +## explicit +github.com/valyala/bytebufferpool +# github.com/valyala/fasthttp v1.50.0 +## explicit +github.com/valyala/fasthttp +# github.com/valyala/tcplisten v1.0.0 +## explicit +github.com/valyala/tcplisten +# golang.org/x/sys v0.14.0 +## explicit +golang.org/x/sys diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.expected b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.ql new file mode 100644 index 00000000000..1b27b27d6dc --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.ql @@ -0,0 +1,3 @@ +import go +import TestUtilities.InlineFlowTest +import DefaultFlowTest diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go new file mode 100644 index 00000000000..b6dedf748b3 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go @@ -0,0 +1,25 @@ +package main + +func source() string { + return "untrusted data" +} + +func sink(any) { +} + +func main() { + var someMap map[string]string = map[string]string{} + someMap["someKey"] = source() + + for _, val := range someMap { + sink(val) // $ hasValueFlow="val" + } +} + +func testLiteral() { + someMap := map[string]string{"someKey": source()} + + for _, val := range someMap { + sink(val) // $ hasValueFlow="val" + } +} diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index 5b3af5e9040..feef49e3308 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -82,7 +82,7 @@ java.net,22,3,24,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,,,,,,,3,24, java.nio,44,,38,,,,,,,,,5,,,,,,,,,,,,,,,38,,,,,,,,,1,,,,,,,,,,,,,,38, java.security,21,,,,,11,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, java.sql,15,1,2,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,9,,,,,,,,1,,,,2, -java.util,47,2,520,,,,,,,,,1,,,,,,,,,,,34,,,,2,,,,5,2,,1,2,,,,,,,,,,,,2,,,46,474 +java.util,47,2,522,,,,,,,,,1,,,,,,,,,,,34,,,,2,,,,5,2,,1,2,,,,,,,,,,,,2,,,46,476 javafx.scene.web,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, javax.activation,2,,7,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,1,,,,,,,,,,,,,,7, javax.crypto,19,,4,,,12,3,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index 3e0edb7dfac..4ff6beeacb7 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -18,10 +18,10 @@ Java framework & library support `Google Guava `_,``com.google.common.*``,,730,43,9,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,, `JSON-java `_,``org.json``,,236,,,,,,, - Java Standard Library,``java.*``,10,735,239,80,,9,,,25 + Java Standard Library,``java.*``,10,737,239,80,,9,,,25 Java extensions,"``javax.*``, ``jakarta.*``",67,688,80,5,4,2,1,1,4 Kotlin Standard Library,``kotlin*``,,1849,16,14,,,,,2 `Spring `_,``org.springframework.*``,38,481,118,5,,28,14,,35 Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.google.gson``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.mongodb``, ``com.opensymphony.xwork2``, ``com.rabbitmq.client``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.text``, ``groovy.util``, ``hudson``, ``io.jsonwebtoken``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.struts.beanvalidation.validation.interceptor``, ``org.apache.struts2``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.hibernate``, ``org.influxdb``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.jooq``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``org.yaml.snakeyaml``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",131,10518,893,124,6,22,18,,209 - Totals,,308,18951,2558,336,16,128,33,1,409 + Totals,,308,18953,2558,336,16,128,33,1,409 diff --git a/java/integration-tests-lib/maven_wrapper_test_utils.py b/java/integration-tests-lib/maven_wrapper_test_utils.py new file mode 100644 index 00000000000..fd3b727ff77 --- /dev/null +++ b/java/integration-tests-lib/maven_wrapper_test_utils.py @@ -0,0 +1,12 @@ +import sys +import os.path + +def check_maven_wrapper_exists(expected_version): + if not os.path.exists(".mvn/wrapper/maven-wrapper.jar"): + print("Maven wrapper jar file expected but not found", file = sys.stderr) + sys.exit(1) + with open(".mvn/wrapper/maven-wrapper.properties", "r") as f: + content = f.read() + if ("apache-maven-%s-" % expected_version) not in content: + print("Expected Maven wrapper to fetch version %s, but actual properties file said:\n\n%s" % (expected_version, content), file = sys.stderr) + sys.exit(1) diff --git a/java/kotlin-extractor/kotlin_plugin_versions.py b/java/kotlin-extractor/kotlin_plugin_versions.py index 72085cba9d8..d385eb9e613 100755 --- a/java/kotlin-extractor/kotlin_plugin_versions.py +++ b/java/kotlin-extractor/kotlin_plugin_versions.py @@ -46,7 +46,7 @@ def version_string_to_version(version): # Version number used by CI. ci_version = '1.9.0' -many_versions = [ '1.5.0', '1.5.10', '1.5.20', '1.5.30', '1.6.0', '1.6.20', '1.7.0', '1.7.20', '1.8.0', '1.9.0-Beta', '1.9.20-Beta', '2.0.0-Beta3', '2.0.255-SNAPSHOT' ] +many_versions = [ '1.5.0', '1.5.10', '1.5.20', '1.5.30', '1.6.0', '1.6.20', '1.7.0', '1.7.20', '1.8.0', '1.9.0-Beta', '1.9.20-Beta', '2.0.0-Beta4', '2.0.255-SNAPSHOT' ] many_versions_versions = [version_string_to_version(v) for v in many_versions] many_versions_versions_asc = sorted(many_versions_versions, key = lambda v: v.toTupleWithTag()) diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/IrSymbolInternals.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/IrSymbolInternals.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/IrSymbolInternals.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/IrSymbolInternals.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/JavaBinarySourceElement.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JavaBinarySourceElement.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/JavaBinarySourceElement.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JavaBinarySourceElement.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/JvmDefaultModeEnabled.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JvmDefaultModeEnabled.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/JvmDefaultModeEnabled.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JvmDefaultModeEnabled.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/Psi2Ir.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/Psi2Ir.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/Psi2Ir.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/Psi2Ir.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/parents.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/parents.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/parents.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/parents.kt diff --git a/java/ql/automodel/src/AutomodelEndpointTypes.qll b/java/ql/automodel/src/AutomodelEndpointTypes.qll index e37cc80099f..f4f7bc8eb7b 100644 --- a/java/ql/automodel/src/AutomodelEndpointTypes.qll +++ b/java/ql/automodel/src/AutomodelEndpointTypes.qll @@ -50,6 +50,26 @@ class CommandInjectionSinkType extends SinkType { CommandInjectionSinkType() { this = "command-injection" } } +/** A sink relevant to file storage. */ +class FileContentStoreSinkType extends SinkType { + FileContentStoreSinkType() { this = "file-content-store" } +} + +/** A sink relevant to HTML injection. */ +class HtmlInjectionSinkType extends SinkType { + HtmlInjectionSinkType() { this = "html-injection" } +} + +/** A sink relevant to LDAP injection. */ +class LdapInjectionSinkType extends SinkType { + LdapInjectionSinkType() { this = "ldap-injection" } +} + +/** A sink relevant to URL redirection. */ +class UrlRedirectionSinkType extends SinkType { + UrlRedirectionSinkType() { this = "url-redirection" } +} + /** A class for source types that can be predicted by a classifier. */ abstract class SourceType extends EndpointType { bindingset[this] diff --git a/java/ql/automodel/src/AutomodelJavaUtil.qll b/java/ql/automodel/src/AutomodelJavaUtil.qll index ba42806e953..368fb172483 100644 --- a/java/ql/automodel/src/AutomodelJavaUtil.qll +++ b/java/ql/automodel/src/AutomodelJavaUtil.qll @@ -28,20 +28,7 @@ class DollarAtString extends string { * descriptions. */ predicate isKnownKind(string kind, AutomodelEndpointTypes::EndpointType type) { - kind = "path-injection" and - type instanceof AutomodelEndpointTypes::PathInjectionSinkType - or - kind = "sql-injection" and - type instanceof AutomodelEndpointTypes::SqlInjectionSinkType - or - kind = "request-forgery" and - type instanceof AutomodelEndpointTypes::RequestForgerySinkType - or - kind = "command-injection" and - type instanceof AutomodelEndpointTypes::CommandInjectionSinkType - or - kind = "remote" and - type instanceof AutomodelEndpointTypes::RemoteSourceType + kind = type.getKind() } /** diff --git a/java/ql/automodel/src/CHANGELOG.md b/java/ql/automodel/src/CHANGELOG.md index 4a3c54adb38..c3282c773a9 100644 --- a/java/ql/automodel/src/CHANGELOG.md +++ b/java/ql/automodel/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.17 + +No user-facing changes. + ## 0.0.16 No user-facing changes. diff --git a/java/ql/automodel/src/change-notes/released/0.0.17.md b/java/ql/automodel/src/change-notes/released/0.0.17.md new file mode 100644 index 00000000000..62cc89030a6 --- /dev/null +++ b/java/ql/automodel/src/change-notes/released/0.0.17.md @@ -0,0 +1,3 @@ +## 0.0.17 + +No user-facing changes. diff --git a/java/ql/automodel/src/codeql-pack.release.yml b/java/ql/automodel/src/codeql-pack.release.yml index a49f7be4cff..cbc3d3cd493 100644 --- a/java/ql/automodel/src/codeql-pack.release.yml +++ b/java/ql/automodel/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.16 +lastReleaseVersion: 0.0.17 diff --git a/java/ql/automodel/src/qlpack.yml b/java/ql/automodel/src/qlpack.yml index 655c3da2fc6..59fab0cdcc5 100644 --- a/java/ql/automodel/src/qlpack.yml +++ b/java/ql/automodel/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-automodel-queries -version: 0.0.16 +version: 0.0.17 groups: - java - automodel diff --git a/java/ql/integration-tests/all-platforms/java/buildless-erroneous/ExtractorInformation.expected b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/ExtractorInformation.expected new file mode 100644 index 00000000000..08c21ba9900 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/ExtractorInformation.expected @@ -0,0 +1,20 @@ +| Annotation processors enabled: true | 1 | +| Number of calls with call target | 1 | +| Number of calls with missing call target | 4 | +| Number of diagnostics from CodeQL Java extractor with severity 5 | 10 | +| Number of diagnostics from CodeQL Java extractor with severity 6 | 2 | +| Number of expressions with known type | 1 | +| Number of expressions with unknown type | 6 | +| Number of files | 607 | +| Number of files with extension class | 604 | +| Number of files with extension java | 1 | +| Number of files with extension properties | 1 | +| Number of lines of code | 7 | +| Number of lines of code with extension java | 7 | +| Percentage of calls with call target | 20 | +| Percentage of expressions with known type | 14 | +| Total number of diagnostics from CodeQL Java extractor | 12 | +| Total number of lines | 13 | +| Total number of lines with extension java | 13 | +| Used annotation processor: lombok.launch.AnnotationProcessorHider$AnnotationProcessor | 1 | +| Used annotation processor: lombok.launch.AnnotationProcessorHider$ClaimingProcessor | 1 | diff --git a/java/ql/integration-tests/all-platforms/java/buildless-erroneous/ExtractorInformation.qlref b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/ExtractorInformation.qlref new file mode 100644 index 00000000000..ff57e78a9d7 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/ExtractorInformation.qlref @@ -0,0 +1 @@ +Telemetry/ExtractorInformation.ql \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/java/buildless-erroneous/Test.java b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/Test.java new file mode 100644 index 00000000000..6c2a61c4897 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/Test.java @@ -0,0 +1,13 @@ +import abc.Def; + +public class Test { + + public static void test() { + + Def.someMethod(); + (new Def()).member().chained(); + + } + +} + diff --git a/java/ql/integration-tests/all-platforms/java/buildless-erroneous/diagnostics.expected b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/diagnostics.expected new file mode 100644 index 00000000000..2118edbe296 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/diagnostics.expected @@ -0,0 +1,42 @@ +{ + "markdownMessage": "Because no usable build tool (Gradle, Maven, etc) was found, build scripts could not be queried for guidance about the appropriate JDK version for the code being extracted, or precise dependency information. The default JDK will be used, and external dependencies will be inferred from the Java package names used.", + "severity": "unknown", + "source": { + "extractorName": "java", + "id": "java/autobuilder/buildless/no-build-tool-advice", + "name": "Java buildless mode found no usable build tool" + }, + "visibility": { + "cliSummaryTable": true, + "statusPage": false, + "telemetry": true + } +} +{ + "markdownMessage": "Java buildless mode used the system default JDK.", + "severity": "unknown", + "source": { + "extractorName": "java", + "id": "java/autobuilder/buildless/jdk-system-default", + "name": "Java buildless mode used the system default JDK" + }, + "visibility": { + "cliSummaryTable": true, + "statusPage": false, + "telemetry": true + } +} +{ + "markdownMessage": "Java was extracted in buildless mode. This means that all Java source in the working directory will be scanned, with build tools such as Maven and Gradle only contributing information about external dependencies.", + "severity": "note", + "source": { + "extractorName": "java", + "id": "java/autobuilder/buildless/mode-active", + "name": "Java was extracted in buildless mode" + }, + "visibility": { + "cliSummaryTable": true, + "statusPage": true, + "telemetry": true + } +} diff --git a/java/ql/integration-tests/all-platforms/java/buildless-erroneous/test.py b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/test.py new file mode 100644 index 00000000000..747dd6a82ad --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/buildless-erroneous/test.py @@ -0,0 +1,8 @@ +import sys + +from create_database_utils import * +from diagnostics_test_utils import * + +run_codeql_database_create([], lang="java", extra_env={"CODEQL_EXTRACTOR_JAVA_OPTION_BUILDLESS": "true"}) + +check_diagnostics() diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.gitattributes b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..9527f33d801 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/force_sequential_test_execution b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/force_sequential_test_execution new file mode 100644 index 00000000000..44bcad8d582 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/force_sequential_test_execution @@ -0,0 +1 @@ +The wrapper downloading a Maven distribution multiple times in parallel is not safe. diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/pom.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/pom.xml new file mode 100644 index 00000000000..ec4aaf128c1 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + com.example + maven-sample + 1.0-SNAPSHOT + + maven-sample + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + exec-maven-plugin + org.codehaus.mojo + 1.1.1 + + + check-maven-version + package + + java + + + + + com.example.App + + + + com.diffplug.spotless + spotless-maven-plugin + 2.19.1 + + + + check + + compile + + + + + + /* FAIL ME */ + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/java/com/example/App.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/java/com/example/App.java new file mode 100644 index 00000000000..c9eec918587 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/java/com/example/App.java @@ -0,0 +1,30 @@ +package com.example; + +import java.util.regex.Pattern; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + String expectedVersion = System.getenv("EXPECT_MAVEN"); + Path mavenHome = Paths.get(System.getProperty("maven.home")).normalize(); + String observedVersion = mavenHome.getFileName().toString(); + if (expectedVersion != null && !expectedVersion.equals(observedVersion)) { + System.err.println("Wrong maven version, expected '" + expectedVersion + "' but got '" + observedVersion + "'" + mavenHome); + System.exit(1); + } + String commandMatcher = System.getenv("EXPECT_COMMAND_REGEX"); + String command = System.getProperty("sun.java.command"); + if (commandMatcher != null && !Pattern.matches(commandMatcher, command)) { + System.err.println("Wrong command line, '" + command + "' does not match '" + commandMatcher + "'"); + System.exit(1); + } + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/my-app.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/my-app.properties new file mode 100644 index 00000000000..e566b49a29a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/my-app.properties @@ -0,0 +1 @@ +version=1.0 diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/page.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/page.xml new file mode 100644 index 00000000000..2bab459cb03 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/page.xml @@ -0,0 +1,8 @@ + + +A sample + + +

    Hello world!

    + + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/struts.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/struts.xml new file mode 100644 index 00000000000..73fc0c6b9cb --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/struts.xml @@ -0,0 +1,4 @@ + + +This is a sample file + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/test/java/com/example/AppTest.java new file mode 100644 index 00000000000..22a94ca6f01 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/test/java/com/example/AppTest.java @@ -0,0 +1,20 @@ +package com.example; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.expected b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.expected new file mode 100644 index 00000000000..dd77a3fab0a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.expected @@ -0,0 +1,16 @@ +#select +| src/main/java/com/example/App.java:0:0:0:0 | App | +| src/test/java/com/example/AppTest.java:0:0:0:0 | AppTest | +xmlFiles +| pom.xml:0:0:0:0 | pom.xml | +| src/main/resources/page.xml:0:0:0:0 | src/main/resources/page.xml | +| src/main/resources/struts.xml:0:0:0:0 | src/main/resources/struts.xml | +| target/classes/page.xml:0:0:0:0 | target/classes/page.xml | +| target/classes/struts.xml:0:0:0:0 | target/classes/struts.xml | +propertiesFiles +| .mvn/wrapper/maven-wrapper.properties:0:0:0:0 | .mvn/wrapper/maven-wrapper.properties | +| src/main/resources/my-app.properties:0:0:0:0 | src/main/resources/my-app.properties | +| target/classes/my-app.properties:0:0:0:0 | target/classes/my-app.properties | +| target/maven-archiver/pom.properties:0:0:0:0 | target/maven-archiver/pom.properties | +| test-db/log/ext/javac-1.properties:0:0:0:0 | test-db/log/ext/javac-1.properties | +| test-db/log/ext/javac.properties:0:0:0:0 | test-db/log/ext/javac.properties | diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.py b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.py new file mode 100644 index 00000000000..5311b982c2b --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.py @@ -0,0 +1,7 @@ +import sys + +from create_database_utils import * +from maven_wrapper_test_utils import * + +run_codeql_database_create([], lang="java") +check_maven_wrapper_exists("3.9.4") diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.ql b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.ql new file mode 100644 index 00000000000..25cd26fdd14 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.ql @@ -0,0 +1,9 @@ +import java + +from File f +where f.isSourceFile() +select f + +query predicate xmlFiles(XmlFile x) { any() } + +query predicate propertiesFiles(File f) { f.getExtension() = "properties" } diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.gitattributes b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/MavenWrapperDownloader.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000000..732313c4311 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,162 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.util.Properties; + +public final class MavenWrapperDownloader +{ + private static final String WRAPPER_VERSION = "3.1.1"; + + private static final boolean VERBOSE = Boolean.parseBoolean( System.getenv( "MVNW_VERBOSE" ) ); + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/" + WRAPPER_VERSION + + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to use instead of the + * default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main( String[] args ) + { + if ( args.length == 0 ) + { + System.err.println( " - ERROR projectBasedir parameter missing" ); + System.exit( 1 ); + } + + log( " - Downloader started" ); + final String dir = args[0].replace( "..", "" ); // Sanitize path + final Path projectBasedir = Paths.get( dir ).toAbsolutePath().normalize(); + if ( !Files.isDirectory( projectBasedir, LinkOption.NOFOLLOW_LINKS ) ) + { + System.err.println( " - ERROR projectBasedir not exists: " + projectBasedir ); + System.exit( 1 ); + } + + log( " - Using base directory: " + projectBasedir ); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + Path mavenWrapperPropertyFile = projectBasedir.resolve( MAVEN_WRAPPER_PROPERTIES_PATH ); + String url = readWrapperUrl( mavenWrapperPropertyFile ); + + try + { + Path outputFile = projectBasedir.resolve( MAVEN_WRAPPER_JAR_PATH ); + createDirectories( outputFile.getParent() ); + downloadFileFromURL( url, outputFile ); + log( "Done" ); + System.exit( 0 ); + } + catch ( IOException e ) + { + System.err.println( "- Error downloading" ); + e.printStackTrace(); + System.exit( 1 ); + } + } + + private static void downloadFileFromURL( String urlString, Path destination ) throws IOException + { + log( " - Downloading to: " + destination ); + if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( "MVNW_PASSWORD" ) != null ) + { + final String username = System.getenv( "MVNW_USERNAME" ); + final char[] password = System.getenv( "MVNW_PASSWORD" ).toCharArray(); + Authenticator.setDefault( new Authenticator() + { + @Override + protected PasswordAuthentication getPasswordAuthentication() + { + return new PasswordAuthentication( username, password ); + } + } ); + } + URL website = new URL( urlString ); + try ( InputStream inStream = website.openStream() ) { + Files.copy( inStream, destination, StandardCopyOption.REPLACE_EXISTING ); + } + log( " - Downloader complete" ); + } + + private static void createDirectories(Path outputPath) throws IOException + { + if ( !Files.isDirectory( outputPath, LinkOption.NOFOLLOW_LINKS ) ) { + Path createDirectories = Files.createDirectories( outputPath ); + log( " - Directories created: " + createDirectories ); + } + } + + private static String readWrapperUrl( Path mavenWrapperPropertyFile ) + { + String url = DEFAULT_DOWNLOAD_URL; + if ( Files.exists( mavenWrapperPropertyFile, LinkOption.NOFOLLOW_LINKS ) ) + { + log( " - Reading property file: " + mavenWrapperPropertyFile ); + try ( InputStream in = Files.newInputStream( mavenWrapperPropertyFile, StandardOpenOption.READ ) ) + { + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load( in ); + url = mavenWrapperProperties.getProperty( PROPERTY_NAME_WRAPPER_URL, DEFAULT_DOWNLOAD_URL ); + } + catch ( IOException e ) + { + System.err.println( " - ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'" ); + } + } + log( " - Downloading from: " + url ); + return url; + } + + private static void log( String msg ) + { + if ( VERBOSE ) + { + System.out.println( msg ); + } + } + +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..9527f33d801 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/force_sequential_test_execution b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/force_sequential_test_execution new file mode 100644 index 00000000000..44bcad8d582 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/force_sequential_test_execution @@ -0,0 +1 @@ +The wrapper downloading a Maven distribution multiple times in parallel is not safe. diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/pom.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/pom.xml new file mode 100644 index 00000000000..ec4aaf128c1 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + com.example + maven-sample + 1.0-SNAPSHOT + + maven-sample + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + exec-maven-plugin + org.codehaus.mojo + 1.1.1 + + + check-maven-version + package + + java + + + + + com.example.App + + + + com.diffplug.spotless + spotless-maven-plugin + 2.19.1 + + + + check + + compile + + + + + + /* FAIL ME */ + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/java/com/example/App.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/java/com/example/App.java new file mode 100644 index 00000000000..c9eec918587 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/java/com/example/App.java @@ -0,0 +1,30 @@ +package com.example; + +import java.util.regex.Pattern; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + String expectedVersion = System.getenv("EXPECT_MAVEN"); + Path mavenHome = Paths.get(System.getProperty("maven.home")).normalize(); + String observedVersion = mavenHome.getFileName().toString(); + if (expectedVersion != null && !expectedVersion.equals(observedVersion)) { + System.err.println("Wrong maven version, expected '" + expectedVersion + "' but got '" + observedVersion + "'" + mavenHome); + System.exit(1); + } + String commandMatcher = System.getenv("EXPECT_COMMAND_REGEX"); + String command = System.getProperty("sun.java.command"); + if (commandMatcher != null && !Pattern.matches(commandMatcher, command)) { + System.err.println("Wrong command line, '" + command + "' does not match '" + commandMatcher + "'"); + System.exit(1); + } + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/my-app.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/my-app.properties new file mode 100644 index 00000000000..e566b49a29a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/my-app.properties @@ -0,0 +1 @@ +version=1.0 diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/page.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/page.xml new file mode 100644 index 00000000000..2bab459cb03 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/page.xml @@ -0,0 +1,8 @@ + + +A sample + + +

    Hello world!

    + + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/struts.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/struts.xml new file mode 100644 index 00000000000..73fc0c6b9cb --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/struts.xml @@ -0,0 +1,4 @@ + + +This is a sample file + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/test/java/com/example/AppTest.java new file mode 100644 index 00000000000..22a94ca6f01 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/test/java/com/example/AppTest.java @@ -0,0 +1,20 @@ +package com.example; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.expected b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.expected new file mode 100644 index 00000000000..dd77a3fab0a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.expected @@ -0,0 +1,16 @@ +#select +| src/main/java/com/example/App.java:0:0:0:0 | App | +| src/test/java/com/example/AppTest.java:0:0:0:0 | AppTest | +xmlFiles +| pom.xml:0:0:0:0 | pom.xml | +| src/main/resources/page.xml:0:0:0:0 | src/main/resources/page.xml | +| src/main/resources/struts.xml:0:0:0:0 | src/main/resources/struts.xml | +| target/classes/page.xml:0:0:0:0 | target/classes/page.xml | +| target/classes/struts.xml:0:0:0:0 | target/classes/struts.xml | +propertiesFiles +| .mvn/wrapper/maven-wrapper.properties:0:0:0:0 | .mvn/wrapper/maven-wrapper.properties | +| src/main/resources/my-app.properties:0:0:0:0 | src/main/resources/my-app.properties | +| target/classes/my-app.properties:0:0:0:0 | target/classes/my-app.properties | +| target/maven-archiver/pom.properties:0:0:0:0 | target/maven-archiver/pom.properties | +| test-db/log/ext/javac-1.properties:0:0:0:0 | test-db/log/ext/javac-1.properties | +| test-db/log/ext/javac.properties:0:0:0:0 | test-db/log/ext/javac.properties | diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.py b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.py new file mode 100644 index 00000000000..5311b982c2b --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.py @@ -0,0 +1,7 @@ +import sys + +from create_database_utils import * +from maven_wrapper_test_utils import * + +run_codeql_database_create([], lang="java") +check_maven_wrapper_exists("3.9.4") diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.ql b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.ql new file mode 100644 index 00000000000..25cd26fdd14 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.ql @@ -0,0 +1,9 @@ +import java + +from File f +where f.isSourceFile() +select f + +query predicate xmlFiles(XmlFile x) { any() } + +query predicate propertiesFiles(File f) { f.getExtension() = "properties" } diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/.gitattributes b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.jar b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 00000000000..bf82ff01c6c Binary files /dev/null and b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.jar differ diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..9527f33d801 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/force_sequential_test_execution b/java/ql/integration-tests/all-platforms/java/maven-wrapper/force_sequential_test_execution new file mode 100644 index 00000000000..44bcad8d582 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/force_sequential_test_execution @@ -0,0 +1 @@ +The wrapper downloading a Maven distribution multiple times in parallel is not safe. diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/pom.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper/pom.xml new file mode 100644 index 00000000000..ec4aaf128c1 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + com.example + maven-sample + 1.0-SNAPSHOT + + maven-sample + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + exec-maven-plugin + org.codehaus.mojo + 1.1.1 + + + check-maven-version + package + + java + + + + + com.example.App + + + + com.diffplug.spotless + spotless-maven-plugin + 2.19.1 + + + + check + + compile + + + + + + /* FAIL ME */ + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/java/com/example/App.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/java/com/example/App.java new file mode 100644 index 00000000000..c9eec918587 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/java/com/example/App.java @@ -0,0 +1,30 @@ +package com.example; + +import java.util.regex.Pattern; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + String expectedVersion = System.getenv("EXPECT_MAVEN"); + Path mavenHome = Paths.get(System.getProperty("maven.home")).normalize(); + String observedVersion = mavenHome.getFileName().toString(); + if (expectedVersion != null && !expectedVersion.equals(observedVersion)) { + System.err.println("Wrong maven version, expected '" + expectedVersion + "' but got '" + observedVersion + "'" + mavenHome); + System.exit(1); + } + String commandMatcher = System.getenv("EXPECT_COMMAND_REGEX"); + String command = System.getProperty("sun.java.command"); + if (commandMatcher != null && !Pattern.matches(commandMatcher, command)) { + System.err.println("Wrong command line, '" + command + "' does not match '" + commandMatcher + "'"); + System.exit(1); + } + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/my-app.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/my-app.properties new file mode 100644 index 00000000000..e566b49a29a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/my-app.properties @@ -0,0 +1 @@ +version=1.0 diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/page.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/page.xml new file mode 100644 index 00000000000..2bab459cb03 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/page.xml @@ -0,0 +1,8 @@ + + +A sample + + +

    Hello world!

    + + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/struts.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/struts.xml new file mode 100644 index 00000000000..73fc0c6b9cb --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/struts.xml @@ -0,0 +1,4 @@ + + +This is a sample file + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/test/java/com/example/AppTest.java new file mode 100644 index 00000000000..22a94ca6f01 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/test/java/com/example/AppTest.java @@ -0,0 +1,20 @@ +package com.example; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.expected b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.expected new file mode 100644 index 00000000000..dd77a3fab0a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.expected @@ -0,0 +1,16 @@ +#select +| src/main/java/com/example/App.java:0:0:0:0 | App | +| src/test/java/com/example/AppTest.java:0:0:0:0 | AppTest | +xmlFiles +| pom.xml:0:0:0:0 | pom.xml | +| src/main/resources/page.xml:0:0:0:0 | src/main/resources/page.xml | +| src/main/resources/struts.xml:0:0:0:0 | src/main/resources/struts.xml | +| target/classes/page.xml:0:0:0:0 | target/classes/page.xml | +| target/classes/struts.xml:0:0:0:0 | target/classes/struts.xml | +propertiesFiles +| .mvn/wrapper/maven-wrapper.properties:0:0:0:0 | .mvn/wrapper/maven-wrapper.properties | +| src/main/resources/my-app.properties:0:0:0:0 | src/main/resources/my-app.properties | +| target/classes/my-app.properties:0:0:0:0 | target/classes/my-app.properties | +| target/maven-archiver/pom.properties:0:0:0:0 | target/maven-archiver/pom.properties | +| test-db/log/ext/javac-1.properties:0:0:0:0 | test-db/log/ext/javac-1.properties | +| test-db/log/ext/javac.properties:0:0:0:0 | test-db/log/ext/javac.properties | diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.py b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.py new file mode 100644 index 00000000000..5311b982c2b --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.py @@ -0,0 +1,7 @@ +import sys + +from create_database_utils import * +from maven_wrapper_test_utils import * + +run_codeql_database_create([], lang="java") +check_maven_wrapper_exists("3.9.4") diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.ql b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.ql new file mode 100644 index 00000000000..25cd26fdd14 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.ql @@ -0,0 +1,9 @@ +import java + +from File f +where f.isSourceFile() +select f + +query predicate xmlFiles(XmlFile x) { any() } + +query predicate propertiesFiles(File f) { f.getExtension() = "properties" } 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 index b7d6dd6e972..5e32cd7786e 100644 --- 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 @@ -1,7 +1,12 @@ +| Number of calls with call target | 1 | +| Number of calls with missing call target | 0 | +| Number of expressions with known type | 0 | +| Number of expressions with unknown type | 0 | | 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 | +| Percentage of calls with call target | 100 | | 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_kotlin2/ExtractorInformation.expected b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.expected index b743aae2faf..d00ef5f0ec6 100644 --- 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 @@ -1,7 +1,12 @@ +| Number of calls with call target | 1 | +| Number of calls with missing call target | 0 | +| Number of expressions with known type | 0 | +| Number of expressions with unknown type | 0 | | 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 | +| Percentage of calls with call target | 100 | | Total number of lines | 3 | | Total number of lines with extension kt | 3 | | Uses Kotlin 2: true | 1 | diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index d369cbdc931..2a02ccee6ab 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.8.10 + +### Minor Analysis Improvements + +* Java expressions with erroneous types (e.g. the result of a call whose callee couldn't be resolved during extraction) are now given a CodeQL `ErrorType` more often. + +### Bug Fixes + +* Fixed the Java autobuilder overriding the version of Maven used by a project when the Maven wrapper `mvnw` is in use and the `maven-wrapper.jar` file is not present in the repository. +* Some flow steps related to `android.text.Editable.toString` that were accidentally disabled have been re-enabled. + ## 0.8.9 ### Deprecated APIs diff --git a/java/ql/lib/IDEContextual.qll b/java/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/java/ql/lib/IDEContextual.qll +++ b/java/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/java/ql/lib/change-notes/released/0.8.10.md b/java/ql/lib/change-notes/released/0.8.10.md new file mode 100644 index 00000000000..b45f14bf347 --- /dev/null +++ b/java/ql/lib/change-notes/released/0.8.10.md @@ -0,0 +1,10 @@ +## 0.8.10 + +### Minor Analysis Improvements + +* Java expressions with erroneous types (e.g. the result of a call whose callee couldn't be resolved during extraction) are now given a CodeQL `ErrorType` more often. + +### Bug Fixes + +* Fixed the Java autobuilder overriding the version of Maven used by a project when the Maven wrapper `mvnw` is in use and the `maven-wrapper.jar` file is not present in the repository. +* Some flow steps related to `android.text.Editable.toString` that were accidentally disabled have been re-enabled. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 5290c29b7fe..0521f0f75fa 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.9 +lastReleaseVersion: 0.8.10 diff --git a/java/ql/lib/ext/hudson.model.yml b/java/ql/lib/ext/hudson.model.yml index 791e63daaec..f83a2bae6b3 100644 --- a/java/ql/lib/ext/hudson.model.yml +++ b/java/ql/lib/ext/hudson.model.yml @@ -11,7 +11,7 @@ extensions: - ["hudson", "FilePath", True, "copyFrom", "(FileItem)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "", "", "Argument[this]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(DirScanner,FilePath,String,FilePath$TarCompression)", "", "Argument[1]", "path-injection", "ai-manual"] - - ["hudson", "FilePath", True, "copyRecursiveTo", "(DirScanner,FilePath,String)", "", "Argument[1]", "file-content-store", "ai-manual"] + - ["hudson", "FilePath", True, "copyRecursiveTo", "(DirScanner,FilePath,String)", "", "Argument[1]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(String,FilePath)", "", "Argument[1]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(String,String,FilePath)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(String,String,FilePath)", "", "Argument[2]", "path-injection", "ai-manual"] diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 183ed225303..0569b4c209c 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -218,9 +218,11 @@ extensions: - ["java.lang", "System", "currentTimeMillis", "()", "summary", "manual"] - ["java.lang", "System", "exit", "(int)", "summary", "manual"] - ["java.lang", "System", "getenv", "(String)", "summary", "manual"] + - ["java.lang", "System", "getProperty", "", "summary", "manual"] # needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs - ["java.lang", "System", "identityHashCode", "(Object)", "summary", "manual"] - ["java.lang", "System", "lineSeparator", "()", "summary", "manual"] - ["java.lang", "System", "nanoTime", "()", "summary", "manual"] + - ["java.lang", "System", "setProperty", "", "summary", "manual"] # needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs - ["java.lang", "Thread", "currentThread", "()", "summary", "manual"] - ["java.lang", "Thread", "getContextClassLoader", "()", "summary", "manual"] - ["java.lang", "Thread", "interrupt", "()", "summary", "manual"] diff --git a/java/ql/lib/ext/java.security.model.yml b/java/ql/lib/ext/java.security.model.yml index c01f674b2c8..a50c0b1d3fa 100644 --- a/java/ql/lib/ext/java.security.model.yml +++ b/java/ql/lib/ext/java.security.model.yml @@ -15,3 +15,10 @@ extensions: - ["java.security", "KeyStoreSpi", True, "engineSetKeyEntry", "(String,Key,char[],Certificate[])", "", "Argument[2]", "credentials-password", "hq-generated"] - ["java.security", "KeyStoreSpi", True, "engineStore", "(OutputStream,char[])", "", "Argument[1]", "credentials-password", "hq-generated"] - ["java.security", "KeyStoreSpi", True, "engineSetKeyEntry", "(String,byte[],Certificate[])", "", "Argument[1]", "credentials-key", "hq-generated"] + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.security", "MessageDigest", "digest", "()", "summary", "df-manual"] + - ["java.security", "MessageDigest", "digest", "(byte[])", "summary", "df-manual"] + - ["java.security", "MessageDigest", "digest", "(byte[],int,int)", "summary", "df-manual"] diff --git a/java/ql/lib/ext/java.text.model.yml b/java/ql/lib/ext/java.text.model.yml index 5b315e9986d..16bb2300a98 100644 --- a/java/ql/lib/ext/java.text.model.yml +++ b/java/ql/lib/ext/java.text.model.yml @@ -4,6 +4,9 @@ extensions: extensible: neutralModel data: # summary neutrals + - ["java.text", "Format", "format", "", "summary", "manual"] # similar issue as `Object.toString`; depends on the object being passed as the argument + - ["java.text", "MessageFormat", "format", "", "summary", "manual"] # similar issue as `Object.toString`; depends on the object being passed as the argument + # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.text", "DateFormat", "format", "(Date)", "summary", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index 07eae7c95b4..bd6e58918aa 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -227,6 +227,8 @@ extensions: - ["java.util", "Map", True, "replace", "(Object,Object,Object)", "", "Argument[0]", "Argument[this].MapKey", "value", "manual"] - ["java.util", "Map", True, "replace", "(Object,Object,Object)", "", "Argument[2]", "Argument[this].MapValue", "value", "manual"] - ["java.util", "Map", True, "values", "()", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] + - ["java.util", "Map$Entry", True, "copyOf", "(Map$Entry)", "", "Argument[0].MapKey", "ReturnValue.MapKey", "value", "df-manual"] + - ["java.util", "Map$Entry", True, "copyOf", "(Map$Entry)", "", "Argument[0].MapValue", "ReturnValue.MapValue", "value", "df-manual"] - ["java.util", "Map$Entry", True, "getKey", "", "", "Argument[this].MapKey", "ReturnValue", "value", "manual"] - ["java.util", "Map$Entry", True, "getValue", "", "", "Argument[this].MapValue", "ReturnValue", "value", "manual"] - ["java.util", "Map$Entry", True, "setValue", "", "", "Argument[this].MapValue", "ReturnValue", "value", "manual"] @@ -415,6 +417,7 @@ extensions: - ["java.util", "ArrayList", "ArrayList", "(int)", "summary", "manual"] - ["java.util", "ArrayList", "isEmpty", "()", "summary", "manual"] - ["java.util", "ArrayList", "size", "()", "summary", "manual"] + - ["java.util", "Arrays", "deepToString", "(Object[])", "summary", "df-manual"] - ["java.util", "Arrays", "toString", "(Object[])", "summary", "manual"] - ["java.util", "Calendar", "getInstance", "()", "summary", "manual"] - ["java.util", "Collection", "contains", "(Object)", "summary", "manual"] @@ -454,6 +457,8 @@ extensions: - ["java.util", "Set", "contains", "(Object)", "summary", "manual"] - ["java.util", "Set", "isEmpty", "()", "summary", "manual"] - ["java.util", "Set", "size", "()", "summary", "manual"] + - ["java.util", "TreeMap", "TreeMap", "(Comparator)", "summary", "df-manual"] + - ["java.util", "TreeSet", "TreeSet", "(Comparator)", "summary", "df-manual"] - ["java.util", "UUID", "equals", "(Object)", "summary", "manual"] - ["java.util", "UUID", "fromString", "(String)", "summary", "manual"] - ["java.util", "UUID", "randomUUID", "()", "summary", "manual"] diff --git a/java/ql/lib/ext/java.util.stream.model.yml b/java/ql/lib/ext/java.util.stream.model.yml index 52b32a73587..32438ab1956 100644 --- a/java/ql/lib/ext/java.util.stream.model.yml +++ b/java/ql/lib/ext/java.util.stream.model.yml @@ -92,8 +92,11 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.stream", "Collectors", "joining", "", "summary", "manual"] # cannot be modeled completely without a model for `java.util.stream.Stream#collect(Collector)` as well - ["java.util.stream", "Collectors", "toList", "()", "summary", "manual"] + - ["java.util.stream", "Collectors", "toMap", "", "summary", "manual"] # specialized collectors flow - ["java.util.stream", "Collectors", "toSet", "()", "summary", "manual"] + - ["java.util.stream", "Stream", "collect", "(Collector)", "summary", "manual"] # handled separately on a case-by-case basis as it is too complex for MaD - ["java.util.stream", "Stream", "count", "()", "summary", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. diff --git a/java/ql/lib/ext/javax.crypto.model.yml b/java/ql/lib/ext/javax.crypto.model.yml index b001017b256..9c909320344 100644 --- a/java/ql/lib/ext/javax.crypto.model.yml +++ b/java/ql/lib/ext/javax.crypto.model.yml @@ -7,3 +7,20 @@ extensions: - ["javax.crypto", "Cipher", True, "init", "(int,Key,AlgorithmParameterSpec,SecureRandom)", "", "Argument[2]", "encryption-iv", "manual"] - ["javax.crypto", "Cipher", False, "unwrap", "(byte[],String,int)", "", "Argument[0]", "credentials-key", "hq-generated"] - ["javax.crypto", "CipherSpi", True, "engineUnwrap", "(byte[],String,int)", "", "Argument[0]", "credentials-key", "hq-generated"] + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["javax.crypto", "Cipher", "doFinal", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "getAlgorithm", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "getExemptionMechanism", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "getInstance", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "getIV", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "getParameters", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "getProvider", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "init", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "toString", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "unwrap", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "update", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "updateAAD", "", "summary", "manual"] + - ["javax.crypto", "Cipher", "wrap", "", "summary", "manual"] diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index a0f87a259bd..6904d2ca334 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 0.8.9 +version: 0.8.10 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/Expr.qll b/java/ql/lib/semmle/code/java/Expr.qll index 74f37a4a451..3442855a91a 100644 --- a/java/ql/lib/semmle/code/java/Expr.qll +++ b/java/ql/lib/semmle/code/java/Expr.qll @@ -2065,7 +2065,11 @@ class MethodCall extends Expr, Call, @methodaccess { override Stmt getEnclosingStmt() { result = Expr.super.getEnclosingStmt() } /** Gets a printable representation of this expression. */ - override string toString() { result = this.printAccess() } + override string toString() { + if exists(this.getMethod()) + then result = this.printAccess() + else result = "" + } /** Gets a printable representation of this expression. */ string printAccess() { result = this.getMethod().getName() + "(...)" } @@ -2128,13 +2132,19 @@ class TypeAccess extends Expr, Annotatable, @typeaccess { /** Gets the compilation unit in which this type access occurs. */ override CompilationUnit getCompilationUnit() { result = Expr.super.getCompilationUnit() } - /** Gets a printable representation of this expression. */ - override string toString() { + private string toNormalString() { result = this.getQualifier().toString() + "." + this.getType().toString() or not this.hasQualifier() and result = this.getType().toString() } + /** Gets a printable representation of this expression. */ + override string toString() { + if this.getType() instanceof ErrorType + then result = "" + else result = this.toNormalString() + } + override string getAPrimaryQlClass() { result = "TypeAccess" } } diff --git a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll index 1666413db76..ded0606956f 100644 --- a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll @@ -430,6 +430,7 @@ private Element interpretElement0( } /** Gets the source/sink/summary/neutral element corresponding to the supplied parameters. */ +cached Element interpretElement( string package, string type, boolean subtypes, string name, string signature, string ext ) { diff --git a/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll index 2021dcc2bef..773c480b7e7 100644 --- a/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll +++ b/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll @@ -14,6 +14,7 @@ private module Frameworks { private import semmle.code.java.frameworks.android.Intent private import semmle.code.java.frameworks.android.Slice private import semmle.code.java.frameworks.android.SQLite + private import semmle.code.java.frameworks.android.Widget private import semmle.code.java.frameworks.apache.Lang private import semmle.code.java.frameworks.ApacheHttp private import semmle.code.java.frameworks.guava.Guava diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll index b8c86badd4f..12569b4f6c2 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll @@ -59,11 +59,27 @@ private predicate isInternal(CompilationUnit cu) { cu.getPackage().getName().matches("%internal%") } +/** A method relating to lambda flow. */ +private class LambdaFlowMethod extends Method { + LambdaFlowMethod() { + this.hasQualifiedName("java.lang", "Runnable", "run") or + this.hasQualifiedName("java.util", "Comparator", + ["comparing", "comparingDouble", "comparingInt", "comparingLong"]) or + this.hasQualifiedName("java.util.function", "BiConsumer", "accept") or + this.hasQualifiedName("java.util.function", "BiFunction", "apply") or + this.hasQualifiedName("java.util.function", "Consumer", "accept") or + this.hasQualifiedName("java.util.function", "Function", "apply") or + this.hasQualifiedName("java.util.function", "Supplier", "get") + } +} + /** Holds if the given callable is not worth modeling. */ predicate isUninterestingForModels(Callable c) { isInTestFile(c.getCompilationUnit().getFile()) or isInternal(c.getCompilationUnit()) or c instanceof MainMethod or + c instanceof ToStringMethod or + c instanceof LambdaFlowMethod or c instanceof StaticInitializer or exists(FunctionalExpr funcExpr | c = funcExpr.asMethod()) or c.getDeclaringType() instanceof TestLibrary or diff --git a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll index ca725a041d5..4a31dc2568d 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll @@ -1,6 +1,7 @@ /** Definitions for the insecure local authentication query. */ import java +private import semmle.code.java.dataflow.DataFlow /** A base class that is used as a callback for biometric authentication. */ private class AuthenticationCallbackClass extends Class { @@ -40,3 +41,24 @@ class AuthenticationSuccessCallback extends Method { not result = this.getASuperResultUse() } } + +/** A call that sets a parameter for key generation that is insecure for use with biometric authentication. */ +class InsecureBiometricKeyParamCall extends MethodCall { + InsecureBiometricKeyParamCall() { + exists(string name, CompileTimeConstantExpr val | + this.getMethod() + .hasQualifiedName("android.security.keystore", "KeyGenParameterSpec$Builder", name) and + DataFlow::localExprFlow(val, this.getArgument(0)) and + ( + name = ["setUserAuthenticationRequired", "setInvalidatedByBiometricEnrollment"] and + val.getBooleanValue() = false + or + name = "setUserAuthenticationValidityDurationSeconds" and + val.getIntValue() != -1 + ) + ) + } +} + +/** Holds if the application contains an instance of a key being used for local biometric authentication. */ +predicate usesLocalAuth() { exists(AuthenticationSuccessCallback cb | exists(cb.getAResultUse())) } diff --git a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll index 3126b750aaf..c599756a81c 100644 --- a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll +++ b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll @@ -9,7 +9,12 @@ private import semmle.code.java.security.Sanitizers /** A variable that may hold sensitive information, judging by its name. */ class VariableWithSensitiveName extends Variable { - VariableWithSensitiveName() { this.getName().regexpMatch(getCommonSensitiveInfoRegex()) } + VariableWithSensitiveName() { + exists(string name | name = this.getName() | + name.regexpMatch(getCommonSensitiveInfoRegex()) and + not name.regexpMatch("(?i).*null.*") + ) + } } /** A reference to a variable that may hold sensitive information, judging by its name. */ diff --git a/java/ql/lib/semmle/code/java/security/StaticInitializationVectorQuery.qll b/java/ql/lib/semmle/code/java/security/StaticInitializationVectorQuery.qll index ecdc1daaffc..14a8789d4f9 100644 --- a/java/ql/lib/semmle/code/java/security/StaticInitializationVectorQuery.qll +++ b/java/ql/lib/semmle/code/java/security/StaticInitializationVectorQuery.qll @@ -80,18 +80,21 @@ private class ArrayUpdate extends Expr { Expr getArray() { result = array } } -/** - * A config that tracks dataflow from creating an array to an operation that updates it. - */ -private module ArrayUpdateConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { source.asExpr() instanceof StaticByteArrayCreation } - - predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(ArrayUpdate upd).getArray() } - - predicate isBarrierOut(DataFlow::Node node) { isSink(node) } +private predicate arrayUpdateSrc(DataFlow::Node source) { + source.asExpr() instanceof StaticByteArrayCreation } -private module ArrayUpdateFlow = DataFlow::Global; +private predicate arrayUpdateSink(DataFlow::Node sink) { + sink.asExpr() = any(ArrayUpdate upd).getArray() +} + +private module ArrayUpdateFlowFwd = DataFlow::SimpleGlobal; + +private module ArrayUpdateFlow = ArrayUpdateFlowFwd::Graph; + +private predicate arrayReachesUpdate(StaticByteArrayCreation array) { + exists(ArrayUpdateFlow::PathNode src | src.isSource() and src.getNode().asExpr() = array) +} /** * A source that defines an array that doesn't get updated. @@ -99,7 +102,7 @@ private module ArrayUpdateFlow = DataFlow::Global; private class StaticInitializationVectorSource extends DataFlow::Node { StaticInitializationVectorSource() { exists(StaticByteArrayCreation array | array = this.asExpr() | - not ArrayUpdateFlow::flow(DataFlow::exprNode(array), _) and + not arrayReachesUpdate(array) and // Reduce FPs from utility methods that return an empty array in an exceptional case not exists(ReturnStmt ret | array.getADimension().(CompileTimeConstantExpr).getIntValue() = 0 and diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index b0a780b7584..c61275f5ed8 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.8.10 + +### New Queries + +* Added a new query `java/android/insecure-local-key-gen` for finding instances of keys generated for biometric authentication in an insecure way. + +### Minor Analysis Improvements + +* To reduce the number of false positives in the query "Insertion of sensitive information into log files" (`java/sensitive-log`), variables with names that contain "null" (case-insensitively) are no longer considered sources of sensitive information. + ## 0.8.9 ### New Queries @@ -15,7 +25,7 @@ ### Minor Analysis Improvements * The sanitizer for the path injection queries has been improved to handle more cases where `equals` is used to check an exact path match. -* The query `java/unvalidated-url-redirection` now sanitizes results following the same logic as the query `java/ssrf`. URLs the destination of which cannot be externally controlled will not be reported anymore. +* The query `java/unvalidated-url-redirection` now sanitizes results following the same logic as the query `java/ssrf`. URLs where the destination cannot be controlled externally are no longer reported. ## 0.8.8 diff --git a/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql b/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql index c61c5a263e8..9608ec93767 100644 --- a/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql +++ b/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql @@ -40,7 +40,9 @@ predicate contradictoryTypeCheck(Expr e, Variable v, RefType t, RefType sup, Exp requiresInstanceOf(e, ssa.getAUse(), t) and sup = t.getAnAncestor() and instanceOfCheck(cond, ssa.getAUse(), sup) and - cond.(Guard).controls(e.getBasicBlock(), false) + cond.(Guard).controls(e.getBasicBlock(), false) and + not t instanceof ErrorType and + not sup instanceof ErrorType ) } diff --git a/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql b/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql index 0311192740c..bccd1c98da7 100644 --- a/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql +++ b/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql @@ -1,5 +1,5 @@ /** - * @name Exposure of sensitive information to UI text views. + * @name Exposure of sensitive information to UI text views * @id java/android/sensitive-text * @kind path-problem * @description Sensitive information displayed in UI text views should be properly masked. diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp new file mode 100644 index 00000000000..6b3546f85f5 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp @@ -0,0 +1,43 @@ + + + + +

    +Biometric authentication, such as fingerprint recognition, can be used alongside cryptographic keys stored in the Android KeyStore to protect sensitive parts of the application. However, +when a key generated for this purpose has certain parameters set insecurely, an attacker with physical access can bypass the +authentication check using application hooking tools such as Frida. +

    +
    + + +

    +When generating a key for use with biometric authentication, ensure that the following parameters of KeyGenParameterSpec.Builder are set: +

    +
      +
    • setUserAuthenticationRequired should be set to true; otherwise, the key can be used without user authentication.
    • +
    • setInvalidatedByBiometricEnrollment should be set to true (the default); otherwise, an attacker can use the key by enrolling additional biometrics on the device.
    • +
    • setUserAuthenticationValidityDurationSeconds, if used, should be set to -1; otherwise, non-biometric (less secure) credentials can be used to access the key. We recommend using setUserAuthenticationParameters instead to explicitly set both the timeout and the types of credentials that may be used.
    • +
    + +
    + + +

    The following example demonstrates a key that is configured with secure paramaters:

    + + +

    In each of the following cases, a parameter is set insecurely:

    + +
    + + +
  • +WithSecure: How Secure is your Android Keystore Authentication?. +
  • +
  • +Android Developers: KeyGenParameterSpec.Builder. +
  • + +
    + diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql new file mode 100644 index 00000000000..52aaf8d885d --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql @@ -0,0 +1,18 @@ +/** + * @name Insecurely generated keys for local authentication + * @description Generation of keys with insecure parameters for local biometric authentication can allow attackers with physical access to bypass authentication checks. + * @kind problem + * @problem.severity warning + * @security-severity 4.4 + * @precision medium + * @id java/android/insecure-local-key-gen + * @tags security + * external/cwe/cwe-287 + */ + +import java +import semmle.code.java.security.AndroidLocalAuthQuery + +from InsecureBiometricKeyParamCall call +where usesLocalAuth() +select call, "This key is not secure for biometric authentication." diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysBad.java b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysBad.java new file mode 100644 index 00000000000..deb14d7a5e7 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysBad.java @@ -0,0 +1,47 @@ +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + // BAD: User authentication is not required to use this key. + .setUserAuthenticationRequired(false) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} + +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + .setUserAuthenticationRequired(true) + // BAD: An attacker can access this key by enrolling additional biometrics. + .setInvalidatedByBiometricEnrollment(false) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} + +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + .setUserAuthenticationRequired(true) + .setInvalidatedByBiometricEnrollment(true) + // BAD: This key can be accessed using non-biometric credentials. + .setUserAuthenticationValidityDurationSeconds(30) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} \ No newline at end of file diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java new file mode 100644 index 00000000000..64f9c94f9ee --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java @@ -0,0 +1,16 @@ +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + // GOOD: Secure parameters are used to generate a key for biometric authentication. + .setUserAuthenticationRequired(true) + .setInvalidatedByBiometricEnrollment(true) + .setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} \ No newline at end of file diff --git a/java/ql/src/Telemetry/ExtractorInformation.ql b/java/ql/src/Telemetry/ExtractorInformation.ql index 24cd705eee7..bb37f4a31d0 100644 --- a/java/ql/src/Telemetry/ExtractorInformation.ql +++ b/java/ql/src/Telemetry/ExtractorInformation.ql @@ -85,6 +85,65 @@ predicate extractorTotalDiagnostics(string key, int value) { ) } +signature module StatsSig { + int getNumberOfOk(); + + int getNumberOfNotOk(); + + string getOkText(); + + string getNotOkText(); +} + +module ReportStats { + predicate numberOfOk(string key, int value) { + value = Stats::getNumberOfOk() and + key = "Number of " + Stats::getOkText() + } + + predicate numberOfNotOk(string key, int value) { + value = Stats::getNumberOfNotOk() and + key = "Number of " + Stats::getNotOkText() + } + + predicate percentageOfOk(string key, float value) { + value = Stats::getNumberOfOk() * 100.0 / (Stats::getNumberOfOk() + Stats::getNumberOfNotOk()) and + key = "Percentage of " + Stats::getOkText() + } +} + +module CallTargetStats implements StatsSig { + int getNumberOfOk() { result = count(Call c | exists(c.getCallee())) } + + int getNumberOfNotOk() { result = count(Call c | not exists(c.getCallee())) } + + string getOkText() { result = "calls with call target" } + + string getNotOkText() { result = "calls with missing call target" } +} + +private class SourceExpr extends Expr { + SourceExpr() { this.getFile().isSourceFile() } +} + +private predicate hasGoodType(Expr e) { + exists(e.getType()) and not e.getType() instanceof ErrorType +} + +module ExprTypeStats implements StatsSig { + int getNumberOfOk() { result = count(SourceExpr e | hasGoodType(e)) } + + int getNumberOfNotOk() { result = count(SourceExpr e | not hasGoodType(e)) } + + string getOkText() { result = "expressions with known type" } + + string getNotOkText() { result = "expressions with unknown type" } +} + +module CallTargetStatsReport = ReportStats; + +module ExprTypeStatsReport = ReportStats; + from string key, int value where not exists(string pattern | extractorInformationSkipKey(pattern) and key.matches(pattern)) and @@ -97,6 +156,12 @@ where totalNumberOfLinesByExtension(key, value) or numberOfLinesOfCodeByExtension(key, value) or extractorDiagnostics(key, value) or - extractorTotalDiagnostics(key, value) + extractorTotalDiagnostics(key, value) or + CallTargetStatsReport::numberOfOk(key, value) or + CallTargetStatsReport::numberOfNotOk(key, value) or + CallTargetStatsReport::percentageOfOk(key, any(float x | value = x.floor())) or + ExprTypeStatsReport::numberOfOk(key, value) or + ExprTypeStatsReport::numberOfNotOk(key, value) or + ExprTypeStatsReport::percentageOfOk(key, any(float x | value = x.floor())) ) select key, value diff --git a/java/ql/src/change-notes/released/0.8.10.md b/java/ql/src/change-notes/released/0.8.10.md new file mode 100644 index 00000000000..c5d18ae3379 --- /dev/null +++ b/java/ql/src/change-notes/released/0.8.10.md @@ -0,0 +1,9 @@ +## 0.8.10 + +### New Queries + +* Added a new query `java/android/insecure-local-key-gen` for finding instances of keys generated for biometric authentication in an insecure way. + +### Minor Analysis Improvements + +* To reduce the number of false positives in the query "Insertion of sensitive information into log files" (`java/sensitive-log`), variables with names that contain "null" (case-insensitively) are no longer considered sources of sensitive information. diff --git a/java/ql/src/change-notes/released/0.8.9.md b/java/ql/src/change-notes/released/0.8.9.md index d50b8f5e1c5..ca56541b86e 100644 --- a/java/ql/src/change-notes/released/0.8.9.md +++ b/java/ql/src/change-notes/released/0.8.9.md @@ -15,4 +15,4 @@ ### Minor Analysis Improvements * The sanitizer for the path injection queries has been improved to handle more cases where `equals` is used to check an exact path match. -* The query `java/unvalidated-url-redirection` now sanitizes results following the same logic as the query `java/ssrf`. URLs the destination of which cannot be externally controlled will not be reported anymore. +* The query `java/unvalidated-url-redirection` now sanitizes results following the same logic as the query `java/ssrf`. URLs where the destination cannot be controlled externally are no longer reported. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 5290c29b7fe..0521f0f75fa 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.9 +lastReleaseVersion: 0.8.10 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index c9f04ca70d1..ebbdbeee3b2 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 0.8.9 +version: 0.8.10 groups: - java - queries diff --git a/java/ql/test-kotlin1/library-tests/compilation-units/cus.expected b/java/ql/test-kotlin1/library-tests/compilation-units/cus.expected index a5995ccc419..97b688e8795 100644 --- a/java/ql/test-kotlin1/library-tests/compilation-units/cus.expected +++ b/java/ql/test-kotlin1/library-tests/compilation-units/cus.expected @@ -4,6 +4,8 @@ | ArrayList$ArrayListSpliterator | .../ArrayList$ArrayListSpliterator.class:0:0:0:0 | | List | .../List.class:0:0:0:0 | | ListIterator | .../ListIterator.class:0:0:0:0 | +| MemorySessionImpl$ResourceList | .../MemorySessionImpl$ResourceList.class:0:0:0:0 | +| MemorySessionImpl$ResourceList$ResourceCleanup | .../MemorySessionImpl$ResourceList$ResourceCleanup.class:0:0:0:0 | | MutableList | .../MutableList.class:0:0:0:0 | | MutableListIterator | .../MutableListIterator.class:0:0:0:0 | | test | .../test.kt:0:0:0:0 | diff --git a/java/ql/test-kotlin1/library-tests/enum/test.expected b/java/ql/test-kotlin1/library-tests/enum/test.expected index ca8e735fa18..d279ac89963 100644 --- a/java/ql/test-kotlin1/library-tests/enum/test.expected +++ b/java/ql/test-kotlin1/library-tests/enum/test.expected @@ -37,7 +37,6 @@ | kotlin.Enum | Enum | compareTo | | kotlin.Enum | Enum | describeConstable | | kotlin.Enum | Enum | equals | -| kotlin.Enum | Enum | finalize | | kotlin.Enum | Enum | getDeclaringClass | | kotlin.Enum | Enum | hashCode | | kotlin.Enum | Enum | name | diff --git a/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected index 4ccb82a3d0d..9ad4eeeadc8 100644 --- a/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected +++ b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected @@ -16,6 +16,14 @@ methodWithDuplicate | AbstractCollection | removeAll | Collection | | AbstractCollection | retainAll | Collection | | AbstractCollection | toArray | T[] | +| AbstractCollection | add | Runnable | +| AbstractCollection | addAll | Collection | +| AbstractCollection | contains | Object | +| AbstractCollection | containsAll | Collection | +| AbstractCollection | remove | Object | +| AbstractCollection | removeAll | Collection | +| AbstractCollection | retainAll | Collection | +| AbstractCollection | toArray | T[] | | AbstractCollection | add | String | | AbstractCollection | addAll | Collection | | AbstractCollection | contains | Object | @@ -139,6 +147,17 @@ methodWithDuplicate | Collection | retainAll | Collection | | Collection | toArray | IntFunction | | Collection | toArray | T[] | +| Collection | add | Runnable | +| Collection | addAll | Collection | +| Collection | contains | Object | +| Collection | containsAll | Collection | +| Collection | equals | Object | +| Collection | remove | Object | +| Collection | removeAll | Collection | +| Collection | removeIf | Predicate | +| Collection | retainAll | Collection | +| Collection | toArray | IntFunction | +| Collection | toArray | T[] | | Collection | add | String | | Collection | addAll | Collection | | Collection | contains | Object | @@ -191,6 +210,8 @@ methodWithDuplicate | List | add | int | | List | addAll | Collection | | List | addAll | int | +| List | addFirst | E | +| List | addLast | E | | List | contains | Object | | List | containsAll | Collection | | List | copyOf | Collection | diff --git a/java/ql/test-kotlin1/library-tests/reflection/reflection.expected b/java/ql/test-kotlin1/library-tests/reflection/reflection.expected index d149bd24563..06cc3ca22c8 100644 --- a/java/ql/test-kotlin1/library-tests/reflection/reflection.expected +++ b/java/ql/test-kotlin1/library-tests/reflection/reflection.expected @@ -269,8 +269,15 @@ compGenerated | file:///CharRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | | file:///Class2.class:0:0:0:0 | getValue | Default property accessor | | file:///Class2.class:0:0:0:0 | getValue | Default property accessor | +| file:///EnumEntries.class:0:0:0:0 | addFirst | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | addLast | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | getFirst | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | getLast | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | parallelStream | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | removeFirst | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | removeLast | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | reversed | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | stream | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | toArray | Forwarder for a Kotlin class inheriting an interface default method | diff --git a/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected index 41f235c1efd..b6bbd9e02e9 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected @@ -2933,15 +2933,15 @@ exprs.kt: # 292| 1: [StmtExpr] # 292| 0: [BlockStmt] { ... } # 292| 0: [LocalVariableDeclStmt] var ...; -# 292| 1: [LocalVariableDeclExpr] tmp0 +# 292| 1: [LocalVariableDeclExpr] # 292| 0: [VarAccess] i0 # 292| 1: [ExprStmt] ; # 292| 0: [AssignExpr] ...=... # 292| 0: [VarAccess] i0 # 292| 1: [MethodCall] inc(...) -# 292| -1: [VarAccess] tmp0 +# 292| -1: [VarAccess] # 292| 2: [ExprStmt] ; -# 292| 0: [VarAccess] tmp0 +# 292| 0: [VarAccess] # 293| 7: [ExprStmt] ; # 293| 0: [ImplicitCoercionToUnitExpr] # 293| 0: [TypeAccess] Unit @@ -2960,15 +2960,15 @@ exprs.kt: # 294| 1: [StmtExpr] # 294| 0: [BlockStmt] { ... } # 294| 0: [LocalVariableDeclStmt] var ...; -# 294| 1: [LocalVariableDeclExpr] tmp1 +# 294| 1: [LocalVariableDeclExpr] # 294| 0: [VarAccess] i0 # 294| 1: [ExprStmt] ; # 294| 0: [AssignExpr] ...=... # 294| 0: [VarAccess] i0 # 294| 1: [MethodCall] dec(...) -# 294| -1: [VarAccess] tmp1 +# 294| -1: [VarAccess] # 294| 2: [ExprStmt] ; -# 294| 0: [VarAccess] tmp1 +# 294| 0: [VarAccess] # 295| 9: [ExprStmt] ; # 295| 0: [ImplicitCoercionToUnitExpr] # 295| 0: [TypeAccess] Unit @@ -3028,15 +3028,15 @@ exprs.kt: # 306| 1: [StmtExpr] # 306| 0: [BlockStmt] { ... } # 306| 0: [LocalVariableDeclStmt] var ...; -# 306| 1: [LocalVariableDeclExpr] tmp2 +# 306| 1: [LocalVariableDeclExpr] # 306| 0: [VarAccess] b0 # 306| 1: [ExprStmt] ; # 306| 0: [AssignExpr] ...=... # 306| 0: [VarAccess] b0 # 306| 1: [MethodCall] inc(...) -# 306| -1: [VarAccess] tmp2 +# 306| -1: [VarAccess] # 306| 2: [ExprStmt] ; -# 306| 0: [VarAccess] tmp2 +# 306| 0: [VarAccess] # 307| 20: [ExprStmt] ; # 307| 0: [ImplicitCoercionToUnitExpr] # 307| 0: [TypeAccess] Unit @@ -3055,15 +3055,15 @@ exprs.kt: # 308| 1: [StmtExpr] # 308| 0: [BlockStmt] { ... } # 308| 0: [LocalVariableDeclStmt] var ...; -# 308| 1: [LocalVariableDeclExpr] tmp3 +# 308| 1: [LocalVariableDeclExpr] # 308| 0: [VarAccess] b0 # 308| 1: [ExprStmt] ; # 308| 0: [AssignExpr] ...=... # 308| 0: [VarAccess] b0 # 308| 1: [MethodCall] dec(...) -# 308| -1: [VarAccess] tmp3 +# 308| -1: [VarAccess] # 308| 2: [ExprStmt] ; -# 308| 0: [VarAccess] tmp3 +# 308| 0: [VarAccess] # 309| 22: [ExprStmt] ; # 309| 0: [ImplicitCoercionToUnitExpr] # 309| 0: [TypeAccess] Unit @@ -3123,15 +3123,15 @@ exprs.kt: # 320| 1: [StmtExpr] # 320| 0: [BlockStmt] { ... } # 320| 0: [LocalVariableDeclStmt] var ...; -# 320| 1: [LocalVariableDeclExpr] tmp4 +# 320| 1: [LocalVariableDeclExpr] # 320| 0: [VarAccess] s0 # 320| 1: [ExprStmt] ; # 320| 0: [AssignExpr] ...=... # 320| 0: [VarAccess] s0 # 320| 1: [MethodCall] inc(...) -# 320| -1: [VarAccess] tmp4 +# 320| -1: [VarAccess] # 320| 2: [ExprStmt] ; -# 320| 0: [VarAccess] tmp4 +# 320| 0: [VarAccess] # 321| 33: [ExprStmt] ; # 321| 0: [ImplicitCoercionToUnitExpr] # 321| 0: [TypeAccess] Unit @@ -3150,15 +3150,15 @@ exprs.kt: # 322| 1: [StmtExpr] # 322| 0: [BlockStmt] { ... } # 322| 0: [LocalVariableDeclStmt] var ...; -# 322| 1: [LocalVariableDeclExpr] tmp5 +# 322| 1: [LocalVariableDeclExpr] # 322| 0: [VarAccess] s0 # 322| 1: [ExprStmt] ; # 322| 0: [AssignExpr] ...=... # 322| 0: [VarAccess] s0 # 322| 1: [MethodCall] dec(...) -# 322| -1: [VarAccess] tmp5 +# 322| -1: [VarAccess] # 322| 2: [ExprStmt] ; -# 322| 0: [VarAccess] tmp5 +# 322| 0: [VarAccess] # 323| 35: [ExprStmt] ; # 323| 0: [ImplicitCoercionToUnitExpr] # 323| 0: [TypeAccess] Unit @@ -3218,15 +3218,15 @@ exprs.kt: # 334| 1: [StmtExpr] # 334| 0: [BlockStmt] { ... } # 334| 0: [LocalVariableDeclStmt] var ...; -# 334| 1: [LocalVariableDeclExpr] tmp6 +# 334| 1: [LocalVariableDeclExpr] # 334| 0: [VarAccess] l0 # 334| 1: [ExprStmt] ; # 334| 0: [AssignExpr] ...=... # 334| 0: [VarAccess] l0 # 334| 1: [MethodCall] inc(...) -# 334| -1: [VarAccess] tmp6 +# 334| -1: [VarAccess] # 334| 2: [ExprStmt] ; -# 334| 0: [VarAccess] tmp6 +# 334| 0: [VarAccess] # 335| 46: [ExprStmt] ; # 335| 0: [ImplicitCoercionToUnitExpr] # 335| 0: [TypeAccess] Unit @@ -3245,15 +3245,15 @@ exprs.kt: # 336| 1: [StmtExpr] # 336| 0: [BlockStmt] { ... } # 336| 0: [LocalVariableDeclStmt] var ...; -# 336| 1: [LocalVariableDeclExpr] tmp7 +# 336| 1: [LocalVariableDeclExpr] # 336| 0: [VarAccess] l0 # 336| 1: [ExprStmt] ; # 336| 0: [AssignExpr] ...=... # 336| 0: [VarAccess] l0 # 336| 1: [MethodCall] dec(...) -# 336| -1: [VarAccess] tmp7 +# 336| -1: [VarAccess] # 336| 2: [ExprStmt] ; -# 336| 0: [VarAccess] tmp7 +# 336| 0: [VarAccess] # 337| 48: [ExprStmt] ; # 337| 0: [ImplicitCoercionToUnitExpr] # 337| 0: [TypeAccess] Unit @@ -3358,7 +3358,7 @@ exprs.kt: # 174| 5: [Constructor] Direction # 174| 5: [BlockStmt] { ... } # 174| 0: [ExprStmt] ; -# 174| 0: [ClassInstanceExpr] new Enum(...) +# 174| 0: [ClassInstanceExpr] new Enum(...) # 174| -3: [TypeAccess] Enum # 174| 0: [TypeAccess] Direction # 174| 0: [NullLiteral] null @@ -3381,24 +3381,24 @@ exprs.kt: # 175| 0: [ClassInstanceExpr] new Direction(...) # 175| -3: [TypeAccess] Direction # 178| 7: [Class] Color -# 0| 2: [Method] getEntries -# 0| 3: [TypeAccess] EnumEntries -# 0| 0: [TypeAccess] Color -# 0| 3: [Method] valueOf -# 0| 3: [TypeAccess] Color +# 178| 2: [Method] getEntries +# 178| 3: [TypeAccess] EnumEntries +# 178| 0: [TypeAccess] Color +# 178| 3: [Method] valueOf +# 178| 3: [TypeAccess] Color #-----| 4: (Parameters) -# 0| 0: [Parameter] value -# 0| 0: [TypeAccess] String -# 0| 4: [Method] values -# 0| 3: [TypeAccess] Color[] -# 0| 0: [TypeAccess] Color +# 178| 0: [Parameter] value +# 178| 0: [TypeAccess] String +# 178| 4: [Method] values +# 178| 3: [TypeAccess] Color[] +# 178| 0: [TypeAccess] Color # 178| 5: [Constructor] Color #-----| 4: (Parameters) # 178| 0: [Parameter] rgb # 178| 0: [TypeAccess] int # 178| 5: [BlockStmt] { ... } # 178| 0: [ExprStmt] ; -# 178| 0: [ClassInstanceExpr] new Enum(...) +# 178| 0: [ClassInstanceExpr] new Enum(...) # 178| -3: [TypeAccess] Enum # 178| 0: [TypeAccess] Color # 178| 0: [NullLiteral] null @@ -6080,8 +6080,8 @@ samConversion.kt: # 9| -3: [TypeAccess] Function1 # 9| 0: [TypeAccess] Integer # 9| 1: [TypeAccess] Boolean -# 9| 1: [WhenBranch] ... -> ... -# 9| 0: [BooleanLiteral] true +# 11| 1: [WhenBranch] ... -> ... +# 11| 0: [BooleanLiteral] true # 11| 1: [ExprStmt] ; # 11| 0: [LambdaExpr] ...->... # 11| -4: [AnonymousClass] new Function1(...) { ... } diff --git a/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected index 7141b6d1531..a530d0ee560 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected @@ -1,22 +1,22 @@ delegatedProperties -| delegatedProperties.kt:6:9:9:9 | prop1 | prop1 | local | delegatedProperties.kt:6:24:9:9 | Lazy prop1$delegate | delegatedProperties.kt:6:27:9:9 | lazy(...) | -| delegatedProperties.kt:19:9:19:51 | varResource1 | varResource1 | local | delegatedProperties.kt:19:31:19:51 | ResourceDelegate varResource1$delegate | delegatedProperties.kt:19:34:19:51 | new ResourceDelegate(...) | -| delegatedProperties.kt:23:9:23:31 | name | name | local | delegatedProperties.kt:23:26:23:31 | Map name$delegate | delegatedProperties.kt:23:29:23:31 | map | -| delegatedProperties.kt:33:9:33:76 | readOnly | readOnly | local | delegatedProperties.kt:33:27:33:47 | ReadWriteProperty readOnly$delegate | delegatedProperties.kt:33:30:33:47 | resourceDelegate(...) | -| delegatedProperties.kt:34:9:34:48 | readWrite | readWrite | local | delegatedProperties.kt:34:28:34:48 | ReadWriteProperty readWrite$delegate | delegatedProperties.kt:34:31:34:48 | resourceDelegate(...) | -| delegatedProperties.kt:39:9:39:51 | varResource2 | varResource2 | local | delegatedProperties.kt:39:31:39:51 | ResourceDelegate varResource2$delegate | delegatedProperties.kt:39:31:39:51 | provideDelegate(...) | -| delegatedProperties.kt:42:5:42:47 | varResource0 | varResource0 | non-local | delegatedProperties.kt:42:27:42:47 | varResource0$delegate | delegatedProperties.kt:42:30:42:47 | new ResourceDelegate(...) | -| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedToMember1 | non-local | delegatedProperties.kt:66:33:66:50 | delegatedToMember1$delegate | delegatedProperties.kt:66:36:66:50 | ...::... | -| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedToMember2 | non-local | delegatedProperties.kt:67:33:67:53 | delegatedToMember2$delegate | delegatedProperties.kt:67:36:67:53 | ...::... | -| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedToExtMember1 | non-local | delegatedProperties.kt:69:36:69:56 | delegatedToExtMember1$delegate | delegatedProperties.kt:69:39:69:56 | ...::... | -| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedToExtMember2 | non-local | delegatedProperties.kt:70:36:70:59 | delegatedToExtMember2$delegate | delegatedProperties.kt:70:39:70:59 | ...::... | -| delegatedProperties.kt:72:5:72:56 | delegatedToBaseClass1 | delegatedToBaseClass1 | non-local | delegatedProperties.kt:72:36:72:56 | delegatedToBaseClass1$delegate | delegatedProperties.kt:72:39:72:56 | ...::... | -| delegatedProperties.kt:73:5:73:56 | delegatedToBaseClass2 | delegatedToBaseClass2 | non-local | delegatedProperties.kt:73:36:73:56 | delegatedToBaseClass2$delegate | delegatedProperties.kt:73:39:73:56 | ...::... | -| delegatedProperties.kt:75:5:75:78 | delegatedToAnotherClass1 | delegatedToAnotherClass1 | non-local | delegatedProperties.kt:75:39:75:78 | delegatedToAnotherClass1$delegate | delegatedProperties.kt:75:42:75:78 | ...::... | -| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedToTopLevel | non-local | delegatedProperties.kt:77:34:77:49 | delegatedToTopLevel$delegate | delegatedProperties.kt:77:37:77:49 | ...::... | -| delegatedProperties.kt:79:5:79:38 | max | max | non-local | delegatedProperties.kt:79:18:79:38 | max$delegate | delegatedProperties.kt:79:21:79:38 | ...::... | -| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedToMember3 | local | delegatedProperties.kt:82:37:82:54 | KMutableProperty0 delegatedToMember3$delegate | delegatedProperties.kt:82:40:82:54 | ...::... | -| delegatedProperties.kt:87:1:87:46 | extDelegated | extDelegated | non-local | delegatedProperties.kt:87:31:87:46 | extDelegated$delegateMyClass | delegatedProperties.kt:87:34:87:46 | ...::... | +| delegatedProperties.kt:6:9:9:9 | prop1 | prop1 | local | delegatedProperties.kt:6:9:9:9 | Lazy prop1$delegate | delegatedProperties.kt:6:27:9:9 | lazy(...) | +| delegatedProperties.kt:19:9:19:51 | varResource1 | varResource1 | local | delegatedProperties.kt:19:9:19:51 | ResourceDelegate varResource1$delegate | delegatedProperties.kt:19:34:19:51 | new ResourceDelegate(...) | +| delegatedProperties.kt:23:9:23:31 | name | name | local | delegatedProperties.kt:23:9:23:31 | Map name$delegate | delegatedProperties.kt:23:29:23:31 | map | +| delegatedProperties.kt:33:9:33:76 | readOnly | readOnly | local | delegatedProperties.kt:33:9:33:76 | ReadWriteProperty readOnly$delegate | delegatedProperties.kt:33:30:33:47 | resourceDelegate(...) | +| delegatedProperties.kt:34:9:34:48 | readWrite | readWrite | local | delegatedProperties.kt:34:9:34:48 | ReadWriteProperty readWrite$delegate | delegatedProperties.kt:34:31:34:48 | resourceDelegate(...) | +| delegatedProperties.kt:39:9:39:51 | varResource2 | varResource2 | local | delegatedProperties.kt:39:9:39:51 | ResourceDelegate varResource2$delegate | delegatedProperties.kt:39:34:39:51 | provideDelegate(...) | +| delegatedProperties.kt:42:5:42:47 | varResource0 | varResource0 | non-local | delegatedProperties.kt:42:30:42:47 | varResource0$delegate | delegatedProperties.kt:42:30:42:47 | new ResourceDelegate(...) | +| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedToMember1 | non-local | delegatedProperties.kt:66:36:66:50 | delegatedToMember1$delegate | delegatedProperties.kt:66:36:66:50 | ...::... | +| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedToMember2 | non-local | delegatedProperties.kt:67:36:67:53 | delegatedToMember2$delegate | delegatedProperties.kt:67:36:67:53 | ...::... | +| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedToExtMember1 | non-local | delegatedProperties.kt:69:39:69:56 | delegatedToExtMember1$delegate | delegatedProperties.kt:69:39:69:56 | ...::... | +| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedToExtMember2 | non-local | delegatedProperties.kt:70:39:70:59 | delegatedToExtMember2$delegate | delegatedProperties.kt:70:39:70:59 | ...::... | +| delegatedProperties.kt:72:5:72:56 | delegatedToBaseClass1 | delegatedToBaseClass1 | non-local | delegatedProperties.kt:72:39:72:56 | delegatedToBaseClass1$delegate | delegatedProperties.kt:72:39:72:56 | ...::... | +| delegatedProperties.kt:73:5:73:56 | delegatedToBaseClass2 | delegatedToBaseClass2 | non-local | delegatedProperties.kt:73:39:73:56 | delegatedToBaseClass2$delegate | delegatedProperties.kt:73:39:73:56 | ...::... | +| delegatedProperties.kt:75:5:75:78 | delegatedToAnotherClass1 | delegatedToAnotherClass1 | non-local | delegatedProperties.kt:75:42:75:78 | delegatedToAnotherClass1$delegate | delegatedProperties.kt:75:42:75:78 | ...::... | +| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedToTopLevel | non-local | delegatedProperties.kt:77:37:77:49 | delegatedToTopLevel$delegate | delegatedProperties.kt:77:37:77:49 | ...::... | +| delegatedProperties.kt:79:5:79:38 | max | max | non-local | delegatedProperties.kt:79:21:79:38 | max$delegate | delegatedProperties.kt:79:21:79:38 | ...::... | +| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedToMember3 | local | delegatedProperties.kt:82:9:82:54 | KMutableProperty0 delegatedToMember3$delegate | delegatedProperties.kt:82:40:82:54 | ...::... | +| delegatedProperties.kt:87:1:87:46 | extDelegated | extDelegated | non-local | delegatedProperties.kt:87:34:87:46 | extDelegated$delegateMyClass | delegatedProperties.kt:87:34:87:46 | ...::... | delegatedPropertyTypes | delegatedProperties.kt:6:9:9:9 | prop1 | file://:0:0:0:0 | int | file:///Lazy.class:0:0:0:0 | Lazy | | delegatedProperties.kt:19:9:19:51 | varResource1 | file://:0:0:0:0 | int | delegatedProperties.kt:45:1:51:1 | ResourceDelegate | @@ -37,32 +37,32 @@ delegatedPropertyTypes | delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | file://:0:0:0:0 | int | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | | delegatedProperties.kt:87:1:87:46 | extDelegated | file://:0:0:0:0 | int | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | delegatedPropertyGetters -| delegatedProperties.kt:6:9:9:9 | prop1 | delegatedProperties.kt:6:24:9:9 | | -| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | | -| delegatedProperties.kt:23:9:23:31 | name | delegatedProperties.kt:23:26:23:31 | | -| delegatedProperties.kt:33:9:33:76 | readOnly | delegatedProperties.kt:33:27:33:47 | | -| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | | -| delegatedProperties.kt:39:9:39:51 | varResource2 | delegatedProperties.kt:39:31:39:51 | | -| delegatedProperties.kt:42:5:42:47 | varResource0 | delegatedProperties.kt:42:27:42:47 | getVarResource0 | -| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | -| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | -| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | -| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | -| delegatedProperties.kt:72:5:72:56 | delegatedToBaseClass1 | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | -| delegatedProperties.kt:73:5:73:56 | delegatedToBaseClass2 | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | -| delegatedProperties.kt:75:5:75:78 | delegatedToAnotherClass1 | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | -| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | -| delegatedProperties.kt:79:5:79:38 | max | delegatedProperties.kt:79:18:79:38 | getMax | -| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedProperties.kt:82:37:82:54 | | -| delegatedProperties.kt:87:1:87:46 | extDelegated | delegatedProperties.kt:87:31:87:46 | getExtDelegated | +| delegatedProperties.kt:6:9:9:9 | prop1 | delegatedProperties.kt:6:9:9:9 | | +| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:9:19:51 | | +| delegatedProperties.kt:23:9:23:31 | name | delegatedProperties.kt:23:9:23:31 | | +| delegatedProperties.kt:33:9:33:76 | readOnly | delegatedProperties.kt:33:9:33:76 | | +| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:9:34:48 | | +| delegatedProperties.kt:39:9:39:51 | varResource2 | delegatedProperties.kt:39:9:39:51 | | +| delegatedProperties.kt:42:5:42:47 | varResource0 | delegatedProperties.kt:42:30:42:47 | getVarResource0 | +| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedProperties.kt:66:36:66:50 | getDelegatedToMember1 | +| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedProperties.kt:67:36:67:53 | getDelegatedToMember2 | +| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedProperties.kt:69:39:69:56 | getDelegatedToExtMember1 | +| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedProperties.kt:70:39:70:59 | getDelegatedToExtMember2 | +| delegatedProperties.kt:72:5:72:56 | delegatedToBaseClass1 | delegatedProperties.kt:72:39:72:56 | getDelegatedToBaseClass1 | +| delegatedProperties.kt:73:5:73:56 | delegatedToBaseClass2 | delegatedProperties.kt:73:39:73:56 | getDelegatedToBaseClass2 | +| delegatedProperties.kt:75:5:75:78 | delegatedToAnotherClass1 | delegatedProperties.kt:75:42:75:78 | getDelegatedToAnotherClass1 | +| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedProperties.kt:77:37:77:49 | getDelegatedToTopLevel | +| delegatedProperties.kt:79:5:79:38 | max | delegatedProperties.kt:79:21:79:38 | getMax | +| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedProperties.kt:82:9:82:54 | | +| delegatedProperties.kt:87:1:87:46 | extDelegated | delegatedProperties.kt:87:34:87:46 | getExtDelegated | delegatedPropertySetters -| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | | -| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | | -| delegatedProperties.kt:42:5:42:47 | varResource0 | delegatedProperties.kt:42:27:42:47 | setVarResource0 | -| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | -| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | -| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | -| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | -| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | -| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedProperties.kt:82:37:82:54 | | -| delegatedProperties.kt:87:1:87:46 | extDelegated | delegatedProperties.kt:87:31:87:46 | setExtDelegated | +| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:9:19:51 | | +| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:9:34:48 | | +| delegatedProperties.kt:42:5:42:47 | varResource0 | delegatedProperties.kt:42:5:42:47 | setVarResource0 | +| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedProperties.kt:66:5:66:50 | setDelegatedToMember1 | +| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedProperties.kt:67:5:67:53 | setDelegatedToMember2 | +| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedProperties.kt:69:5:69:56 | setDelegatedToExtMember1 | +| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedProperties.kt:70:5:70:59 | setDelegatedToExtMember2 | +| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedProperties.kt:77:5:77:49 | setDelegatedToTopLevel | +| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedProperties.kt:82:9:82:54 | | +| delegatedProperties.kt:87:1:87:46 | extDelegated | delegatedProperties.kt:87:1:87:46 | setExtDelegated | diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index 4eab44316e1..45d5606d1ac 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -1521,27 +1521,27 @@ | exprs.kt:179:5:179:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:179:5:179:18 | Color | file://:0:0:0:0 | | TypeAccess | | exprs.kt:179:5:179:18 | Color.RED | exprs.kt:0:0:0:0 | | VarAccess | -| exprs.kt:179:5:179:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:179:8:179:17 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | | exprs.kt:179:9:179:16 | 16711680 | exprs.kt:0:0:0:0 | | IntegerLiteral | | exprs.kt:180:5:180:20 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | | exprs.kt:180:5:180:20 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:180:5:180:20 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:180:5:180:20 | Color | file://:0:0:0:0 | | TypeAccess | | exprs.kt:180:5:180:20 | Color.GREEN | exprs.kt:0:0:0:0 | | VarAccess | -| exprs.kt:180:5:180:20 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:180:10:180:19 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | | exprs.kt:180:11:180:18 | 65280 | exprs.kt:0:0:0:0 | | IntegerLiteral | | exprs.kt:181:5:181:18 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | | exprs.kt:181:5:181:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:181:5:181:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:181:5:181:18 | Color | file://:0:0:0:0 | | TypeAccess | | exprs.kt:181:5:181:18 | Color.BLUE | exprs.kt:0:0:0:0 | | VarAccess | -| exprs.kt:181:5:181:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:181:9:181:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | | exprs.kt:181:10:181:17 | 255 | exprs.kt:0:0:0:0 | | IntegerLiteral | | exprs.kt:184:1:187:1 | Unit | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:185:9:185:13 | south | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | +| exprs.kt:185:5:185:31 | south | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | | exprs.kt:185:27:185:31 | Direction | exprs.kt:184:1:187:1 | enums | TypeAccess | | exprs.kt:185:27:185:31 | Direction.SOUTH | exprs.kt:184:1:187:1 | enums | VarAccess | -| exprs.kt:186:9:186:13 | green | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | +| exprs.kt:186:5:186:27 | green | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | | exprs.kt:186:23:186:27 | Color | exprs.kt:184:1:187:1 | enums | TypeAccess | | exprs.kt:186:23:186:27 | Color.GREEN | exprs.kt:184:1:187:1 | enums | VarAccess | | exprs.kt:192:5:192:14 | ...=... | exprs.kt:191:1:199:1 | Class1 | KtInitializerAssignExpr | @@ -1609,16 +1609,16 @@ | exprs.kt:215:13:215:14 | d0 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | | exprs.kt:215:18:215:44 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | | exprs.kt:215:18:215:44 | valueOf(...) | exprs.kt:206:5:217:5 | x | MethodCall | -| exprs.kt:215:38:215:42 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | +| exprs.kt:215:37:215:43 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | | exprs.kt:216:13:216:14 | d1 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | | exprs.kt:216:24:216:39 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | | exprs.kt:216:24:216:39 | valueOf(...) | exprs.kt:206:5:217:5 | x | MethodCall | -| exprs.kt:216:33:216:37 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | +| exprs.kt:216:32:216:38 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | | exprs.kt:220:1:222:1 | Unit | file://:0:0:0:0 | | TypeAccess | | exprs.kt:221:5:221:10 | StandardKt | exprs.kt:220:1:222:1 | todo | TypeAccess | | exprs.kt:221:5:221:10 | TODO(...) | exprs.kt:220:1:222:1 | todo | MethodCall | | exprs.kt:225:1:227:1 | Unit | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:226:9:226:9 | x | exprs.kt:225:1:227:1 | fnClassRef | LocalVariableDeclExpr | +| exprs.kt:226:5:226:29 | x | exprs.kt:225:1:227:1 | fnClassRef | LocalVariableDeclExpr | | exprs.kt:226:13:226:29 | SomeClass1 | exprs.kt:225:1:227:1 | fnClassRef | TypeAccess | | exprs.kt:226:13:226:29 | SomeClass1.class | exprs.kt:225:1:227:1 | fnClassRef | TypeLiteral | | exprs.kt:229:1:250:1 | Unit | file://:0:0:0:0 | | TypeAccess | @@ -1719,23 +1719,23 @@ | exprs.kt:256:30:256:39 | double | file://:0:0:0:0 | | TypeAccess | | exprs.kt:257:18:257:26 | float | file://:0:0:0:0 | | TypeAccess | | exprs.kt:257:29:257:37 | float | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:259:7:259:7 | i | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:259:3:259:15 | i | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:259:11:259:11 | x | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:259:11:259:15 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:259:15:259:15 | y | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:260:7:260:7 | b | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:260:3:260:19 | b | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:260:11:260:13 | byx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:260:11:260:19 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:260:17:260:19 | byy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:261:7:261:7 | l | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:261:3:261:17 | l | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:261:11:261:12 | lx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:261:11:261:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:261:16:261:17 | ly | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:262:7:262:7 | d | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:262:3:262:17 | d | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:262:11:262:12 | dx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:262:11:262:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:262:16:262:17 | dy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:263:7:263:7 | f | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:263:3:263:17 | f | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:263:11:263:12 | fx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:263:11:263:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:263:16:263:17 | fy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | @@ -1757,9 +1757,9 @@ | exprs.kt:274:3:274:9 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | VarAccess | | exprs.kt:274:3:274:14 | ...%=... | exprs.kt:267:1:276:1 | inPlaceOperators | AssignRemExpr | | exprs.kt:274:14:274:14 | 1 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | -| exprs.kt:278:8:278:66 | T | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:278:8:278:66 | T[] | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:278:52:278:66 | | exprs.kt:278:8:278:66 | getEnumValues | ErrorExpr | +| exprs.kt:278:1:278:66 | T | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:278:1:278:66 | T[] | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:278:52:278:66 | | exprs.kt:278:1:278:66 | getEnumValues | ErrorExpr | | exprs.kt:280:1:283:1 | Unit | file://:0:0:0:0 | | TypeAccess | | exprs.kt:281:5:281:23 | | exprs.kt:280:1:283:1 | callToEnumValues | ImplicitCoercionToUnitExpr | | exprs.kt:281:5:281:23 | Color | exprs.kt:280:1:283:1 | callToEnumValues | TypeAccess | @@ -1793,43 +1793,43 @@ | exprs.kt:289:5:289:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:289:5:289:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:289:6:289:6 | d | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:290:9:290:10 | i0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:290:5:290:14 | i0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:290:14:290:14 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | -| exprs.kt:291:9:291:10 | i1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:291:5:291:14 | i1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:291:14:291:14 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | | exprs.kt:292:5:292:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:292:5:292:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:292:5:292:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:292:5:292:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:292:5:292:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:292:5:292:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:293:5:293:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:293:5:293:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:293:5:293:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:293:5:293:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:293:5:293:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:293:7:293:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:293:7:293:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:294:5:294:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:294:5:294:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:294:5:294:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:294:5:294:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:294:5:294:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:295:5:295:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:295:5:295:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:295:5:295:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:295:5:295:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:295:5:295:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:295:7:295:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:295:7:295:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | @@ -1861,43 +1861,43 @@ | exprs.kt:303:5:303:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:303:5:303:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:303:6:303:6 | b | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:304:9:304:10 | b0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:304:5:304:20 | b0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:304:20:304:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | -| exprs.kt:305:9:305:10 | b1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:305:5:305:20 | b1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:305:20:305:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | | exprs.kt:306:5:306:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:306:5:306:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:306:5:306:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:306:5:306:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:306:5:306:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:306:5:306:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:307:5:307:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:307:5:307:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:307:5:307:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:307:5:307:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:307:5:307:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:307:7:307:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:307:7:307:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:308:5:308:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:308:5:308:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:309:5:309:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:309:5:309:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:309:5:309:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:309:5:309:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:309:5:309:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:309:7:309:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:309:7:309:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | @@ -1929,43 +1929,43 @@ | exprs.kt:317:5:317:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:317:5:317:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:317:6:317:6 | s | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:318:9:318:10 | s0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:318:5:318:21 | s0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:318:21:318:21 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | -| exprs.kt:319:9:319:10 | s1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:319:5:319:21 | s1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:319:21:319:21 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | | exprs.kt:320:5:320:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:320:5:320:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:320:5:320:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:320:5:320:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:320:5:320:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:320:5:320:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:321:5:321:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:321:5:321:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:321:5:321:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:321:5:321:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:321:5:321:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:321:7:321:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:321:7:321:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:322:5:322:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:322:5:322:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:322:5:322:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:322:5:322:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:322:5:322:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:323:5:323:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:323:5:323:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:323:5:323:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:323:5:323:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:323:5:323:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:323:7:323:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:323:7:323:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | @@ -1997,43 +1997,43 @@ | exprs.kt:331:5:331:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:331:5:331:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:331:6:331:6 | l | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:332:9:332:10 | l0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:332:5:332:20 | l0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:332:20:332:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | LongLiteral | -| exprs.kt:333:9:333:10 | l1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:333:5:333:20 | l1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:333:20:333:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | LongLiteral | | exprs.kt:334:5:334:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:334:5:334:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:334:5:334:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:334:5:334:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:334:5:334:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:334:5:334:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:335:5:335:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:335:5:335:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:335:5:335:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:335:5:335:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:335:5:335:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:335:7:335:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:335:7:335:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:336:5:336:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:336:5:336:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:336:5:336:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:336:5:336:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:336:5:336:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:337:5:337:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:337:5:337:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:337:5:337:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:337:5:337:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:337:5:337:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:337:7:337:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:337:7:337:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | diff --git a/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected b/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected index 8fef9ecf8ff..a5576a6c083 100644 --- a/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected +++ b/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected @@ -1,8 +1,8 @@ fields | intfDelegate.kt:7:18:9:1 | $$delegate_0 | intfDelegate.kt:7:26:9:1 | | #select +| intfDelegate.kt:0:0:0:0 | f | intfDelegate.kt:7:1:10:1 | Concrete | | intfDelegate.kt:3:3:3:15 | f | intfDelegate.kt:1:1:5:1 | Intf | | intfDelegate.kt:7:1:10:1 | Concrete | intfDelegate.kt:7:1:10:1 | Concrete | -| intfDelegate.kt:7:1:10:1 | f | intfDelegate.kt:7:1:10:1 | Concrete | | intfDelegate.kt:7:26:9:1 | | intfDelegate.kt:7:26:9:1 | new Intf(...) { ... } | | intfDelegate.kt:8:3:8:28 | f | intfDelegate.kt:7:26:9:1 | new Intf(...) { ... } | diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt b/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt deleted file mode 100644 index ba48bc63234..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt +++ /dev/null @@ -1,46 +0,0 @@ -package kotlin - -/* -This is a mini standard library replacement, to make it easy to write -very small tests that create very small databases. - -If you define a class, then you will need to also define any members that -compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt -expects (e.g. with findFunctions(...).first) to exist. -*/ - -public open class Any { - fun toString(): String { return this.toString() } - open operator fun equals(other: Any?): Boolean { return this.equals(other) } -} - -public class String { - operator fun plus(other: Any?): String { return this.plus(other) } -} - -public class Boolean { - operator fun not(): Boolean { return this.not() } -} - -public class Int { - operator fun plus(other: Int): Int { return this.plus(other) } - operator fun times(other: Int): Int { return this.times(other) } - infix fun xor(other: Int): Int { return this.xor(other) } -} - -public object Unit { -} - -// Diagnostic Matches: % Can't find java.lang.Boolean -// Diagnostic Matches: % Can't find java.lang.Byte -// Diagnostic Matches: % Can't find java.lang.Character -// Diagnostic Matches: % Can't find java.lang.Double -// Diagnostic Matches: % Can't find java.lang.Float -// Diagnostic Matches: % Can't find java.lang.Integer -// Diagnostic Matches: % Can't find java.lang.Long -// Diagnostic Matches: % Can't find java.lang.Short -// Diagnostic Matches: % Can't find java.lang.Void -// Diagnostic Matches: % Can't find kotlin.UByte -// Diagnostic Matches: % Can't find kotlin.UInt -// Diagnostic Matches: % Can't find kotlin.ULong -// Diagnostic Matches: % Can't find kotlin.UShort diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt b/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt deleted file mode 100644 index eaa7e450bbb..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt +++ /dev/null @@ -1 +0,0 @@ -class MyClass {} diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected b/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected deleted file mode 100644 index 8d1bc538129..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected +++ /dev/null @@ -1,7 +0,0 @@ -| MiniStdLib.kt:12:1:15:1 | Any | -| MiniStdLib.kt:17:1:19:1 | String | -| MiniStdLib.kt:21:1:23:1 | Boolean | -| MiniStdLib.kt:25:1:29:1 | Int | -| MiniStdLib.kt:31:1:32:1 | Unit | -| MyClass.kt:1:1:1:16 | MyClass | -| file://:0:0:0:0 | FakeKotlinClass | diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql b/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql deleted file mode 100644 index 86c654ea986..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql +++ /dev/null @@ -1,4 +0,0 @@ -import java - -from Class c -select c diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/options b/java/ql/test-kotlin2/library-tests/ministdlib/options deleted file mode 100644 index 052bfdb9a30..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/options +++ /dev/null @@ -1 +0,0 @@ -codeql-extractor-kotlin-options: -no-jdk -no-reflect -no-stdlib -Xallow-kotlin-package diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected index b5bba6fae86..b25e2669eb3 100644 --- a/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected +++ b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected @@ -1,5 +1,5 @@ | file1.kt:4:9:4:23 | fun2(...) | file2.kt:3:5:3:18 | fun2 | Class2.fun2 | file2.kt:2:1:4:1 | Class2 | | file1.kt:5:9:5:14 | fun3(...) | file3.kt:5:1:6:1 | fun3 | MyJvmName.fun3 | file3.kt:0:0:0:0 | MyJvmName | | file1.kt:6:9:6:14 | fun4(...) | file4.kt:4:1:5:1 | fun4 | File4Kt.fun4 | file4.kt:0:0:0:0 | File4Kt | -| file1.kt:11:29:11:56 | toArray(...) | file:///CollectionToArray.class:0:0:0:0 | toArray | kotlin.jvm.internal.CollectionToArray.toArray | file:///CollectionToArray.class:0:0:0:0 | CollectionToArray | -| file1.kt:11:47:11:55 | listOf(...) | file:///CollectionsKt.class:0:0:0:0 | listOf | kotlin.collections.CollectionsKt.listOf | file:///CollectionsKt.class:0:0:0:0 | CollectionsKt | +| file1.kt:11:29:11:56 | toArray(...) | file:///CollectionToArray.class:0:0:0:0 | toArray | kotlin.jvm.internal.CollectionToArray.toArray | file://:0:0:0:0 | CollectionToArray | +| file1.kt:11:47:11:55 | listOf(...) | file:///CollectionsKt.class:0:0:0:0 | listOf | kotlin.collections.CollectionsKt.listOf | file://:0:0:0:0 | CollectionsKt | diff --git a/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected b/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected index b43d88b4531..d22a81210ba 100644 --- a/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected +++ b/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected @@ -12,9 +12,9 @@ test.kt: # 2| 0: [ExprStmt] ; # 2| 0: [ImplicitCoercionToUnitExpr] # 2| 0: [TypeAccess] Unit -# 2| 1: [MethodCall] get(...) -# 2| -1: [VarAccess] arr -# 2| 0: [IntegerLiteral] 1 +# 2| 1: [ArrayAccess] ...[...] +# 2| 0: [VarAccess] arr +# 2| 1: [IntegerLiteral] 1 # 3| 1: [ExprStmt] ; # 3| 0: [ImplicitCoercionToUnitExpr] # 3| 0: [TypeAccess] Unit diff --git a/java/ql/test-kotlin2/library-tests/reflection/reflection.expected b/java/ql/test-kotlin2/library-tests/reflection/reflection.expected index d149bd24563..f6c1aa2151d 100644 --- a/java/ql/test-kotlin2/library-tests/reflection/reflection.expected +++ b/java/ql/test-kotlin2/library-tests/reflection/reflection.expected @@ -1,26 +1,26 @@ variableInitializerType -| reflection.kt:7:13:7:15 | KFunction ref | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:7:49:7:54 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | true | -| reflection.kt:7:13:7:15 | KFunction ref | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:7:49:7:54 | new Function2(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | -| reflection.kt:10:13:10:14 | KProperty1 x0 | file:///KProperty1.class:0:0:0:0 | KProperty1 | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | file:///KProperty1.class:0:0:0:0 | KProperty1 | true | -| reflection.kt:10:13:10:14 | KProperty1 x0 | file:///KProperty1.class:0:0:0:0 | KProperty1 | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | -| reflection.kt:13:13:13:14 | Getter x3 | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///Function1.class:0:0:0:0 | Function1 | true | -| reflection.kt:13:13:13:14 | Getter x3 | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty$Getter.class:0:0:0:0 | Getter | true | -| reflection.kt:14:13:14:14 | KFunction x4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:14:38:14:44 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | true | -| reflection.kt:14:13:14:14 | KFunction x4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:14:38:14:44 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | -| reflection.kt:15:13:15:14 | KProperty0 x5 | file:///KProperty0.class:0:0:0:0 | KProperty0 | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | file:///KProperty0.class:0:0:0:0 | KProperty0 | true | -| reflection.kt:15:13:15:14 | KProperty0 x5 | file:///KProperty0.class:0:0:0:0 | KProperty0 | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | -| reflection.kt:17:13:17:14 | KMutableProperty1 y0 | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | true | -| reflection.kt:17:13:17:14 | KMutableProperty1 y0 | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | -| reflection.kt:20:13:20:14 | Setter y3 | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///Function2.class:0:0:0:0 | Function2 | true | -| reflection.kt:20:13:20:14 | Setter y3 | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty$Setter.class:0:0:0:0 | Setter | true | -| reflection.kt:21:13:21:14 | KFunction y4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:21:44:21:50 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | true | -| reflection.kt:21:13:21:14 | KFunction y4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:21:44:21:50 | new Function2(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | -| reflection.kt:22:13:22:14 | KMutableProperty0 y5 | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | true | -| reflection.kt:22:13:22:14 | KMutableProperty0 y5 | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | -| reflection.kt:24:13:24:16 | KProperty2 prop | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///Function2.class:0:0:0:0 | Function2 | true | -| reflection.kt:24:13:24:16 | KProperty2 prop | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty.class:0:0:0:0 | KProperty | true | -| reflection.kt:116:13:116:13 | KFunction x | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:116:40:116:44 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | true | -| reflection.kt:116:13:116:13 | KFunction x | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:116:40:116:44 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +| reflection.kt:7:9:7:54 | KFunction ref | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:7:49:7:54 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:7:9:7:54 | KFunction ref | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:7:49:7:54 | new Function2(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +| reflection.kt:10:9:10:42 | KProperty1 x0 | file:///KProperty1.class:0:0:0:0 | KProperty1 | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | file:///KProperty1.class:0:0:0:0 | KProperty1 | true | +| reflection.kt:10:9:10:42 | KProperty1 x0 | file:///KProperty1.class:0:0:0:0 | KProperty1 | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:13:9:13:53 | Getter x3 | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///Function1.class:0:0:0:0 | Function1 | true | +| reflection.kt:13:9:13:53 | Getter x3 | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty$Getter.class:0:0:0:0 | Getter | true | +| reflection.kt:14:9:14:44 | KFunction x4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:14:38:14:44 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | true | +| reflection.kt:14:9:14:44 | KFunction x4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:14:38:14:44 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +| reflection.kt:15:9:15:41 | KProperty0 x5 | file:///KProperty0.class:0:0:0:0 | KProperty0 | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | file:///KProperty0.class:0:0:0:0 | KProperty0 | true | +| reflection.kt:15:9:15:41 | KProperty0 x5 | file:///KProperty0.class:0:0:0:0 | KProperty0 | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:17:9:17:49 | KMutableProperty1 y0 | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | true | +| reflection.kt:17:9:17:49 | KMutableProperty1 y0 | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:20:9:20:60 | Setter y3 | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:20:9:20:60 | Setter y3 | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty$Setter.class:0:0:0:0 | Setter | true | +| reflection.kt:21:9:21:50 | KFunction y4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:21:44:21:50 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:21:9:21:50 | KFunction y4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:21:44:21:50 | new Function2(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +| reflection.kt:22:9:22:48 | KMutableProperty0 y5 | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | true | +| reflection.kt:22:9:22:48 | KMutableProperty0 y5 | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:24:9:24:91 | KProperty2 prop | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:24:9:24:91 | KProperty2 prop | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty.class:0:0:0:0 | KProperty | true | +| reflection.kt:116:9:116:44 | KFunction x | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:116:40:116:44 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | true | +| reflection.kt:116:9:116:44 | KFunction x | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:116:40:116:44 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | invocation | reflection.kt:8:17:8:24 | getName(...) | file:///KCallable.class:0:0:0:0 | getName | | reflection.kt:11:23:11:33 | get(...) | file:///KProperty1.class:0:0:0:0 | get | @@ -263,30 +263,70 @@ modifiers | reflection.kt:162:25:162:45 | ...::... | reflection.kt:162:25:162:45 | invoke | override | | reflection.kt:162:25:162:45 | ...::... | reflection.kt:162:25:162:45 | invoke | public | compGenerated +| file:///AccessMode.class:0:0:0:0 | getEntries | Default property accessor | | file:///CharProgression.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///CharProgression.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | | file:///CharRange.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///CharRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///Character$UnicodeScript.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ChronoField.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ChronoUnit.class:0:0:0:0 | getEntries | Default property accessor | | file:///Class2.class:0:0:0:0 | getValue | Default property accessor | | file:///Class2.class:0:0:0:0 | getValue | Default property accessor | +| file:///Collector$Characteristics.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ConstantPool$Tag.class:0:0:0:0 | getEntries | Default property accessor | +| file:///DateTimeFormatterBuilder$SettingsParser.class:0:0:0:0 | getEntries | Default property accessor | +| file:///DayOfWeek.class:0:0:0:0 | getEntries | Default property accessor | +| file:///DirectMethodHandleDesc$Kind.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ElementType.class:0:0:0:0 | getEntries | Default property accessor | | file:///EnumEntries.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | parallelStream | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | stream | Forwarder for a Kotlin class inheriting an interface default method | | file:///EnumEntries.class:0:0:0:0 | toArray | Forwarder for a Kotlin class inheriting an interface default method | +| file:///FormatStyle.class:0:0:0:0 | getEntries | Default property accessor | | file:///IntProgression.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///IntProgression.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | | file:///IntRange.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///IntRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///IsoEra.class:0:0:0:0 | getEntries | Default property accessor | | file:///KTypeProjection.class:0:0:0:0 | contravariant | Proxy static method for a @JvmStatic-annotated function or property | | file:///KTypeProjection.class:0:0:0:0 | copy$default | Forwarder for Kotlin calls that need default arguments filling in | | file:///KTypeProjection.class:0:0:0:0 | covariant | Proxy static method for a @JvmStatic-annotated function or property | | file:///KTypeProjection.class:0:0:0:0 | invariant | Proxy static method for a @JvmStatic-annotated function or property | +| file:///LambdaForm$BasicType.class:0:0:0:0 | getEntries | Default property accessor | +| file:///LambdaForm$Kind.class:0:0:0:0 | getEntries | Default property accessor | +| file:///LinkOption.class:0:0:0:0 | getEntries | Default property accessor | +| file:///Locale$Category.class:0:0:0:0 | getEntries | Default property accessor | +| file:///Locale$FilteringMode.class:0:0:0:0 | getEntries | Default property accessor | +| file:///Locale$IsoCountryCode.class:0:0:0:0 | getEntries | Default property accessor | | file:///LongProgression.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///LongProgression.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | | file:///LongRange.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///LongRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///MethodHandleImpl$ArrayAccess.class:0:0:0:0 | getEntries | Default property accessor | +| file:///MethodHandleImpl$Intrinsic.class:0:0:0:0 | getEntries | Default property accessor | +| file:///MethodHandles$Lookup$ClassOption.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ModuleDescriptor$Exports$Modifier.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ModuleDescriptor$Modifier.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ModuleDescriptor$Opens$Modifier.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ModuleDescriptor$Requires$Modifier.class:0:0:0:0 | getEntries | Default property accessor | +| file:///Month.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ObjectInputFilter$Status.class:0:0:0:0 | getEntries | Default property accessor | +| file:///Proxy$Type.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ResolverStyle.class:0:0:0:0 | getEntries | Default property accessor | +| file:///RetentionPolicy.class:0:0:0:0 | getEntries | Default property accessor | +| file:///SignStyle.class:0:0:0:0 | getEntries | Default property accessor | +| file:///StackWalker$ExtendedOption.class:0:0:0:0 | getEntries | Default property accessor | +| file:///StackWalker$Option.class:0:0:0:0 | getEntries | Default property accessor | | file:///String.class:0:0:0:0 | isEmpty | Forwarder for a Kotlin class inheriting an interface default method | +| file:///TextStyle.class:0:0:0:0 | getEntries | Default property accessor | +| file:///Thread$State.class:0:0:0:0 | getEntries | Default property accessor | +| file:///TimeUnit.class:0:0:0:0 | getEntries | Default property accessor | +| file:///VarHandle$AccessMode.class:0:0:0:0 | getEntries | Default property accessor | +| file:///VarHandle$AccessType.class:0:0:0:0 | getEntries | Default property accessor | +| file:///Wrapper.class:0:0:0:0 | getEntries | Default property accessor | +| file:///ZoneOffsetTransitionRule$TimeDefinition.class:0:0:0:0 | getEntries | Default property accessor | | reflection.kt:7:49:7:54 | new Function2(...) { ... } | The class around a local function, a lambda, or a function reference | | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | The class around a local function, a lambda, or a function reference | | reflection.kt:14:38:14:44 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | @@ -336,7 +376,7 @@ compGenerated | reflection.kt:153:21:153:44 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | | reflection.kt:154:33:154:61 | | Declaring classes of adapter functions in Kotlin | | reflection.kt:154:33:154:61 | new Function2(...) { ... } | The class around a local function, a lambda, or a function reference | -| reflection.kt:157:1:157:49 | ConstructorOptional | Forwarder for Kotlin calls that need default arguments filling in | +| reflection.kt:157:26:157:45 | ConstructorOptional | Forwarder for Kotlin calls that need default arguments filling in | | reflection.kt:162:25:162:45 | | Declaring classes of adapter functions in Kotlin | | reflection.kt:162:25:162:45 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | propertyReferenceOverrides diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected index 456db638dab..f289ad7feb7 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected @@ -1,14 +1,7 @@ | java.lang.Runnable#run() | no manual model | -| java.lang.System#getProperty(String) | no manual model | -| java.lang.System#setProperty(String,String) | no manual model | -| java.text.Format#format(Object) | no manual model | -| java.text.MessageFormat#format(String,Object[]) | no manual model | | java.util.Comparator#comparing(Function) | no manual model | | java.util.function.BiConsumer#accept(Object,Object) | no manual model | | java.util.function.BiFunction#apply(Object,Object) | no manual model | | java.util.function.Consumer#accept(Object) | no manual model | | java.util.function.Function#apply(Object) | no manual model | | java.util.function.Supplier#get() | no manual model | -| java.util.stream.Collectors#joining(CharSequence) | no manual model | -| java.util.stream.Collectors#toMap(Function,Function) | no manual model | -| java.util.stream.Stream#collect(Collector) | no manual model | diff --git a/java/ql/test/library-tests/errorexpr/Test.java b/java/ql/test/library-tests/errorexpr/Test.java index cd18f0564ce..af314e5ced6 100644 --- a/java/ql/test/library-tests/errorexpr/Test.java +++ b/java/ql/test/library-tests/errorexpr/Test.java @@ -15,3 +15,4 @@ public class Test { // Diagnostic Matches: Erroneous node in tree: (ERROR) // Diagnostic Matches: In file Test.java:8:15 no end location for JCMethodInvocation : yield(x) // Diagnostic Matches: 1 errors during annotation processing +// Diagnostic Matches: Unknown or erroneous type for expression of kind ErrorExpr diff --git a/java/ql/test/library-tests/errortype/Diags.expected b/java/ql/test/library-tests/errortype/Diags.expected index 6dd6f1d91a1..c561f5caf8d 100644 --- a/java/ql/test/library-tests/errortype/Diags.expected +++ b/java/ql/test/library-tests/errortype/Diags.expected @@ -1,3 +1,6 @@ | Test.java:0:0:0:0 | 2 javac errors | +| Test.java:6:5:6:15 | Unknown or erroneous type for expression of kind TypeAccess | | Test.java:6:23:6:39 | Unexpected symbol for constructor: new NoSuchClass() | +| Test.java:6:23:6:39 | Unknown or erroneous type for expression of kind ClassInstanceCreation | +| Test.java:6:27:6:37 | Unknown or erroneous type for expression of kind TypeAccess | | file://:0:0:0:0 | 2 errors during annotation processing | diff --git a/java/ql/test/library-tests/errortype/ErrorTypes.expected b/java/ql/test/library-tests/errortype/ErrorTypes.expected index 9214eaa8336..da7029b2ffb 100644 --- a/java/ql/test/library-tests/errortype/ErrorTypes.expected +++ b/java/ql/test/library-tests/errortype/ErrorTypes.expected @@ -1 +1,4 @@ +| Test.java:6:5:6:15 | | +| Test.java:6:23:6:39 | | +| Test.java:6:27:6:37 | | | Test.java:7:12:7:14 | nsc | diff --git a/java/ql/test/library-tests/errortype/PrintAst.expected b/java/ql/test/library-tests/errortype/PrintAst.expected index d0780a453e9..9dab21189dc 100644 --- a/java/ql/test/library-tests/errortype/PrintAst.expected +++ b/java/ql/test/library-tests/errortype/PrintAst.expected @@ -7,9 +7,9 @@ Test.java: # 5| 3: [TypeAccess] NoSuchClass # 5| 5: [BlockStmt] { ... } # 6| 0: [LocalVariableDeclStmt] var ...; -# 6| 0: [TypeAccess] NoSuchClass +# 6| 0: [TypeAccess] # 6| 1: [LocalVariableDeclExpr] nsc # 6| 0: [ClassInstanceExpr] -# 6| -3: [TypeAccess] NoSuchClass +# 6| -3: [TypeAccess] # 7| 1: [ReturnStmt] return ... # 7| 0: [VarAccess] nsc diff --git a/java/ql/test/library-tests/errortype/Test.java b/java/ql/test/library-tests/errortype/Test.java index 25fc6591972..715c7af1afc 100644 --- a/java/ql/test/library-tests/errortype/Test.java +++ b/java/ql/test/library-tests/errortype/Test.java @@ -12,3 +12,5 @@ public class Test { // Diagnostic Matches: Unexpected symbol for constructor: new NoSuchClass() // Diagnostic Matches: 2 javac errors // Diagnostic Matches: 2 errors during annotation processing +// Diagnostic Matches: Unknown or erroneous type for expression of kind TypeAccess +// Diagnostic Matches: Unknown or erroneous type for expression of kind ClassInstanceCreation diff --git a/java/ql/test/library-tests/properties/Properties.expected b/java/ql/test/library-tests/properties/Properties.expected index bcff156d2ae..67e29791efb 100644 --- a/java/ql/test/library-tests/properties/Properties.expected +++ b/java/ql/test/library-tests/properties/Properties.expected @@ -23,3 +23,4 @@ | this | is a new property because the previous line has spaces after the backslash | | thisIsANameNotAValue! | | | with | line\nbreak | +| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | diff --git a/java/ql/test/library-tests/properties/largeKey.properties b/java/ql/test/library-tests/properties/largeKey.properties new file mode 100644 index 00000000000..f2776bdd898 --- /dev/null +++ b/java/ql/test/library-tests/properties/largeKey.properties @@ -0,0 +1 @@ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ No newline at end of file diff --git a/java/ql/test/library-tests/unknown-method-reference-lhs/Diags.expected b/java/ql/test/library-tests/unknown-method-reference-lhs/Diags.expected index c5f9f210946..c9489329f1c 100644 --- a/java/ql/test/library-tests/unknown-method-reference-lhs/Diags.expected +++ b/java/ql/test/library-tests/unknown-method-reference-lhs/Diags.expected @@ -1,2 +1,4 @@ | Test.java:0:0:0:0 | 1 javac errors | | Test.java:4:13:4:30 | Unable to extract method reference Unavailable.f()::g with no owner type | +| Test.java:4:13:4:30 | Unknown or erroneous type for expression of kind MemberReference | +| Test.java:4:13:4:30 | Unknown or erroneous type for expression of kind TypeAccess | diff --git a/java/ql/test/library-tests/unknown-method-reference-lhs/Test.java b/java/ql/test/library-tests/unknown-method-reference-lhs/Test.java index 0d3e46297d7..e2c48e14bd7 100644 --- a/java/ql/test/library-tests/unknown-method-reference-lhs/Test.java +++ b/java/ql/test/library-tests/unknown-method-reference-lhs/Test.java @@ -8,3 +8,5 @@ public class Test { // Diagnostic Matches: 1 javac errors // Diagnostic Matches: Unable to extract method reference Unavailable.f()::g with no owner type +// Diagnostic Matches: Unknown or erroneous type for expression of kind MemberReference +// Diagnostic Matches: Unknown or erroneous type for expression of kind TypeAccess diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected index a092100b6a7..df21c086b2f 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected @@ -1,23 +1,23 @@ | java.awt | 0 | 0 | 2 | 1 | 3 | 0.6666666666666666 | 0.0 | 0.6666666666666666 | 0.0 | NaN | 0.3333333333333333 | -| java.io | 0 | 0 | 22 | 15 | 37 | 0.5945945945945946 | 0.0 | 0.5945945945945946 | 0.0 | NaN | 0.40540540540540543 | -| java.lang | 0 | 0 | 62 | 94 | 156 | 0.3974358974358974 | 0.0 | 0.3974358974358974 | 0.0 | NaN | 0.6025641025641025 | +| java.io | 0 | 0 | 21 | 15 | 36 | 0.5833333333333334 | 0.0 | 0.5833333333333334 | 0.0 | NaN | 0.4166666666666667 | +| java.lang | 0 | 0 | 57 | 88 | 145 | 0.3931034482758621 | 0.0 | 0.3931034482758621 | 0.0 | NaN | 0.6068965517241379 | | java.lang.invoke | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.lang.reflect | 0 | 0 | 0 | 4 | 4 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.math | 0 | 0 | 0 | 16 | 16 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.net | 0 | 0 | 5 | 0 | 5 | 1.0 | 0.0 | 1.0 | 0.0 | NaN | 0.0 | +| java.math | 0 | 0 | 0 | 15 | 15 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | +| java.net | 0 | 0 | 4 | 0 | 4 | 1.0 | 0.0 | 1.0 | 0.0 | NaN | 0.0 | | java.nio | 0 | 0 | 2 | 3 | 5 | 0.4 | 0.0 | 0.4 | 0.0 | NaN | 0.6 | | java.nio.charset | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.nio.file | 0 | 0 | 7 | 1 | 8 | 0.875 | 0.0 | 0.875 | 0.0 | NaN | 0.125 | +| java.nio.file | 0 | 0 | 6 | 1 | 7 | 0.8571428571428571 | 0.0 | 0.8571428571428571 | 0.0 | NaN | 0.14285714285714285 | | java.sql | 0 | 0 | 1 | 15 | 16 | 0.0625 | 0.0 | 0.0625 | 0.0 | NaN | 0.9375 | | java.text | 0 | 0 | 0 | 5 | 5 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time | 0 | 0 | 0 | 17 | 17 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time.chrono | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time.format | 0 | 0 | 0 | 2 | 2 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.util | 0 | 0 | 86 | 66 | 152 | 0.5657894736842105 | 0.0 | 0.5657894736842105 | 0.0 | NaN | 0.4342105263157895 | +| java.util | 0 | 0 | 86 | 64 | 150 | 0.5733333333333334 | 0.0 | 0.5733333333333334 | 0.0 | NaN | 0.4266666666666667 | | java.util.concurrent | 0 | 0 | 9 | 9 | 18 | 0.5 | 0.0 | 0.5 | 0.0 | NaN | 0.5 | | java.util.concurrent.atomic | 0 | 0 | 2 | 11 | 13 | 0.15384615384615385 | 0.0 | 0.15384615384615385 | 0.0 | NaN | 0.8461538461538461 | | java.util.concurrent.locks | 0 | 0 | 0 | 2 | 2 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.util.function | 0 | 0 | 0 | 6 | 6 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | +| java.util.function | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.util.logging | 0 | 0 | 1 | 1 | 2 | 0.5 | 0.0 | 0.5 | 0.0 | NaN | 0.5 | | java.util.regex | 0 | 0 | 3 | 1 | 4 | 0.75 | 0.0 | 0.75 | 0.0 | NaN | 0.25 | | java.util.stream | 0 | 0 | 18 | 8 | 26 | 0.6923076923076923 | 0.0 | 0.6923076923076923 | 0.0 | NaN | 0.3076923076923077 | diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.expected b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.expected rename to java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.ql b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.ql new file mode 100644 index 00000000000..eec3b62dfc2 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.ql @@ -0,0 +1,19 @@ +import java +import TestUtilities.InlineExpectationsTest +import semmle.code.java.dataflow.DataFlow +import semmle.code.java.security.AndroidLocalAuthQuery + +module InsecureKeysTest implements TestSig { + string getARelevantTag() { result = "insecure-key" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "insecure-key" and + exists(InsecureBiometricKeyParamCall call | usesLocalAuth() | + call.getLocation() = location and + element = call.toString() and + value = "" + ) + } +} + +import MakeTest diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java new file mode 100644 index 00000000000..87e973ab774 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java @@ -0,0 +1,39 @@ +import android.security.keystore.KeyGenParameterSpec; +import android.hardware.biometrics.BiometricPrompt; +import android.security.keystore.KeyProperties; +import javax.crypto.KeyGenerator; + +class Test { + void test() { + KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("MySecretKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT); + builder.setUserAuthenticationRequired(false); // $insecure-key + builder.setInvalidatedByBiometricEnrollment(false); // $insecure-key + builder.setUserAuthenticationValidityDurationSeconds(30); // $insecure-key + } + + private void generateSecretKey() throws Exception { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + // GOOD: Secure parameters are used to generate a key for biometric authentication. + .setUserAuthenticationRequired(true) + .setInvalidatedByBiometricEnrollment(true) + .setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); + } +} + +class Callback extends BiometricPrompt.AuthenticationCallback { + public static void useKey(BiometricPrompt.CryptoObject key) {} + + @Override + public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { + useKey(result.getCryptoObject()); + } +} \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/options b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/options new file mode 100644 index 00000000000..7039c596a23 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/google-android-9.0.0 diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected new file mode 100644 index 00000000000..8ec8033d086 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected @@ -0,0 +1,2 @@ +testFailures +failures diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.ql b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.ql new file mode 100644 index 00000000000..eec3b62dfc2 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.ql @@ -0,0 +1,19 @@ +import java +import TestUtilities.InlineExpectationsTest +import semmle.code.java.dataflow.DataFlow +import semmle.code.java.security.AndroidLocalAuthQuery + +module InsecureKeysTest implements TestSig { + string getARelevantTag() { result = "insecure-key" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "insecure-key" and + exists(InsecureBiometricKeyParamCall call | usesLocalAuth() | + call.getLocation() = location and + element = call.toString() and + value = "" + ) + } +} + +import MakeTest diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/Test.java b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/Test.java new file mode 100644 index 00000000000..e65b50da888 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/Test.java @@ -0,0 +1,13 @@ +import android.security.keystore.KeyGenParameterSpec; +import android.hardware.biometrics.BiometricPrompt; +import android.security.keystore.KeyProperties; + +class Test { + void test() { + KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("MySecretKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT); + // No alert as there is no use of biometric authentication in this application. + builder.setUserAuthenticationRequired(false); + builder.setInvalidatedByBiometricEnrollment(false); + builder.setUserAuthenticationValidityDurationSeconds(30); + } +} \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/options b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/options new file mode 100644 index 00000000000..7039c596a23 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/google-android-9.0.0 diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected new file mode 100644 index 00000000000..8ec8033d086 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected @@ -0,0 +1,2 @@ +testFailures +failures diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.ql b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.ql similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.ql rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.ql diff --git a/java/ql/test/query-tests/security/CWE-287/Test.java b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test.java similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/Test.java rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test.java diff --git a/java/ql/test/query-tests/security/CWE-287/Test2.java b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test2.java similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/Test2.java rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test2.java diff --git a/java/ql/test/query-tests/security/CWE-287/options b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/options similarity index 67% rename from java/ql/test/query-tests/security/CWE-287/options rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/options index dacd3cb21df..33cdc1ea940 100644 --- a/java/ql/test/query-tests/security/CWE-287/options +++ b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/google-android-9.0.0 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/google-android-9.0.0 diff --git a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.java b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.java index bdd14b0112d..66991adfa64 100644 --- a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.java +++ b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; +import android.widget.EditText; import androidx.security.crypto.MasterKey; import androidx.security.crypto.EncryptedSharedPreferences; import java.nio.charset.StandardCharsets; @@ -101,4 +102,11 @@ public class CleartextStorageSharedPrefsTest extends Activity { sharedPrefs.edit().putString("name", name).apply(); // Safe sharedPrefs.edit().putString("password", password).apply(); // $hasCleartextStorageSharedPrefs } + + public void testSetSharedPrefs7(Context context, EditText name, EditText password) { + SharedPreferences sharedPrefs = + context.getSharedPreferences("user_prefs", Context.MODE_PRIVATE); + sharedPrefs.edit().putString("name", name.getText().toString()).apply(); // Safe + sharedPrefs.edit().putString("password", password.getText().toString()).apply(); // $hasCleartextStorageSharedPrefs + } } diff --git a/java/ql/test/query-tests/security/CWE-532/Test.java b/java/ql/test/query-tests/security/CWE-532/Test.java index 2f985f0b7bc..f0530a00a83 100644 --- a/java/ql/test/query-tests/security/CWE-532/Test.java +++ b/java/ql/test/query-tests/security/CWE-532/Test.java @@ -19,4 +19,10 @@ class Test { logger.error("Auth failed for: " + username); // Safe } + void test4(String nullToken) { + Logger logger = null; + + logger.error("Auth failed for: " + nullToken); // Safe + } + } diff --git a/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyGenParameterSpec.java b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyGenParameterSpec.java new file mode 100644 index 00000000000..7998d48428e --- /dev/null +++ b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyGenParameterSpec.java @@ -0,0 +1,76 @@ +// Generated automatically from android.security.keystore.KeyGenParameterSpec for testing purposes + +package android.security.keystore; + +import java.math.BigInteger; +import java.security.spec.AlgorithmParameterSpec; +import java.util.Date; +import javax.security.auth.x500.X500Principal; + +public class KeyGenParameterSpec implements AlgorithmParameterSpec +{ + public AlgorithmParameterSpec getAlgorithmParameterSpec(){ return null; } + public BigInteger getCertificateSerialNumber(){ return null; } + public Date getCertificateNotAfter(){ return null; } + public Date getCertificateNotBefore(){ return null; } + public Date getKeyValidityForConsumptionEnd(){ return null; } + public Date getKeyValidityForOriginationEnd(){ return null; } + public Date getKeyValidityStart(){ return null; } + public String getAttestKeyAlias(){ return null; } + public String getKeystoreAlias(){ return null; } + public String[] getBlockModes(){ return null; } + public String[] getDigests(){ return null; } + public String[] getEncryptionPaddings(){ return null; } + public String[] getSignaturePaddings(){ return null; } + public X500Principal getCertificateSubject(){ return null; } + public boolean isDevicePropertiesAttestationIncluded(){ return false; } + public boolean isDigestsSpecified(){ return false; } + public boolean isInvalidatedByBiometricEnrollment(){ return false; } + public boolean isRandomizedEncryptionRequired(){ return false; } + public boolean isStrongBoxBacked(){ return false; } + public boolean isUnlockedDeviceRequired(){ return false; } + public boolean isUserAuthenticationRequired(){ return false; } + public boolean isUserAuthenticationValidWhileOnBody(){ return false; } + public boolean isUserConfirmationRequired(){ return false; } + public boolean isUserPresenceRequired(){ return false; } + public byte[] getAttestationChallenge(){ return null; } + public int getKeySize(){ return 0; } + public int getMaxUsageCount(){ return 0; } + public int getPurposes(){ return 0; } + public int getUserAuthenticationType(){ return 0; } + public int getUserAuthenticationValidityDurationSeconds(){ return 0; } + static public class Builder + { + protected Builder() {} + public Builder(String p0, int p1){} + public KeyGenParameterSpec build(){ return null; } + public KeyGenParameterSpec.Builder setAlgorithmParameterSpec(AlgorithmParameterSpec p0){ return null; } + public KeyGenParameterSpec.Builder setAttestKeyAlias(String p0){ return null; } + public KeyGenParameterSpec.Builder setAttestationChallenge(byte[] p0){ return null; } + public KeyGenParameterSpec.Builder setBlockModes(String... p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateNotAfter(Date p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateNotBefore(Date p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateSerialNumber(BigInteger p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateSubject(X500Principal p0){ return null; } + public KeyGenParameterSpec.Builder setDevicePropertiesAttestationIncluded(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setDigests(String... p0){ return null; } + public KeyGenParameterSpec.Builder setEncryptionPaddings(String... p0){ return null; } + public KeyGenParameterSpec.Builder setInvalidatedByBiometricEnrollment(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setIsStrongBoxBacked(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setKeySize(int p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityEnd(Date p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityForConsumptionEnd(Date p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityForOriginationEnd(Date p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityStart(Date p0){ return null; } + public KeyGenParameterSpec.Builder setMaxUsageCount(int p0){ return null; } + public KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setSignaturePaddings(String... p0){ return null; } + public KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationParameters(int p0, int p1){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int p0){ return null; } + public KeyGenParameterSpec.Builder setUserConfirmationRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserPresenceRequired(boolean p0){ return null; } + } +} diff --git a/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyProperties.java b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyProperties.java new file mode 100644 index 00000000000..b9e7a912698 --- /dev/null +++ b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyProperties.java @@ -0,0 +1,54 @@ +// Generated automatically from android.security.keystore.KeyProperties for testing purposes + +package android.security.keystore; + + +abstract public class KeyProperties +{ + protected KeyProperties() {} + public static String BLOCK_MODE_CBC = null; + public static String BLOCK_MODE_CTR = null; + public static String BLOCK_MODE_ECB = null; + public static String BLOCK_MODE_GCM = null; + public static String DIGEST_MD5 = null; + public static String DIGEST_NONE = null; + public static String DIGEST_SHA1 = null; + public static String DIGEST_SHA224 = null; + public static String DIGEST_SHA256 = null; + public static String DIGEST_SHA384 = null; + public static String DIGEST_SHA512 = null; + public static String ENCRYPTION_PADDING_NONE = null; + public static String ENCRYPTION_PADDING_PKCS7 = null; + public static String ENCRYPTION_PADDING_RSA_OAEP = null; + public static String ENCRYPTION_PADDING_RSA_PKCS1 = null; + public static String KEY_ALGORITHM_3DES = null; + public static String KEY_ALGORITHM_AES = null; + public static String KEY_ALGORITHM_EC = null; + public static String KEY_ALGORITHM_HMAC_SHA1 = null; + public static String KEY_ALGORITHM_HMAC_SHA224 = null; + public static String KEY_ALGORITHM_HMAC_SHA256 = null; + public static String KEY_ALGORITHM_HMAC_SHA384 = null; + public static String KEY_ALGORITHM_HMAC_SHA512 = null; + public static String KEY_ALGORITHM_RSA = null; + public static String SIGNATURE_PADDING_RSA_PKCS1 = null; + public static String SIGNATURE_PADDING_RSA_PSS = null; + public static int AUTH_BIOMETRIC_STRONG = 0; + public static int AUTH_DEVICE_CREDENTIAL = 0; + public static int ORIGIN_GENERATED = 0; + public static int ORIGIN_IMPORTED = 0; + public static int ORIGIN_SECURELY_IMPORTED = 0; + public static int ORIGIN_UNKNOWN = 0; + public static int PURPOSE_AGREE_KEY = 0; + public static int PURPOSE_ATTEST_KEY = 0; + public static int PURPOSE_DECRYPT = 0; + public static int PURPOSE_ENCRYPT = 0; + public static int PURPOSE_SIGN = 0; + public static int PURPOSE_VERIFY = 0; + public static int PURPOSE_WRAP_KEY = 0; + public static int SECURITY_LEVEL_SOFTWARE = 0; + public static int SECURITY_LEVEL_STRONGBOX = 0; + public static int SECURITY_LEVEL_TRUSTED_ENVIRONMENT = 0; + public static int SECURITY_LEVEL_UNKNOWN = 0; + public static int SECURITY_LEVEL_UNKNOWN_SECURE = 0; + public static int UNRESTRICTED_USAGE_COUNT = 0; +} diff --git a/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected b/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected index 014d47f25dd..2654c4d94d6 100644 --- a/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected +++ b/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected @@ -21,7 +21,6 @@ | p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;df-generated | | p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];Argument[this];taint;df-generated | | p;Joiner;false;setEmptyValue;(CharSequence);;Argument[this];ReturnValue;value;df-generated | -| p;Joiner;false;toString;();;Argument[this];ReturnValue;taint;df-generated | | p;MultipleImpl2$IInterface;true;m;(Object);;Argument[0];ReturnValue;taint;df-generated | | p;MultipleImpls$Strat2;true;getValue;();;Argument[this];ReturnValue;taint;df-generated | | p;MultipleImpls$Strategy;true;doSomething;(String);;Argument[0];Argument[this];taint;df-generated | diff --git a/javascript/BUILD.bazel b/javascript/BUILD.bazel index ce1d8b5578a..eacfa554a8e 100644 --- a/javascript/BUILD.bazel +++ b/javascript/BUILD.bazel @@ -1,6 +1,6 @@ -load("@//:dist.bzl", "dist") +load("@semmle_code//:dist.bzl", "dist") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") -load("@//buildutils-internal:zipmerge.bzl", "zipmerge") +load("@semmle_code//buildutils-internal:zipmerge.bzl", "zipmerge") package(default_visibility = ["//visibility:public"]) @@ -30,7 +30,7 @@ dist( "//javascript/downgrades", "//javascript/externs", "//javascript/extractor:tools-extractor", - "@//language-packs/javascript:resources", + "@semmle_code//language-packs/javascript:resources", ], prefix = "javascript", ) diff --git a/javascript/downgrades/BUILD.bazel b/javascript/downgrades/BUILD.bazel index 3e3d9a17d94..3d56c33c359 100644 --- a/javascript/downgrades/BUILD.bazel +++ b/javascript/downgrades/BUILD.bazel @@ -1,4 +1,4 @@ -load("@//:dist.bzl", "pack_zip") +load("@semmle_code//:dist.bzl", "pack_zip") pack_zip( name = "downgrades", diff --git a/javascript/externs/BUILD.bazel b/javascript/externs/BUILD.bazel index 882f90e8d29..233cf242b53 100644 --- a/javascript/externs/BUILD.bazel +++ b/javascript/externs/BUILD.bazel @@ -1,4 +1,4 @@ -load("@//:dist.bzl", "pack_zip") +load("@semmle_code//:dist.bzl", "pack_zip") pack_zip( name = "externs", diff --git a/javascript/extractor/BUILD.bazel b/javascript/extractor/BUILD.bazel index 96a1288da20..6793287c22f 100644 --- a/javascript/extractor/BUILD.bazel +++ b/javascript/extractor/BUILD.bazel @@ -1,21 +1,21 @@ -load("@//:common.bzl", "codeql_fat_jar", "codeql_java_project") +load("@semmle_code//:common.bzl", "codeql_fat_jar", "codeql_java_project") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") java_library( name = "deps", visibility = [":__subpackages__"], exports = [ - "@//extractor:html", - "@//extractor:yaml", - "@//resources/lib/java:commons-compress", - "@//resources/lib/java:gson", - "@//resources/lib/java:jericho-html", - "@//resources/lib/java:slf4j-api", - "@//resources/lib/java:snakeyaml", - "@//third_party:jackson", - "@//third_party:logback", - "@//util-java7", - "@//util-java8", + "@semmle_code//extractor:html", + "@semmle_code//extractor:yaml", + "@semmle_code//resources/lib/java:commons-compress", + "@semmle_code//resources/lib/java:gson", + "@semmle_code//resources/lib/java:jericho-html", + "@semmle_code//resources/lib/java:slf4j-api", + "@semmle_code//resources/lib/java:snakeyaml", + "@semmle_code//third_party:jackson", + "@semmle_code//third_party:logback", + "@semmle_code//util-java7", + "@semmle_code//util-java8", ], ) @@ -26,30 +26,23 @@ codeql_java_project( ], ) -pkg_files( - name = "javascript-extractor-resources", - srcs = glob(["resources/**"]), - strip_prefix = "resources", -) - codeql_fat_jar( name = "extractor-javascript", srcs = [ ":extractor", - "@//extractor:html", - "@//extractor:xml-trap-writer", - "@//extractor:yaml", - "@//resources/lib/java:commons-compress", - "@//resources/lib/java:gson", - "@//resources/lib/java:jericho-html", - "@//resources/lib/java:slf4j-api", - "@//resources/lib/java:snakeyaml", - "@//third_party:jackson", - "@//third_party:logback", - "@//util-java7", - "@//util-java8", + "@semmle_code//extractor:html", + "@semmle_code//extractor:xml-trap-writer", + "@semmle_code//extractor:yaml", + "@semmle_code//resources/lib/java:commons-compress", + "@semmle_code//resources/lib/java:gson", + "@semmle_code//resources/lib/java:jericho-html", + "@semmle_code//resources/lib/java:slf4j-api", + "@semmle_code//resources/lib/java:snakeyaml", + "@semmle_code//third_party:jackson", + "@semmle_code//third_party:logback", + "@semmle_code//util-java7", + "@semmle_code//util-java8", ], - files = [":javascript-extractor-resources"], main_class = "com.semmle.js.extractor.Main", ) diff --git a/javascript/extractor/lib/typescript/BUILD.bazel b/javascript/extractor/lib/typescript/BUILD.bazel index 660514d3de2..904331e4c64 100644 --- a/javascript/extractor/lib/typescript/BUILD.bazel +++ b/javascript/extractor/lib/typescript/BUILD.bazel @@ -1,4 +1,4 @@ -load("@//:common.bzl", "on_windows") +load("@semmle_code//:common.bzl", "on_windows") # Builds a zip file of the compiled typscript-parser-wrapper and its dependencies. genrule( diff --git a/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel b/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel index 4a7a7d8e08c..45d6790e8a9 100644 --- a/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel +++ b/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel @@ -7,15 +7,15 @@ java_test( "//javascript/extractor/tests", "@nodejs//:node_bin", ], - test_class = "com.semmle.js.extractor.test.AllTests", - deps = [ - "//javascript/extractor", - "//javascript/extractor:deps", - "@//resources/lib/java/DO_NOT_DISTRIBUTE:junit", - "@bazel_tools//tools/java/runfiles", - ], env = { "NODE_BIN": "$(rlocationpath @nodejs//:node_bin)", "TS_WRAPPER_ZIP": "$(rlocationpath //javascript/extractor/lib/typescript)", }, + test_class = "com.semmle.js.extractor.test.AllTests", + deps = [ + "//javascript/extractor", + "//javascript/extractor:deps", + "@bazel_tools//tools/java/runfiles", + "@semmle_code//resources/lib/java/DO_NOT_DISTRIBUTE:junit", + ], ) diff --git a/javascript/extractor/tests/project-layout b/javascript/extractor/tests/project-layout index df5e520e9cc..ecee7dfcd40 100644 --- a/javascript/extractor/tests/project-layout +++ b/javascript/extractor/tests/project-layout @@ -1 +1 @@ -**/ql/javascript/extractor/tests/*/input// +**/*ql*/javascript/extractor/tests/*/input// diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 5b97ebbb22b..d5edcc00513 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.10 + +No user-facing changes. + ## 0.8.9 ### Minor Analysis Improvements diff --git a/javascript/ql/lib/IDEContextual.qll b/javascript/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/javascript/ql/lib/IDEContextual.qll +++ b/javascript/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/javascript/ql/lib/change-notes/released/0.8.10.md b/javascript/ql/lib/change-notes/released/0.8.10.md new file mode 100644 index 00000000000..777bbd2fded --- /dev/null +++ b/javascript/ql/lib/change-notes/released/0.8.10.md @@ -0,0 +1,3 @@ +## 0.8.10 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 5290c29b7fe..0521f0f75fa 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.9 +lastReleaseVersion: 0.8.10 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 5e4e545ea4c..da16493a21c 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 0.8.9 +version: 0.8.10 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/lib/semmle/javascript/endpoints/EndpointNaming.qll b/javascript/ql/lib/semmle/javascript/endpoints/EndpointNaming.qll index 257003f5708..eb2fa714a39 100644 --- a/javascript/ql/lib/semmle/javascript/endpoints/EndpointNaming.qll +++ b/javascript/ql/lib/semmle/javascript/endpoints/EndpointNaming.qll @@ -38,22 +38,92 @@ private string join(string x, string y) { private predicate isPackageExport(API::Node node) { node = API::moduleExport(_) } -private predicate memberEdge(API::Node pred, API::Node succ) { succ = pred.getAMember() } - -/** Gets the shortest distance from a packaeg export to `nd` in the API graph. */ -private int distanceFromPackageExport(API::Node nd) = - shortestDistances(isPackageExport/1, memberEdge/2)(_, nd, result) - -private predicate isExported(API::Node node) { - isPackageExport(node) - or - exists(API::Node pred | - isExported(pred) and - memberEdge(pred, node) and - not isPrivateLike(node) +/** + * A version of `getInstance()` only from sink nodes to the special `ClassInstance` node. + * + * This ensures we see instance methods, but not side effects on `this` or on instantiations of the class. + */ +private predicate instanceEdge(API::Node pred, API::Node succ) { + exists(DataFlow::ClassNode cls | + pred.getAValueReachingSink() = cls and + succ = API::Internal::getClassInstance(cls) ) } +/** Holds if `pred -> succ` is an edge we can use for naming. */ +private predicate relevantEdge(API::Node pred, API::Node succ) { + succ = pred.getMember(_) and + not isPrivateLike(succ) + or + instanceEdge(pred, succ) +} + +private signature predicate isRootNodeSig(API::Node node); + +private signature predicate edgeSig(API::Node pred, API::Node succ); + +/** Builds `shortestDistances` using the API graph root node as the only origin node, to ensure unique results. */ +private module ApiGraphDistance { + private predicate edgesWithEntry(API::Node pred, API::Node succ) { + edges(pred, succ) + or + pred = API::root() and + isRootNode(succ) + } + + int distanceTo(API::Node node) = shortestDistances(API::root/0, edgesWithEntry/2)(_, node, result) +} + +/** Gets the shortest distance from a package export to `nd` in the API graph. */ +private predicate distanceFromPackageExport = + ApiGraphDistance::distanceTo/1; + +/** + * Holds if `(package, name)` is the fallback name for `cls`, to be used as a last resort + * in order to name its instance methods. + * + * This happens when the class is not accessible via an access path, but instances of the + * class can still escape via more complex access patterns, for example: + * + * class InternalClass {} + * function foo() { + * return new InternalClass(); + * } + */ +private predicate classHasFallbackName( + DataFlow::ClassNode cls, string package, string name, int badness +) { + hasEscapingInstance(cls) and + not exists(distanceFromPackageExport(any(API::Node node | node.getAValueReachingSink() = cls))) and + exists(string baseName | + InternalModuleNaming::fallbackModuleName(cls.getTopLevel(), package, baseName, badness - 100) and + name = join(baseName, cls.getName()) + ) +} + +/** Holds if `node` describes instances of a class that has a fallback name. */ +private predicate isClassInstanceWithFallbackName(API::Node node) { + exists(DataFlow::ClassNode cls | + classHasFallbackName(cls, _, _, _) and + node = API::Internal::getClassInstance(cls) + ) +} + +/** Gets the shortest distance from a node with a fallback name, to `nd` in the API graph. */ +private predicate distanceFromFallbackName = + ApiGraphDistance::distanceTo/1; + +/** Gets the shortest distance from a name-root (package export or fallback name) to `nd` */ +private int distanceFromRoot(API::Node nd) { + result = distanceFromPackageExport(nd) + or + not exists(distanceFromPackageExport(nd)) and + result = 100 + distanceFromFallbackName(nd) +} + +/** Holds if `node` can be given a name. */ +private predicate isRelevant(API::Node node) { exists(distanceFromRoot(node)) } + /** * Holds if `node` is a default export that can be reinterpreted as a namespace export, * because the enclosing module has no named exports. @@ -79,21 +149,29 @@ private predicate isPrivateAssignment(DataFlow::Node node) { private predicate isPrivateLike(API::Node node) { isPrivateAssignment(node.asSink()) } +bindingset[name] +private int getNameBadness(string name) { + if name = ["constructor", "default"] then result = 10 else result = 0 +} + private API::Node getASuccessor(API::Node node, string name, int badness) { - isExported(node) and - exists(string member | - result = node.getMember(member) and - if member = "default" - then - if defaultExportCanBeInterpretedAsNamespaceExport(node) + isRelevant(node) and + isRelevant(result) and + ( + exists(string member | + result = node.getMember(member) and + if member = "default" and defaultExportCanBeInterpretedAsNamespaceExport(node) then ( badness = 5 and name = "" ) else ( - badness = 10 and name = "default" + name = member and + badness = getNameBadness(name) ) - else ( - name = member and badness = 0 ) + or + instanceEdge(node, result) and + name = "prototype" and + badness = 0 ) } @@ -114,15 +192,17 @@ private API::Node getPreferredPredecessor(API::Node node, string name, int badne min(API::Node pred, int b | pred = getAPredecessor(node, _, b) and // ensure the preferred predecessor is strictly closer to a root export, even if it means accepting more badness - distanceFromPackageExport(pred) < distanceFromPackageExport(node) + distanceFromRoot(pred) < distanceFromRoot(node) | b ) and result = min(API::Node pred, string name1 | - pred = getAPredecessor(node, name1, badness) + pred = getAPredecessor(node, name1, badness) and + // ensure the preferred predecessor is strictly closer to a root export, even if it means accepting more badness + distanceFromRoot(pred) < distanceFromRoot(node) | - pred order by distanceFromPackageExport(pred), name1 + pred order by distanceFromRoot(pred), name1 ) and name = min(string n | result = getAPredecessor(node, n, badness) | n) } @@ -137,6 +217,12 @@ private predicate sinkHasNameCandidate(API::Node sink, string package, string na name = "" and badness = 0 or + exists(DataFlow::ClassNode cls, string className | + sink = API::Internal::getClassInstance(cls) and + classHasFallbackName(cls, package, className, badness) and + name = join(className, "prototype") + ) + or exists(API::Node baseNode, string baseName, int baseBadness, string step, int stepBadness | sinkHasNameCandidate(baseNode, package, baseName, baseBadness) and baseNode = getPreferredPredecessor(sink, step, stepBadness) and @@ -163,80 +249,32 @@ predicate sinkHasPrimaryName(API::Node sink, string package, string name) { sinkHasPrimaryName(sink, package, name, _) } -/** - * Holds if `(package, name)` is an alias for `node`. - * - * This means it is a valid name for it, but was not chosen as the primary name. - */ -private predicate sinkHasAlias(API::Node sink, string package, string name) { - not sinkHasPrimaryName(sink, package, name) and - ( - exists(string baseName, string step | - sinkHasPrimaryName(getAPredecessor(sink, step, _), package, baseName) and - name = join(baseName, step) - ) - or - sink = API::moduleExport(package) and - name = "" +/** Gets a source node that can flow to `sink` without using a return step. */ +private DataFlow::SourceNode nodeReachingSink(API::Node sink, DataFlow::TypeBackTracker t) { + t.start() and + result = sink.asSink().getALocalSource() + or + exists(DataFlow::TypeBackTracker t2 | + result = nodeReachingSink(sink, t2).backtrack(t2, t) and + t.hasReturn() = false ) } +/** Gets a source node that can flow to `sink` without using a return step. */ +DataFlow::SourceNode nodeReachingSink(API::Node sink) { + result = nodeReachingSink(sink, DataFlow::TypeBackTracker::end()) +} + /** Gets a sink node reachable from `node`. */ -bindingset[node] -private API::Node getASinkNode(DataFlow::SourceNode node) { result.getAValueReachingSink() = node } +private API::Node getASinkNode(DataFlow::SourceNode node) { node = nodeReachingSink(result) } /** - * Holds if `node` is a declaration in an externs file. - * - * This is to ensure that functions/classes in externs are not named after a re-export in a package. + * Holds if `node` is assigned to a global access path. Note that such nodes generally do not have API nodes. */ -private predicate nameFromExterns(DataFlow::Node node, string package, string name, int badness) { - node.getTopLevel().isExterns() and +private predicate nameFromGlobal(DataFlow::Node node, string package, string name, int badness) { package = "global" and node = AccessPath::getAnAssignmentTo(name) and - badness = -10 -} - -bindingset[qualifiedName] -private int getBadnessOfClassName(string qualifiedName) { - if qualifiedName.matches("%.constructor") - then result = 10 - else - if qualifiedName = "" - then result = 5 - else result = 0 -} - -/** Holds if `(package, name)` is a potential name for `cls`, with the given `badness`. */ -private predicate classObjectHasNameCandidate( - DataFlow::ClassNode cls, string package, string name, int badness -) { - // There can be multiple API nodes associated with `cls`. - // For example: - /// - // class C {} - // module.exports.A = C; // first sink - // module.exports.B = C; // second sink - // - exists(int baseBadness | - sinkHasPrimaryName(getASinkNode(cls), package, name, baseBadness) and - badness = baseBadness + getBadnessOfClassName(name) - ) - or - nameFromExterns(cls, package, name, badness) -} - -private predicate classObjectHasPrimaryName( - DataFlow::ClassNode cls, string package, string name, int badness -) { - badness = min(int b | classObjectHasNameCandidate(cls, _, _, b) | b) and - package = min(string p | classObjectHasNameCandidate(cls, p, _, badness) | p) and - name = min(string n | classObjectHasNameCandidate(cls, package, n, badness) | n) -} - -/** Holds if `(package, name)` is the primary name for the class object of `cls`. */ -predicate classObjectHasPrimaryName(DataFlow::ClassNode cls, string package, string name) { - classObjectHasPrimaryName(cls, package, name, _) + (if node.getTopLevel().isExterns() then badness = -10 else badness = 10) } /** Holds if an instance of `cls` can be exposed to client code. */ @@ -244,116 +282,116 @@ private predicate hasEscapingInstance(DataFlow::ClassNode cls) { cls.getAnInstanceReference().flowsTo(any(API::Node n).asSink()) } -/** - * Holds if `(package, name)` is a potential name to use for instances of `cls`, with the given `badness`. - */ -private predicate classInstanceHasNameCandidate( - DataFlow::ClassNode cls, string package, string name, int badness +private predicate sourceNodeHasNameCandidate( + DataFlow::SourceNode node, string package, string name, int badness ) { - exists(string baseName | - classObjectHasPrimaryName(cls, package, baseName, badness) and - name = join(baseName, "prototype") - ) + sinkHasPrimaryName(getASinkNode(node), package, name, badness) or - // In case the class itself is unaccessible, but an instance is exposed via an access path, - // consider using that access path. For example: - // - // class InternalClass {} - // module.exports.foo = new InternalClass(); - // - exists(int baseBadness | - sinkHasPrimaryName(getASinkNode(cls.getAnInstanceReference()), package, name, baseBadness) and - badness = baseBadness + 30 // add penalty, as we prefer to base this on the class name - ) - or - // If neither the class nor its instances are accessible via an access path, but instances of the - // class can still escape via more complex access patterns, resort to a synthesized name. - // For example: - // - // class InternalClass {} - // function foo() { - // return new InternalClass(); - // } - // - hasEscapingInstance(cls) and - exists(string baseName | - InternalModuleNaming::fallbackModuleName(cls.getTopLevel(), package, baseName, badness - 100) and - name = join(baseName, cls.getName()) + ".prototype" - ) + nameFromGlobal(node, package, name, badness) } -private predicate classInstanceHasPrimaryName( - DataFlow::ClassNode cls, string package, string name, int badness +private predicate sourceNodeHasPrimaryName( + DataFlow::SourceNode node, string package, string name, int badness ) { - badness = min(int b | classInstanceHasNameCandidate(cls, _, _, b) | b) and - package = min(string p | classInstanceHasNameCandidate(cls, p, _, badness) | p) and + badness = min(int b | sourceNodeHasNameCandidate(node, _, _, b) | b) and + package = + min(string p | sourceNodeHasNameCandidate(node, p, _, badness) | p order by p.length(), p) and name = - min(string n | - classInstanceHasNameCandidate(cls, package, n, badness) - | - n order by n.length(), n - ) + min(string n | sourceNodeHasNameCandidate(node, package, n, badness) | n order by n.length(), n) } -/** Holds if `(package, name)` is the primary name to use for instances of `cls`. */ -predicate classInstanceHasPrimaryName(DataFlow::ClassNode cls, string package, string name) { - classInstanceHasPrimaryName(cls, package, name, _) -} - -/** Holds if `(package, name)` is an alias referring to some instance of `cls`. */ -predicate classInstanceHasAlias(DataFlow::ClassNode cls, string package, string name) { - not classInstanceHasPrimaryName(cls, package, name) and - exists(int badness | - classInstanceHasNameCandidate(cls, package, name, badness) and - badness < 100 // Badness 100 is when we start to synthesize names. Do not suggest these as aliases. - ) -} - -private predicate functionHasNameCandidate( - DataFlow::FunctionNode function, string package, string name, int badness -) { - sinkHasPrimaryName(getASinkNode(function), package, name, badness) - or - exists(DataFlow::ClassNode cls | - function = cls.getConstructor() and - classObjectHasPrimaryName(cls, package, name, badness) +/** Gets a data flow node referring to a function value. */ +private DataFlow::SourceNode functionValue(DataFlow::TypeTracker t) { + t.start() and + ( + result instanceof DataFlow::FunctionNode or - exists(string baseName, string memberName | - function = cls.getInstanceMethod(memberName) and - classInstanceHasPrimaryName(cls, package, baseName, badness) and - name = join(baseName, memberName) - or - function = cls.getStaticMethod(memberName) and - classObjectHasPrimaryName(cls, package, baseName, badness) and - name = join(baseName, memberName) - ) + result instanceof DataFlow::ClassNode + or + result instanceof DataFlow::PartialInvokeNode + or + result = DataFlow::globalVarRef(["Function", "eval"]).getAnInvocation() + or + // Assume double-invocation of Function also returns a function + result = DataFlow::globalVarRef("Function").getAnInvocation().getAnInvocation() ) or - nameFromExterns(function, package, name, badness) + exists(DataFlow::TypeTracker t2 | result = functionValue(t2).track(t2, t)) } -private predicate functionHasPrimaryName( - DataFlow::FunctionNode function, string package, string name, int badness -) { - badness = min(int b | functionHasNameCandidate(function, _, _, b) | b) and - package = min(string p | functionHasNameCandidate(function, p, _, badness) | p) and - name = - min(string n | - functionHasNameCandidate(function, package, n, badness) - | - n order by n.length(), n - ) +/** Gets a data flow node referring to a function value. */ +private DataFlow::SourceNode functionValue() { + result = functionValue(DataFlow::TypeTracker::end()) +} + +/** + * Holds if `node` is a function or a call that returns a function. + */ +private predicate isFunctionSource(DataFlow::SourceNode node) { + ( + exists(getASinkNode(node)) + or + nameFromGlobal(node, _, _, _) + ) and + ( + node instanceof DataFlow::FunctionNode + or + node instanceof DataFlow::ClassNode + or + node = functionValue() and + node instanceof DataFlow::InvokeNode and + // `getASinkNode` steps through imports (but not other calls) so exclude calls that are imports (i.e. require calls) + // as we want to get as close to the source as possible. + not node instanceof DataFlow::ModuleImportNode + ) } /** * Holds if `(package, name)` is the primary name for the given `function`. + * + * The `function` node may be an actual function expression, or a call site from which a function is returned. */ -predicate functionHasPrimaryName(DataFlow::FunctionNode function, string package, string name) { - functionHasPrimaryName(function, package, name, _) +predicate functionHasPrimaryName(DataFlow::SourceNode function, string package, string name) { + sourceNodeHasPrimaryName(function, package, name, _) and + isFunctionSource(function) +} + +private predicate sinkHasSourceName(API::Node sink, string package, string name, int badness) { + exists(DataFlow::SourceNode source | + sink = getASinkNode(source) and + sourceNodeHasPrimaryName(source, package, name, badness) + ) +} + +private predicate sinkHasPrimarySourceName(API::Node sink, string package, string name) { + strictcount(string p, string n | sinkHasSourceName(sink, p, n, _)) = 1 and + sinkHasSourceName(sink, package, name, _) +} + +private predicate aliasCandidate( + string package, string name, string targetPackage, string targetName, API::Node aliasDef +) { + sinkHasPrimaryName(aliasDef, package, name) and + sinkHasPrimarySourceName(aliasDef, targetPackage, targetName) and + not sinkHasSourceName(_, package, name, _) // (package, name) cannot be an alias if a source has it as its primary name +} + +private predicate nonAlias(string package, string name) { + // `(package, name)` appears to be an alias for multiple things. Treat it as a primary name instead. + strictcount(string targetPackage, string targetName | + aliasCandidate(package, name, targetPackage, targetName, _) + ) > 1 + or + // Not all sinks with this name agree on the alias target + exists(API::Node sink, string targetPackage, string targetName | + aliasCandidate(package, name, targetPackage, targetName, _) and + sinkHasPrimaryName(sink, package, name) and + not sinkHasPrimarySourceName(sink, targetPackage, targetName) + ) } /** - * Holds if `(aliasPackage, aliasName)` is an alias for `(primaryPackage, primaryName)`, + * Holds if `(package, name)` is an alias for `(targetPackage, targetName)`, * defined at `aliasDef`. * * Only the last component of an access path is reported as an alias, the prefix always @@ -365,24 +403,10 @@ predicate functionHasPrimaryName(DataFlow::FunctionNode function, string package * reported separately. */ predicate aliasDefinition( - string primaryPackage, string primaryName, string aliasPackage, string aliasName, - API::Node aliasDef + string package, string name, string targetPackage, string targetName, API::Node aliasDef ) { - exists(DataFlow::SourceNode source | - classObjectHasPrimaryName(source, primaryPackage, primaryName) - or - functionHasPrimaryName(source, primaryPackage, primaryName) - | - aliasDef.getAValueReachingSink() = source and - sinkHasPrimaryName(aliasDef, aliasPackage, aliasName, _) and - not ( - primaryPackage = aliasPackage and - primaryName = aliasName - ) - ) - or - sinkHasPrimaryName(aliasDef, primaryPackage, primaryName) and - sinkHasAlias(aliasDef, aliasPackage, aliasName) + aliasCandidate(package, name, targetPackage, targetName, aliasDef) and + not nonAlias(package, name) } /** @@ -432,8 +456,6 @@ private module InternalModuleNaming { /** Holds if `(package, name)` should be used to refer to code inside `mod`. */ predicate fallbackModuleName(Module mod, string package, string name, int badness) { - sinkHasPrimaryName(getASinkNode(mod.getDefaultOrBulkExport()), package, name, badness) - or badness = 50 and package = getPackageRelativePath(mod) and name = "" @@ -462,28 +484,6 @@ module Debug { ) } - /** Holds if the given `node` has multiple primary names. */ - query string ambiguousClassObjectName(DataFlow::ClassNode node) { - strictcount(string package, string name | classObjectHasPrimaryName(node, package, name)) > 1 and - result = - concat(string package, string name | - classObjectHasPrimaryName(node, package, name) - | - renderName(package, name), ", " - ) - } - - /** Holds if the given `node` has multiple primary names. */ - query string ambiguousClassInstanceName(DataFlow::ClassNode node) { - strictcount(string package, string name | classInstanceHasPrimaryName(node, package, name)) > 1 and - result = - concat(string package, string name | - classInstanceHasPrimaryName(node, package, name) - | - renderName(package, name), ", " - ) - } - /** Holds if the given `node` has multiple primary names. */ query string ambiguousFunctionName(DataFlow::FunctionNode node) { strictcount(string package, string name | functionHasPrimaryName(node, package, name)) > 1 and diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 85516e3625d..b9627cac5ee 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.10 + +No user-facing changes. + ## 0.8.9 ### Bug Fixes diff --git a/javascript/ql/src/change-notes/released/0.8.10.md b/javascript/ql/src/change-notes/released/0.8.10.md new file mode 100644 index 00000000000..777bbd2fded --- /dev/null +++ b/javascript/ql/src/change-notes/released/0.8.10.md @@ -0,0 +1,3 @@ +## 0.8.10 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 5290c29b7fe..0521f0f75fa 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.9 +lastReleaseVersion: 0.8.10 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index a36a45d5ed9..d224952c564 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 0.8.9 +version: 0.8.10 groups: - javascript - queries diff --git a/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected b/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected index e0cc251f903..af5e8d62bb3 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected +++ b/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected @@ -1,7 +1,8 @@ testFailures ambiguousPreferredPredecessor +| pack2/lib.js:1:1:3:1 | def moduleImport("pack2").getMember("exports").getMember("lib").getMember("LibClass").getInstance() | +| pack2/lib.js:8:22:8:34 | def moduleImport("pack2").getMember("exports").getMember("lib").getMember("LibClass").getMember("foo") | +| pack2/main.js:1:1:3:1 | def moduleImport("pack2").getMember("exports").getMember("MainClass").getInstance() | ambiguousSinkName -ambiguousClassObjectName -ambiguousClassInstanceName ambiguousFunctionName failures diff --git a/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.ql b/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.ql index 84efa963534..631fdf4b0b1 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.ql +++ b/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.ql @@ -5,28 +5,21 @@ import semmle.javascript.endpoints.EndpointNaming as EndpointNaming import testUtilities.InlineExpectationsTest import EndpointNaming::Debug +private predicate isIgnored(DataFlow::FunctionNode function) { + function.getFunction() = any(ConstructorDeclaration decl | decl.isSynthetic()).getBody() +} + module TestConfig implements TestSig { - string getARelevantTag() { result = ["instance", "class", "method", "alias"] } + string getARelevantTag() { result = ["name", "alias"] } predicate hasActualResult(Location location, string element, string tag, string value) { - exists(string package, string name | - element = "" and + element = "" and + tag = "name" and + exists(DataFlow::SourceNode function, string package, string name | + EndpointNaming::functionHasPrimaryName(function, package, name) and + not isIgnored(function) and + location = function.getAstNode().getLocation() and value = EndpointNaming::renderName(package, name) - | - exists(DataFlow::ClassNode cls | location = cls.getAstNode().getLocation() | - tag = "class" and - EndpointNaming::classObjectHasPrimaryName(cls, package, name) - or - tag = "instance" and - EndpointNaming::classInstanceHasPrimaryName(cls, package, name) - ) - or - exists(DataFlow::FunctionNode function | - not function.getFunction() = any(ConstructorDeclaration decl | decl.isSynthetic()).getBody() and - location = function.getFunction().getLocation() and - tag = "method" and - EndpointNaming::functionHasPrimaryName(function, package, name) - ) ) or element = "" and @@ -35,7 +28,7 @@ module TestConfig implements TestSig { API::Node aliasDef, string primaryPackage, string primaryName, string aliasPackage, string aliasName | - EndpointNaming::aliasDefinition(primaryPackage, primaryName, aliasPackage, aliasName, aliasDef) and + EndpointNaming::aliasDefinition(aliasPackage, aliasName, primaryPackage, primaryName, aliasDef) and value = EndpointNaming::renderName(aliasPackage, aliasName) + "==" + EndpointNaming::renderName(primaryPackage, primaryName) and diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack1/main.js b/javascript/ql/test/library-tests/EndpointNaming/pack1/main.js index ead8000ff14..cc550f0da15 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack1/main.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack1/main.js @@ -1,13 +1,15 @@ -export class PublicClass {} // $ class=(pack1).PublicClass instance=(pack1).PublicClass.prototype +export class PublicClass {} // $ name=(pack1).PublicClass class PrivateClass {} -export const ExportedConst = class ExportedConstClass {} // $ class=(pack1).ExportedConst instance=(pack1).ExportedConst.prototype +export const ExportedConst = class ExportedConstClass {} // $ name=(pack1).ExportedConst -class ClassWithEscapingInstance {} // $ instance=(pack1).ClassWithEscapingInstance.prototype +class ClassWithEscapingInstance { + m() {} // $ name=(pack1).ClassWithEscapingInstance.prototype.m +} export function getEscapingInstance() { return new ClassWithEscapingInstance(); -} // $ method=(pack1).getEscapingInstance +} // $ name=(pack1).getEscapingInstance -export function publicFunction() {} // $ method=(pack1).publicFunction +export function publicFunction() {} // $ name=(pack1).publicFunction diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack10/foo.js b/javascript/ql/test/library-tests/EndpointNaming/pack10/foo.js index 3495843defe..e851aa23c13 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack10/foo.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack10/foo.js @@ -1 +1 @@ -export default class FooClass {} // $ class=(pack10).Foo instance=(pack10).Foo.prototype +export default class FooClass {} // $ name=(pack10).Foo diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack11/index.ts b/javascript/ql/test/library-tests/EndpointNaming/pack11/index.ts new file mode 100644 index 00000000000..942d9828066 --- /dev/null +++ b/javascript/ql/test/library-tests/EndpointNaming/pack11/index.ts @@ -0,0 +1,59 @@ +const f1 = { + m() {} // $ name=(pack11).C1.publicField.really.long.name.m +}; + +export class C1 { + private static privateField = f1; + + public static publicField = { + really: { + long: { + name: f1 + } + } + } +} // $ name=(pack11).C1 + +const f2 = { + m() {} // $ name=(pack11).C2.publicField.really.long.name.m +} + +export class C2 { + static #privateField = f2; + + static publicField = { + really: { + long: { + name: f2 + } + } + } +} // $ name=(pack11).C2 + +function f3() {} // $ name=(pack11).C3.publicField.really.long.name + +export class C3 { + private static privateField = f3; + + public static publicField = { + really: { + long: { + name: f3 + } + } + } +} // $ name=(pack11).C3 + + +const f4 = { + m() {} // $ name=(pack11).C4.really.long.name.m +}; + +export const C4 = { + [Math.random()]: f4, + really: { + long: { + name: f4 + } + } +} diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack11/package.json b/javascript/ql/test/library-tests/EndpointNaming/pack11/package.json new file mode 100644 index 00000000000..a2cd2ee271b --- /dev/null +++ b/javascript/ql/test/library-tests/EndpointNaming/pack11/package.json @@ -0,0 +1,4 @@ +{ + "name": "pack11", + "main": "./index.js" +} diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack12/index.js b/javascript/ql/test/library-tests/EndpointNaming/pack12/index.js new file mode 100644 index 00000000000..7962f05ab24 --- /dev/null +++ b/javascript/ql/test/library-tests/EndpointNaming/pack12/index.js @@ -0,0 +1,10 @@ +function wrap(fn) { + return x => fn(x); +} + +function f() {} +export const f1 = wrap(f); // $ name=(pack12).f1 +export const f2 = wrap(f); // $ name=(pack12).f2 + +function g() {} +export const g1 = wrap(g); // $ name=(pack12).g1 diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack12/package.json b/javascript/ql/test/library-tests/EndpointNaming/pack12/package.json new file mode 100644 index 00000000000..00022fc2c3d --- /dev/null +++ b/javascript/ql/test/library-tests/EndpointNaming/pack12/package.json @@ -0,0 +1,4 @@ +{ + "name": "pack12", + "main": "./index.js" +} diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack2/lib.js b/javascript/ql/test/library-tests/EndpointNaming/pack2/lib.js index 559dd4877a3..254edaf0c54 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack2/lib.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack2/lib.js @@ -1,6 +1,8 @@ class AmbiguousClass { - instanceMethod(foo) {} // $ method=(pack2).lib.LibClass.prototype.instanceMethod -} // $ class=(pack2).lib.LibClass instance=(pack2).lib.LibClass.prototype + instanceMethod(foo) {} // $ name=(pack2).lib.LibClass.prototype.instanceMethod +} // $ name=(pack2).lib.LibClass export default AmbiguousClass; // $ alias=(pack2).lib.default==(pack2).lib.LibClass export { AmbiguousClass as LibClass } + +AmbiguousClass.foo = function() {} // $ name=(pack2).lib.LibClass.foo diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack2/main.js b/javascript/ql/test/library-tests/EndpointNaming/pack2/main.js index 5906a1170dd..07f70430e35 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack2/main.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack2/main.js @@ -1,6 +1,6 @@ class AmbiguousClass { - instanceMethod() {} // $ method=(pack2).MainClass.prototype.instanceMethod -} // $ class=(pack2).MainClass instance=(pack2).MainClass.prototype + instanceMethod() {} // $ name=(pack2).MainClass.prototype.instanceMethod +} // $ name=(pack2).MainClass export default AmbiguousClass; // $ alias=(pack2).default==(pack2).MainClass export { AmbiguousClass as MainClass } diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack3/lib.js b/javascript/ql/test/library-tests/EndpointNaming/pack3/lib.js index c99db7724bf..bb97630f4fa 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack3/lib.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack3/lib.js @@ -1 +1 @@ -export default function(x,y,z) {} // $ method=(pack3).libFunction alias=(pack3).libFunction.default==(pack3).libFunction +export default function(x,y,z) {} // $ name=(pack3).libFunction alias=(pack3).libFunction.default==(pack3).libFunction diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack3/main.js b/javascript/ql/test/library-tests/EndpointNaming/pack3/main.js index 98016d68737..aa164039826 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack3/main.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack3/main.js @@ -1,4 +1,4 @@ -function ambiguousFunction(x, y, z) {} // $ method=(pack3).namedFunction +function ambiguousFunction(x, y, z) {} // $ name=(pack3).namedFunction export default ambiguousFunction; // $ alias=(pack3).default==(pack3).namedFunction export { ambiguousFunction as namedFunction }; diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack4/index.js b/javascript/ql/test/library-tests/EndpointNaming/pack4/index.js index 15143e30bf6..7384e7a8d85 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack4/index.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack4/index.js @@ -1 +1 @@ -export default class C {} // $ class=(pack4) instance=(pack4).prototype +export default class C {} // $ name=(pack4) diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack5/src/index.js b/javascript/ql/test/library-tests/EndpointNaming/pack5/src/index.js index d9653840786..7de696caaa4 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack5/src/index.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack5/src/index.js @@ -1 +1 @@ -export default class C {} // $ class=(pack5) instance=(pack5).prototype +export default class C {} // $ name=(pack5) diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack6/index.js b/javascript/ql/test/library-tests/EndpointNaming/pack6/index.js index e15b5319858..95ea2bb9dc1 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack6/index.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack6/index.js @@ -1,6 +1,6 @@ class C { - instanceMethod() {} // $ method=(pack6).instanceMethod + instanceMethod() {} // $ name=(pack6).instanceMethod static staticMethod() {} // not accessible -} // $ instance=(pack6) +} export default new C(); diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack7/index.js b/javascript/ql/test/library-tests/EndpointNaming/pack7/index.js index b56b32095d4..768a5bbd02d 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack7/index.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack7/index.js @@ -1,6 +1,6 @@ -export class D {} // $ class=(pack7).D instance=(pack7).D.prototype +export class D {} // $ name=(pack7).D // In this case we are forced to include ".default" to avoid ambiguity with class D above. export default { - D: class {} // $ class=(pack7).default.D instance=(pack7).default.D.prototype + D: class {} // $ name=(pack7).default.D }; diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack8/foo.js b/javascript/ql/test/library-tests/EndpointNaming/pack8/foo.js index de14ea27b89..bbced74cde8 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack8/foo.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack8/foo.js @@ -1,4 +1,4 @@ -class Foo {} // $ class=(pack8).Foo instance=(pack8).Foo.prototype +class Foo {} // $ name=(pack8).Foo module.exports = Foo; module.exports.default = Foo; // $ alias=(pack8).Foo.default==(pack8).Foo diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack8/index.js b/javascript/ql/test/library-tests/EndpointNaming/pack8/index.js index 3cf0920f4bf..6029aa9316b 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack8/index.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack8/index.js @@ -1,4 +1,4 @@ -class Main {} // $ class=(pack8) instance=(pack8).prototype +class Main {} // $ name=(pack8) Main.Foo = require('./foo'); diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack9/foo.js b/javascript/ql/test/library-tests/EndpointNaming/pack9/foo.js index 55d14ad5b52..223d0a8b395 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack9/foo.js +++ b/javascript/ql/test/library-tests/EndpointNaming/pack9/foo.js @@ -1 +1 @@ -export class Foo {} // $ instance=(pack9/foo).Foo.prototype +export class Foo {} diff --git a/javascript/ql/test/library-tests/EndpointNaming/pack9/index.ts b/javascript/ql/test/library-tests/EndpointNaming/pack9/index.ts index 65c783aa499..4848924ef2c 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/pack9/index.ts +++ b/javascript/ql/test/library-tests/EndpointNaming/pack9/index.ts @@ -6,4 +6,4 @@ import * as foo from "./foo"; export function expose() { return new foo.Foo(); // expose an instance of Foo but not the class -} // $ method=(pack9).expose +} // $ name=(pack9).expose diff --git a/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected b/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected index f5d780e3190..9a03bdcd34e 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected +++ b/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected @@ -10,7 +10,7 @@ | highlight.js:19:56:19:61 | [^\\]]+ | Strings starting with '[' and with many repetitions of '.[' can start matching anywhere after the start of the preceeding (\\.\|\\.\\/\|\\/)?(""\|"[^"]+"\|''\|'[^']+'\|\\[\\]\|\\[[^\\]]+\\]\|[^\\s!"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{\|}~]+)((\\.\|\\/)(""\|"[^"]+"\|''\|'[^']+'\|\\[\\]\|\\[[^\\]]+\\]\|[^\\s!"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{\|}~]+))* | | highlight.js:22:12:22:82 | ((decltype\\(auto\\)\|(?:[a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(?:<.*?>)?)[\\*&\\s]+)+ | Strings with many repetitions of 'A\\t' can start matching anywhere after the start of the preceeding .*? | | highlight.js:22:43:22:45 | \\w* | Strings starting with 'A' and with many repetitions of 'A' can start matching anywhere after the start of the preceeding .*? | -| highlight.js:22:66:22:68 | .*? | Strings starting with 'A<' and with many repetitions of 'A<' can start matching anywhere after the start of the preceeding \\w* | +| highlight.js:22:66:22:68 | .*? | Strings starting with 'A<' and with many repetitions of 'a<' can start matching anywhere after the start of the preceeding \\w* | | highlight.js:22:73:22:80 | [\\*&\\s]+ | Strings starting with 'A' and with many repetitions of '\\tA\\t' can start matching anywhere after the start of the preceeding .*? | | highlight.js:23:13:23:82 | ((decltype\\(auto\\)\|([a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(<[^<>]+>)?)[\\*&\\s]+)+ | Strings with many repetitions of 'A\\t' can start matching anywhere after the start of the preceeding ((decltype\\(auto\\)\|([a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(<[^<>]+>)?)[\\*&\\s]+)+([a-zA-Z_]\\w*::)?[a-zA-Z]\\w*\\s*\\( | | highlight.js:23:42:23:44 | \\w* | Strings starting with 'A' and with many repetitions of 'A' can start matching anywhere after the start of the preceeding ((decltype\\(auto\\)\|([a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(<[^<>]+>)?)[\\*&\\s]+)+([a-zA-Z_]\\w*::)?[a-zA-Z]\\w*\\s*\\( | @@ -279,7 +279,7 @@ | regexplib/misc.js:117:25:117:26 | .+ | Strings starting with '(a}' and with many repetitions of 'a)' can start matching anywhere after the start of the preceeding .+ | | regexplib/misc.js:119:20:119:22 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/misc.js:119:52:119:57 | [^\\)]* | Strings starting with '0=(' and with many repetitions of '0<((' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | -| regexplib/misc.js:123:36:123:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[Aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | +| regexplib/misc.js:123:36:123:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | | regexplib/misc.js:126:15:126:20 | [a-z]+ | Strings starting with 'a' and with many repetitions of 'aa' can start matching anywhere after the start of the preceeding [a-z]+ | | regexplib/misc.js:141:15:141:19 | [^;]+ | Strings starting with '{\\\\f\\\\' and with many repetitions of '{\\\\f\\\\:' can start matching anywhere after the start of the preceeding (\\{\\\\f\\d*)\\\\([^;]+;) | | regexplib/misc.js:144:52:144:70 | [a-z0-9\\/\\.\\?\\=\\&]* | Strings starting with '".htm' and with many repetitions of '.asp' can start matching anywhere after the start of the preceeding [a-z0-9\\/\\.\\?\\=\\&]* | @@ -334,7 +334,7 @@ | regexplib/strings.js:54:20:54:22 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:54:52:54:57 | [^\\)]* | Strings starting with '0=(' and with many repetitions of '0<((' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:56:52:56:53 | .+ | Strings starting with 'AUX.' and with many repetitions of '.' can start matching anywhere after the start of the preceeding .* | -| regexplib/strings.js:57:36:57:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[Aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | +| regexplib/strings.js:57:36:57:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | | regexplib/strings.js:64:3:64:5 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (\\w+)\\s+\\1 | | regexplib/strings.js:70:6:70:17 | [a-zA-Z,\\s]+ | Strings with many repetitions of '\\t' can start matching anywhere after the start of the preceeding \\s* | | regexplib/strings.js:70:18:70:20 | \\s* | Strings starting with '\\t' and with many repetitions of '\\t' can start matching anywhere after the start of the preceeding \\s* | @@ -345,7 +345,7 @@ | regexplib/strings.js:74:2:74:3 | .* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding .*[Pp]re[Ss\\$]cr[iI1]pt.* | | regexplib/strings.js:75:2:75:3 | .* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding .*[Vv][Ii1]agr.* | | regexplib/strings.js:76:2:76:3 | .* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding .*[Oo0][Ee][Mm].* | -| regexplib/strings.js:81:36:81:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[Aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | +| regexplib/strings.js:81:36:81:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | | regexplib/strings.js:82:20:82:22 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:82:52:82:57 | [^\\)]* | Strings starting with '0=(' and with many repetitions of '0<((' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:88:3:88:12 | [^\\.\\?\\!]* | Strings with many repetitions of ' ' can start matching anywhere after the start of the preceeding ([^\\.\\?\\!]*)[\\.\\?\\!] | diff --git a/misc/bazel/cmake/cmake.bzl b/misc/bazel/cmake/cmake.bzl index cba271dc517..d98a480c69c 100644 --- a/misc/bazel/cmake/cmake.bzl +++ b/misc/bazel/cmake/cmake.bzl @@ -22,7 +22,9 @@ CmakeInfo = provider( ) def _cmake_name(label): - ret = ("%s_%s_%s" % (label.workspace_name, label.package, label.name)).replace("/", "_") + # strip away the bzlmod module version for now + workspace_name, _, _ = label.workspace_name.partition("~") + ret = ("%s_%s_%s" % (workspace_name, label.package, label.name)).replace("/", "_") internal_transition_suffix = "_INTERNAL_TRANSITION" if ret.endswith(internal_transition_suffix): ret = ret[:-len(internal_transition_suffix)] @@ -68,10 +70,10 @@ def _cmake_aspect_impl(target, ctx): is_macos = "darwin" in ctx.var["TARGET_CPU"] - is_binary = ctx.rule.kind == "cc_binary" + is_binary = ctx.rule.kind in ("cc_binary", "cc_test") force_cxx_compilation = "force_cxx_compilation" in ctx.rule.attr.features attr = ctx.rule.attr - srcs = attr.srcs + getattr(attr, "hdrs", []) + getattr(attr, "textual_hdrs", []) + srcs = getattr(attr, "srcs", []) + getattr(attr, "hdrs", []) + getattr(attr, "textual_hdrs", []) srcs = [f for src in srcs for f in src.files.to_list()] inputs = [f for f in srcs if not f.is_source or f.path.startswith("external/")] by_kind = {} @@ -90,10 +92,10 @@ def _cmake_aspect_impl(target, ctx): cxx_compilation = force_cxx_compilation or any([not src.endswith(".c") for src in srcs]) copts = ctx.fragments.cpp.copts + (ctx.fragments.cpp.cxxopts if cxx_compilation else ctx.fragments.cpp.conlyopts) - copts += [ctx.expand_make_variables("copts", o, {}) for o in ctx.rule.attr.copts] + copts += [ctx.expand_make_variables("copts", o, {}) for o in getattr(ctx.rule.attr, "copts", [])] linkopts = ctx.fragments.cpp.linkopts - linkopts += [ctx.expand_make_variables("linkopts", o, {}) for o in ctx.rule.attr.linkopts] + linkopts += [ctx.expand_make_variables("linkopts", o, {}) for o in getattr(ctx.rule.attr, "linkopts", [])] compilation_ctx = target[CcInfo].compilation_context system_includes = _get_includes(compilation_ctx.system_includes) @@ -120,7 +122,6 @@ def _cmake_aspect_impl(target, ctx): prefix, # source "${BAZEL_EXEC_ROOT}/%s/%s" % (ctx.var["BINDIR"], prefix), # generated ] - deps = [dep[CmakeInfo] for dep in deps if CmakeInfo in dep] # by the book this should be done with depsets, but so far the performance implication is negligible diff --git a/misc/bazel/cmake/setup.cmake b/misc/bazel/cmake/setup.cmake index 79314d76f85..739bdd861ab 100644 --- a/misc/bazel/cmake/setup.cmake +++ b/misc/bazel/cmake/setup.cmake @@ -9,27 +9,61 @@ if (NOT DEFINED BAZEL_BIN) set(BAZEL_BIN "bazelisk") endif () +if (NOT DEFINED CODEQL_BAZEL_WORKSPACE) + set(CODEQL_BAZEL_WORKSPACE "codeql") +endif () + macro(bazel) - execute_process(COMMAND ${BAZEL_BIN} ${ARGN} + execute_process(COMMAND ${BAZEL_BIN} ${BAZEL_STARTUP_OPTIONS} ${ARGN} COMMAND_ERROR_IS_FATAL ANY OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) endmacro() -bazel(info workspace OUTPUT_VARIABLE BAZEL_WORKSPACE) +macro(bazel_even_if_failing) + execute_process(COMMAND ${BAZEL_BIN} ${BAZEL_STARTUP_OPTIONS} ${ARGN} + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) +endmacro() +bazel(info workspace OUTPUT_VARIABLE BAZEL_WORKSPACE) bazel(info output_base OUTPUT_VARIABLE BAZEL_OUTPUT_BASE) -string(REPLACE "-" "_" BAZEL_EXEC_ROOT ${PROJECT_NAME}) -set(BAZEL_EXEC_ROOT ${BAZEL_OUTPUT_BASE}/execroot/${BAZEL_EXEC_ROOT}) +set(BAZEL_EXEC_ROOT ${BAZEL_OUTPUT_BASE}/execroot/_main) +set(BAZEL_BUILD_OPTIONS --nocheck_visibility --keep_going) macro(include_generated BAZEL_TARGET) - bazel(build ${BAZEL_TARGET}) + bazel(build ${BAZEL_TARGET} ${BAZEL_BUILD_OPTIONS}) string(REPLACE "@" "/external/" BAZEL_TARGET_PATH ${BAZEL_TARGET}) string(REPLACE "//" "/" BAZEL_TARGET_PATH ${BAZEL_TARGET_PATH}) string(REPLACE ":" "/" BAZEL_TARGET_PATH ${BAZEL_TARGET_PATH}) include(${BAZEL_WORKSPACE}/bazel-bin${BAZEL_TARGET_PATH}.cmake) endmacro() +macro(generate_and_include) + file(REMOVE "${BAZEL_WORKSPACE}/.bazel-cmake/BUILD.bazel") + # use aquery to only get targets compatible with the current platform + bazel_even_if_failing(aquery "kind(\"cc_test|cc_binary\", ${ARGN})" ${BAZEL_BUILD_OPTIONS} --output=jsonproto OUTPUT_VARIABLE BAZEL_AQUERY_RESULT) + string(JSON BAZEL_JSON_TARGETS GET "${BAZEL_AQUERY_RESULT}" targets) + string(JSON LAST_IDX LENGTH "${BAZEL_JSON_TARGETS}") + math(EXPR LAST_IDX "${LAST_IDX} - 1") + foreach(IDX RANGE ${LAST_IDX}) + string(JSON CUR_BAZEL_TARGET GET "${BAZEL_JSON_TARGETS}" ${IDX} label) + string(APPEND BAZEL_TARGETS " '${CUR_BAZEL_TARGET}',\n") + endforeach () + file(WRITE "${BAZEL_WORKSPACE}/.bazel-cmake/BUILD.bazel" "\ +# this file was generated by cmake +load('@${CODEQL_BAZEL_WORKSPACE}//misc/bazel/cmake:cmake.bzl', 'generate_cmake')\n\ +\n\ +generate_cmake(\n\ + name = 'cmake',\n\ + testonly = True,\n\ + targets = [\n\ +${BAZEL_TARGETS}\ + ],\n\ +)\n") + include_generated(//.bazel-cmake:cmake) +endmacro() + if (CREATE_COMPILATION_DATABASE_LINK) file(CREATE_LINK ${PROJECT_BINARY_DIR}/compile_commands.json ${PROJECT_SOURCE_DIR}/compile_commands.json SYMBOLIC) endif () diff --git a/misc/bazel/semmle_code_stub/MODULE.bazel b/misc/bazel/semmle_code_stub/MODULE.bazel new file mode 100644 index 00000000000..4efbb69d1bb --- /dev/null +++ b/misc/bazel/semmle_code_stub/MODULE.bazel @@ -0,0 +1,4 @@ +module( + name = "semmle_code", + version = "0.0", +) diff --git a/misc/bazel/semmle_code_stub/WORKSPACE.bazel b/misc/bazel/semmle_code_stub/WORKSPACE.bazel new file mode 100644 index 00000000000..e69de29bb2d diff --git a/misc/bazel/workspace.bzl b/misc/bazel/workspace.bzl index 428ca93fa2c..84c311e1b17 100644 --- a/misc/bazel/workspace.bzl +++ b/misc/bazel/workspace.bzl @@ -3,7 +3,7 @@ load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") load("//swift/third_party:load.bzl", load_swift_dependencies = "load_dependencies") def codeql_workspace(repository_name = "codeql"): - load_swift_dependencies(repository_name) + load_swift_dependencies(repository_name = repository_name) maybe( repo_rule = http_archive, name = "rules_pkg", diff --git a/misc/bazel/workspace_deps.bzl b/misc/bazel/workspace_deps.bzl index ce91ee3959d..7301066951f 100644 --- a/misc/bazel/workspace_deps.bzl +++ b/misc/bazel/workspace_deps.bzl @@ -5,7 +5,7 @@ load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") def codeql_workspace_deps(repository_name = "codeql"): pip_install( name = "codegen_deps", - requirements = "@%s//misc/codegen:requirements.txt" % repository_name, + requirements = "@%s//misc/codegen:requirements_lock.txt" % repository_name, ) bazel_skylib_workspace() rules_pkg_dependencies() diff --git a/misc/codegen/requirements.txt b/misc/codegen/requirements_in.txt similarity index 100% rename from misc/codegen/requirements.txt rename to misc/codegen/requirements_in.txt diff --git a/misc/codegen/requirements_lock.txt b/misc/codegen/requirements_lock.txt new file mode 100644 index 00000000000..f0ae5d82ba7 --- /dev/null +++ b/misc/codegen/requirements_lock.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --output-file=misc/codegen/requirements_lock.txt misc/codegen/requirements_in.txt +# +inflection==0.5.1 + # via -r misc/codegen/requirements_in.txt +iniconfig==2.0.0 + # via pytest +packaging==23.2 + # via pytest +pluggy==1.4.0 + # via pytest +pystache==0.6.5 + # via -r misc/codegen/requirements_in.txt +pytest==8.0.0 + # via -r misc/codegen/requirements_in.txt +pyyaml==6.0.1 + # via -r misc/codegen/requirements_in.txt +toposort==1.10 + # via -r misc/codegen/requirements_in.txt diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 3c06dd69b0f..1c4455b66c4 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.10 + +No user-facing changes. + ## 0.7.9 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/0.7.10.md b/misc/suite-helpers/change-notes/released/0.7.10.md new file mode 100644 index 00000000000..989c5b8f682 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/0.7.10.md @@ -0,0 +1,3 @@ +## 0.7.10 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 576395f3405..67518567297 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.9 +lastReleaseVersion: 0.7.10 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 6299dea47df..54d978d5efe 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 0.7.9 +version: 0.7.10 groups: shared warnOnImplicitThis: true diff --git a/python/ql/consistency-queries/PhaseDependentFlowConsistency.ql b/python/ql/consistency-queries/PhaseDependentFlowConsistency.ql new file mode 100644 index 00000000000..066e7d1fa1e --- /dev/null +++ b/python/ql/consistency-queries/PhaseDependentFlowConsistency.ql @@ -0,0 +1,21 @@ +private import python +private import semmle.python.dataflow.new.DataFlow::DataFlow +private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate +private import semmle.python.dataflow.new.internal.VariableCapture as VariableCapture + +from Node node +where + not exists(node.getScope()) and + exists(Node nodeFrom, Node nodeTo | node in [nodeFrom, nodeTo] | + // the list of step relations used with PhaseDependentFlow has been compiled + // manually, and there isn't really a good way to do so automatically :| + DataFlowPrivate::LocalFlow::definitionFlowStep(nodeFrom, nodeTo) + or + DataFlowPrivate::LocalFlow::expressionFlowStep(nodeFrom, nodeTo) + or + DataFlowPrivate::LocalFlow::useUseFlowStep(nodeFrom, nodeTo) + or + VariableCapture::valueStep(nodeFrom, nodeTo) + ) +select node, + "Node being used in PhaseDependentFlow does not have result for .getScope(), so will not work properly (since division into run-time/import-time is based on .getScope result)" diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index e6f318c51ea..f095607ca1b 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.11.10 + +### Minor Analysis Improvements + +* Fixed missing flow for dictionary updates (`d[] = ...`) when `` is a string constant not used in dictionary literals or as name of keyword-argument. +* Fixed flow for iterable unpacking (`a,b = my_tuple`) when it occurs on top-level (module) scope. + ## 0.11.9 ### Minor Analysis Improvements diff --git a/python/ql/lib/analysis/IDEContextual.qll b/python/ql/lib/analysis/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/python/ql/lib/analysis/IDEContextual.qll +++ b/python/ql/lib/analysis/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/python/ql/lib/change-notes/released/0.11.10.md b/python/ql/lib/change-notes/released/0.11.10.md new file mode 100644 index 00000000000..ed873724e4f --- /dev/null +++ b/python/ql/lib/change-notes/released/0.11.10.md @@ -0,0 +1,6 @@ +## 0.11.10 + +### Minor Analysis Improvements + +* Fixed missing flow for dictionary updates (`d[] = ...`) when `` is a string constant not used in dictionary literals or as name of keyword-argument. +* Fixed flow for iterable unpacking (`a,b = my_tuple`) when it occurs on top-level (module) scope. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index b064d1778a1..ddddcbe9193 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.11.9 +lastReleaseVersion: 0.11.10 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 63fe9b477ed..59a8b4c96d1 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 0.11.9 +version: 0.11.10 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/lib/semmle/python/Scope.qll b/python/ql/lib/semmle/python/Scope.qll index 83279b7e261..c40936dbdab 100644 --- a/python/ql/lib/semmle/python/Scope.qll +++ b/python/ql/lib/semmle/python/Scope.qll @@ -1,4 +1,16 @@ import python +private import semmle.python.dataflow.new.internal.ImportResolution + +/** + * Gets a name exported by module `m`, that is the names that will be added to a namespace by 'from this-module import *'. + * + * This aims to be the same as m.getAnExport(), but without using the points-to machinery. + */ +private string getAModuleExport(Module m) { + py_exports(m, result) + or + ImportResolution::module_export(m, result, _) +} /** * A Scope. A scope is the lexical extent over which all identifiers with the same name refer to the same variable. @@ -74,9 +86,9 @@ class Scope extends Scope_ { or exists(Module m | m = this.getEnclosingScope() and m.isPublic() | /* If the module has an __all__, is this in it */ - not exists(m.getAnExport()) + not exists(getAModuleExport(m)) or - m.getAnExport() = this.getName() + getAModuleExport(m) = this.getName() ) or exists(Class c | c = this.getEnclosingScope() | diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll index c11e0cde64d..47f41d0cd05 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -809,6 +809,8 @@ predicate dictStoreStep(CfgNode nodeFrom, DictionaryElementContent c, Node nodeT * TODO: Once TaintTracking no longer uses `dictStoreStep`, unify the two predicates. */ private predicate moreDictStoreSteps(CfgNode nodeFrom, DictionaryElementContent c, Node nodeTo) { + // NOTE: It's important to add logic to the newtype definition of + // DictionaryElementContent if you add new cases here. exists(SubscriptNode subscript | nodeTo.(PostUpdateNode).getPreUpdateNode().asCfgNode() = subscript.getObject() and nodeFrom.asCfgNode() = subscript.(DefinitionNode).getValue() and diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll index 8f08efb0f93..73c87992c48 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll @@ -467,7 +467,7 @@ class IterableSequenceNode extends Node, TIterableSequenceNode { override string toString() { result = "IterableSequence" } - override DataFlowCallable getEnclosingCallable() { result = consumer.getEnclosingCallable() } + override Scope getScope() { result = consumer.getScope() } override Location getLocation() { result = consumer.getLocation() } } @@ -484,7 +484,7 @@ class IterableElementNode extends Node, TIterableElementNode { override string toString() { result = "IterableElement" } - override DataFlowCallable getEnclosingCallable() { result = consumer.getEnclosingCallable() } + override Scope getScope() { result = consumer.getScope() } override Location getLocation() { result = consumer.getLocation() } } @@ -499,7 +499,7 @@ class StarPatternElementNode extends Node, TStarPatternElementNode { override string toString() { result = "StarPatternElement" } - override DataFlowCallable getEnclosingCallable() { result = consumer.getEnclosingCallable() } + override Scope getScope() { result = consumer.getScope() } override Location getLocation() { result = consumer.getLocation() } } @@ -605,9 +605,19 @@ newtype TContent = } or /** An element of a dictionary under a specific key. */ TDictionaryElementContent(string key) { - key = any(KeyValuePair kvp).getKey().(StrConst).getS() + // {"key": ...} + key = any(KeyValuePair kvp).getKey().(StrConst).getText() or + // func(key=...) key = any(Keyword kw).getArg() + or + // d["key"] = ... + key = any(SubscriptNode sub | sub.isStore() | sub.getIndex().getNode().(StrConst).getText()) + or + // d.setdefault("key", ...) + exists(CallNode call | call.getFunction().(AttrNode).getName() = "setdefault" | + key = call.getArg(0).getNode().(StrConst).getText() + ) } or /** An element of a dictionary under any key. */ TDictionaryElementAnyContent() or diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 50762bcbf34..d4245aba7a6 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.9.10 + +### New Queries + +* The query `py/nosql-injection` for finding NoSQL injection vulnerabilities is now part of the default security suite. + ## 0.9.9 No user-facing changes. diff --git a/python/ql/src/Security/CWE-943/NoSqlInjection.ql b/python/ql/src/Security/CWE-943/NoSqlInjection.ql index b559159055f..cc5d57effe0 100644 --- a/python/ql/src/Security/CWE-943/NoSqlInjection.ql +++ b/python/ql/src/Security/CWE-943/NoSqlInjection.ql @@ -3,6 +3,7 @@ * @description Building a NoSQL query from user-controlled sources is vulnerable to insertion of * malicious NoSQL code by the user. * @kind path-problem + * @precision high * @problem.severity error * @security-severity 8.8 * @id py/nosql-injection diff --git a/python/ql/src/change-notes/released/0.9.10.md b/python/ql/src/change-notes/released/0.9.10.md new file mode 100644 index 00000000000..4cbb221b789 --- /dev/null +++ b/python/ql/src/change-notes/released/0.9.10.md @@ -0,0 +1,5 @@ +## 0.9.10 + +### New Queries + +* The query `py/nosql-injection` for finding NoSQL injection vulnerabilities is now part of the default security suite. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index aabed7c396b..d086ed69541 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.9.9 +lastReleaseVersion: 0.9.10 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 008073b66ca..c920f667836 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 0.9.9 +version: 0.9.10 groups: - python - queries diff --git a/python/ql/test/experimental/dataflow/coverage/module_level.py b/python/ql/test/experimental/dataflow/coverage/module_level.py new file mode 100644 index 00000000000..bd2d38088b1 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage/module_level.py @@ -0,0 +1,7 @@ +# this test has code on module level, which works in slightly different ways than when +# inside a function + +t = (SOURCE, NONSOURCE) +a, b = t +SINK(a) #$ flow="SOURCE, l:-2 -> a" +SINK_F(b) diff --git a/python/ql/test/experimental/dataflow/fieldflow/test_dict.py b/python/ql/test/experimental/dataflow/fieldflow/test_dict.py index c2f74b83c3d..f64a5187925 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/test_dict.py +++ b/python/ql/test/experimental/dataflow/fieldflow/test_dict.py @@ -45,6 +45,15 @@ def test_dict_update(): SINK(d["key"]) # $ flow="SOURCE, l:-1 -> d['key']" SINK(d.get("key")) # $ flow="SOURCE, l:-2 -> d.get(..)" + +def test_dict_update_fresh_key(): + # we had a regression where we did not create a dictionary element content + # for keys used in "inline update" like this + d = {} + d["fresh_key"] = SOURCE + SINK(d["fresh_key"]) # $ flow="SOURCE, l:-1 -> d['fresh_key']" + + @expects(3) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) def test_dict_setdefault(): d = {} diff --git a/ql/Cargo.lock b/ql/Cargo.lock index 6ea3f99faf5..3b8e7804688 100644 Binary files a/ql/Cargo.lock and b/ql/Cargo.lock differ diff --git a/ql/buramu/Cargo.toml b/ql/buramu/Cargo.toml index d6cfae88bc9..328501a05fa 100644 --- a/ql/buramu/Cargo.toml +++ b/ql/buramu/Cargo.toml @@ -8,5 +8,5 @@ edition = "2018" [dependencies] lazy_static = "1.4.0" chrono = "0.4.34" -rayon = "1.8.1" +rayon = "1.9.0" regex = "1.10.3" diff --git a/ql/extractor/Cargo.toml b/ql/extractor/Cargo.toml index 301abf60afb..bc8de165e65 100644 --- a/ql/extractor/Cargo.toml +++ b/ql/extractor/Cargo.toml @@ -15,6 +15,6 @@ tree-sitter-json = {git = "https://github.com/tausbn/tree-sitter-json.git", rev clap = { version = "4.2", features = ["derive"] } tracing = "0.1" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } -rayon = "1.8.1" +rayon = "1.9.0" regex = "1.10.3" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } diff --git a/ql/ql/src/codeql/IDEContextual.qll b/ql/ql/src/codeql/IDEContextual.qll index 0e58b1d878b..1c267d8f164 100644 --- a/ql/ql/src/codeql/IDEContextual.qll +++ b/ql/ql/src/codeql/IDEContextual.qll @@ -1,4 +1,5 @@ private import codeql.files.FileSystem +private import codeql.util.FileSystem /** * Returns an appropriately encoded version of a filename `name` @@ -7,13 +8,5 @@ private import codeql.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/ruby/BUILD.bazel b/ruby/BUILD.bazel new file mode 100644 index 00000000000..28cb046e3a6 --- /dev/null +++ b/ruby/BUILD.bazel @@ -0,0 +1,60 @@ +load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup", "pkg_files") +load("@semmle_code//:dist.bzl", "dist", "pack_zip") +load("//:defs.bzl", "codeql_platform") + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "dbscheme", + actual = "//ruby/ql/lib:dbscheme", +) + +alias( + name = "dbscheme-stats", + actual = "//ruby/ql/lib:dbscheme-stats", +) + +pkg_files( + name = "dbscheme-group", + srcs = [ + ":dbscheme", + ":dbscheme-stats", + ], + strip_prefix = None, +) + +pkg_filegroup( + name = "db-files", + srcs = [ + ":dbscheme-group", + "//ruby/downgrades", + ], +) + +pkg_files( + name = "codeql-extractor-yml", + srcs = ["codeql-extractor.yml"], + strip_prefix = None, +) + +dist( + name = "extractor-generic", + srcs = [ + ":codeql-extractor-yml", + ":dbscheme-group", + "//ruby/downgrades", + "//ruby/tools", + ], + prefix = "ruby", + visibility = ["//visibility:public"], +) + +pack_zip( + name = "extractor-arch", + srcs = [ + "//ruby/extractor", + ], + package_file_name = "extractor-" + codeql_platform + ".zip", + prefix = "ruby/tools/" + codeql_platform, + visibility = ["//visibility:public"], +) diff --git a/ruby/downgrades/BUILD.bazel b/ruby/downgrades/BUILD.bazel new file mode 100644 index 00000000000..39bea56f767 --- /dev/null +++ b/ruby/downgrades/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") + +pkg_files( + name = "downgrades", + srcs = glob( + ["**"], + exclude = ["BUILD.bazel"], + ), + prefix = "downgrades", + strip_prefix = strip_prefix.from_pkg(), + visibility = ["//ruby:__pkg__"], +) diff --git a/ruby/extractor/BUILD.bazel b/ruby/extractor/BUILD.bazel new file mode 100644 index 00000000000..e859884085d --- /dev/null +++ b/ruby/extractor/BUILD.bazel @@ -0,0 +1,15 @@ +load("@ruby_deps//:defs.bzl", "aliases", "all_crate_deps") +load("@semmle_code//:common.bzl", "codeql_rust_binary") + +codeql_rust_binary( + name = "extractor", + srcs = glob(["src/*.rs"]), + aliases = aliases(), + proc_macro_deps = all_crate_deps( + proc_macro = True, + ), + visibility = ["//visibility:public"], + deps = all_crate_deps( + normal = True, + ), +) diff --git a/ruby/extractor/Cargo.lock b/ruby/extractor/Cargo.lock index 328e597dd3b..d5e8f132f24 100644 Binary files a/ruby/extractor/Cargo.lock and b/ruby/extractor/Cargo.lock differ diff --git a/ruby/extractor/Cargo.toml b/ruby/extractor/Cargo.toml index 066505c3ef6..8bb8cd96dce 100644 --- a/ruby/extractor/Cargo.toml +++ b/ruby/extractor/Cargo.toml @@ -5,8 +5,15 @@ version = "0.1.0" authors = ["GitHub"] edition = "2018" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - +# When changing/updating these, the `cargo-bazel-lock.json` file has to be regenerated. +# Run `CARGO_BAZEL_REPIN=true CARGO_BAZEL_REPIN_ONLY=ruby_deps ./build --bazel sync --only=ruby_deps` +# in the `semmle-code` repository to do so. +# For more information, check out the documentation at +# https://bazelbuild.github.io/rules_rust/crate_universe.html#repinning--updating-dependencies +# In the future, the hope is to move this handling of the dependencies entirely into the `codeql` repository, +# but that depends on `rules_rust` being fully compatible with bzlmod, which they aren't yet +# (c.f. https://github.com/bazelbuild/rules_rust/issues/2452). +# Warning: The process takes >5min on my M1 mac, so do wait for a while. [dependencies] tree-sitter = "0.20" tree-sitter-embedded-template = { git = "https://github.com/tree-sitter/tree-sitter-embedded-template.git", rev = "203f7bd3c1bbfbd98fc19add4b8fcb213c059205" } @@ -18,4 +25,13 @@ rayon = "1.5.0" regex = "1.7.1" encoding = "0.2" lazy_static = "1.4.0" -codeql-extractor = { path = "../../shared/tree-sitter-extractor" } +# Ideally, we'd like to pull this in via a relative path. +# However, our bazel/rust tooling chokes on this, c.f. https://github.com/bazelbuild/rules_rust/issues/1525 +# Therefore, to break that dependency, we depend on it via a git dependency instead. +# We should change this back to a path dependency once this issue is fixed. +# We can't depend on this without a rev/branch specification, as the rules_rust code assumes the default branch +# is called `master`, and if we pull this in with `branch=main`, then `cargo` works (and pins this at th current git SHA +# of lock-file update time, but `rules_rust` pins generates a bazel rule that unconditionally downloads `main`, which +# breaks build hermeticity. So, rev-pinning it is. +# See also https://github.com/bazelbuild/rules_rust/issues/2502. +codeql-extractor = { git = "https://github.com/github/codeql.git", rev = "514a92d5bd1e24e4b7367d64430762ffd1ffbe7f" } diff --git a/ruby/extractor/Cross.toml b/ruby/extractor/Cross.toml deleted file mode 100644 index f3ed51aee59..00000000000 --- a/ruby/extractor/Cross.toml +++ /dev/null @@ -1,8 +0,0 @@ -[target.x86_64-unknown-linux-gnu] -image = "centos/devtoolset-7-toolchain-centos7" - -[build.env] -# Provide the path to the shared extractor -# Cross mounts this directory as a volume, so builds inside the docker container -# can see it. -volumes = ["__CODEQL-EXTRACTOR=../../shared/tree-sitter-extractor"] diff --git a/ruby/extractor/cargo-bazel-lock.json b/ruby/extractor/cargo-bazel-lock.json new file mode 100644 index 00000000000..76a63d4376d --- /dev/null +++ b/ruby/extractor/cargo-bazel-lock.json @@ -0,0 +1,8381 @@ +{ + "checksum": "1c460a0aa044e422d51b182416888e0a45d131996cc1821a0fedbab3cd2b07bf", + "crates": { + "adler 1.0.2": { + "name": "adler", + "version": "1.0.2", + "package_url": "https://github.com/jonas-schievink/adler.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/adler/1.0.2/download", + "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + } + }, + "targets": [ + { + "Library": { + "crate_name": "adler", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "adler", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.0.2" + }, + "license": "0BSD OR MIT OR Apache-2.0", + "license_ids": [ + "0BSD", + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "aho-corasick 0.7.20": { + "name": "aho-corasick", + "version": "0.7.20", + "package_url": "https://github.com/BurntSushi/aho-corasick", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/aho-corasick/0.7.20/download", + "sha256": "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aho_corasick", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "aho_corasick", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memchr 2.7.1", + "target": "memchr" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.7.20" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "aho-corasick 1.1.2": { + "name": "aho-corasick", + "version": "1.1.2", + "package_url": "https://github.com/BurntSushi/aho-corasick", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/aho-corasick/1.1.2/download", + "sha256": "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aho_corasick", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "aho_corasick", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "perf-literal", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memchr 2.7.1", + "target": "memchr" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.1.2" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "android_system_properties 0.1.5": { + "name": "android_system_properties", + "version": "0.1.5", + "package_url": "https://github.com/nical/android_system_properties", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/android_system_properties/0.1.5/download", + "sha256": "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" + } + }, + "targets": [ + { + "Library": { + "crate_name": "android_system_properties", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "android_system_properties", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.5" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstream 0.2.6": { + "name": "anstream", + "version": "0.2.6", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstream/0.2.6/download", + "sha256": "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstream", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstream", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "auto", + "default", + "wincon" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "anstyle 0.3.5", + "target": "anstyle" + }, + { + "id": "anstyle-parse 0.1.1", + "target": "anstyle_parse" + }, + { + "id": "concolor-override 1.0.0", + "target": "concolor_override" + }, + { + "id": "concolor-query 0.3.3", + "target": "concolor_query" + }, + { + "id": "is-terminal 0.4.6", + "target": "is_terminal" + }, + { + "id": "utf8parse 0.2.1", + "target": "utf8parse" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "anstyle-wincon 0.2.0", + "target": "anstyle_wincon" + } + ] + } + }, + "edition": "2021", + "version": "0.2.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstyle 0.3.5": { + "name": "anstyle", + "version": "0.3.5", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstyle/0.3.5/download", + "sha256": "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstyle", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstyle", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "0.3.5" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstyle-parse 0.1.1": { + "name": "anstyle-parse", + "version": "0.1.1", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstyle-parse/0.1.1/download", + "sha256": "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstyle_parse", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstyle_parse", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "utf8" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "utf8parse 0.2.1", + "target": "utf8parse" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstyle-wincon 0.2.0": { + "name": "anstyle-wincon", + "version": "0.2.0", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstyle-wincon/0.2.0/download", + "sha256": "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstyle_wincon", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstyle_wincon", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "anstyle 0.3.5", + "target": "anstyle" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2021", + "version": "0.2.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "autocfg 1.1.0": { + "name": "autocfg", + "version": "1.1.0", + "package_url": "https://github.com/cuviper/autocfg", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/autocfg/1.1.0/download", + "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "autocfg", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "autocfg", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.1.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "bitflags 1.3.2": { + "name": "bitflags", + "version": "1.3.2", + "package_url": "https://github.com/bitflags/bitflags", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/bitflags/1.3.2/download", + "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bitflags", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "bitflags", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2018", + "version": "1.3.2" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "bstr 1.9.0": { + "name": "bstr", + "version": "1.9.0", + "package_url": "https://github.com/BurntSushi/bstr", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/bstr/1.9.0/download", + "sha256": "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bstr", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "bstr", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memchr 2.7.1", + "target": "memchr" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.9.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "bumpalo 3.12.0": { + "name": "bumpalo", + "version": "3.12.0", + "package_url": "https://github.com/fitzgen/bumpalo", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/bumpalo/3.12.0/download", + "sha256": "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bumpalo", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "bumpalo", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2021", + "version": "3.12.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cc 1.0.79": { + "name": "cc", + "version": "1.0.79", + "package_url": "https://github.com/rust-lang/cc-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cc/1.0.79/download", + "sha256": "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.79" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cfg-if 1.0.0": { + "name": "cfg-if", + "version": "1.0.0", + "package_url": "https://github.com/alexcrichton/cfg-if", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cfg-if/1.0.0/download", + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cfg_if", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cfg_if", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "chrono 0.4.24": { + "name": "chrono", + "version": "0.4.24", + "package_url": "https://github.com/chronotope/chrono", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/chrono/0.4.24/download", + "sha256": "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "chrono", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "chrono", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "clock", + "default", + "iana-time-zone", + "js-sys", + "oldtime", + "serde", + "std", + "time", + "wasm-bindgen", + "wasmbind", + "winapi" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-integer 0.1.45", + "target": "num_integer" + }, + { + "id": "num-traits 0.2.15", + "target": "num_traits" + }, + { + "id": "serde 1.0.159", + "target": "serde" + }, + { + "id": "time 0.1.45", + "target": "time" + } + ], + "selects": { + "cfg(all(target_arch = \"wasm32\", not(any(target_os = \"emscripten\", target_os = \"wasi\"))))": [ + { + "id": "js-sys 0.3.61", + "target": "js_sys" + }, + { + "id": "wasm-bindgen 0.2.84", + "target": "wasm_bindgen" + } + ], + "cfg(unix)": [ + { + "id": "iana-time-zone 0.1.56", + "target": "iana_time_zone" + } + ], + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.4.24" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap 4.2.1": { + "name": "clap", + "version": "4.2.1", + "package_url": "https://github.com/clap-rs/clap", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap/4.2.1/download", + "sha256": "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "clap", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "color", + "default", + "derive", + "error-context", + "help", + "std", + "suggestions", + "usage" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "clap_builder 4.2.1", + "target": "clap_builder" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "clap_derive 4.2.0", + "target": "clap_derive" + } + ], + "selects": {} + }, + "version": "4.2.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap_builder 4.2.1": { + "name": "clap_builder", + "version": "4.2.1", + "package_url": "https://github.com/clap-rs/clap", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap_builder/4.2.1/download", + "sha256": "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "clap_builder", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap_builder", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "color", + "error-context", + "help", + "std", + "suggestions", + "usage" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "anstream 0.2.6", + "target": "anstream" + }, + { + "id": "anstyle 0.3.5", + "target": "anstyle" + }, + { + "id": "bitflags 1.3.2", + "target": "bitflags" + }, + { + "id": "clap_lex 0.4.1", + "target": "clap_lex" + }, + { + "id": "strsim 0.10.0", + "target": "strsim" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "4.2.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap_derive 4.2.0": { + "name": "clap_derive", + "version": "4.2.0", + "package_url": "https://github.com/clap-rs/clap/tree/master/clap_derive", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap_derive/4.2.0/download", + "sha256": "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "clap_derive", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap_derive", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "heck 0.4.1", + "target": "heck" + }, + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "4.2.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap_lex 0.4.1": { + "name": "clap_lex", + "version": "0.4.1", + "package_url": "https://github.com/clap-rs/clap/tree/master/clap_lex", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap_lex/0.4.1/download", + "sha256": "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "clap_lex", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap_lex", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "0.4.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "codeql-extractor 0.2.0": { + "name": "codeql-extractor", + "version": "0.2.0", + "package_url": null, + "repository": { + "Git": { + "remote": "https://github.com/github/codeql.git", + "commitish": { + "Rev": "514a92d5bd1e24e4b7367d64430762ffd1ffbe7f" + }, + "strip_prefix": "shared/tree-sitter-extractor" + } + }, + "targets": [ + { + "Library": { + "crate_name": "codeql_extractor", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "codeql_extractor", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "chrono 0.4.24", + "target": "chrono" + }, + { + "id": "encoding 0.2.33", + "target": "encoding" + }, + { + "id": "flate2 1.0.25", + "target": "flate2" + }, + { + "id": "globset 0.4.14", + "target": "globset" + }, + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "num_cpus 1.15.0", + "target": "num_cpus" + }, + { + "id": "rayon 1.7.0", + "target": "rayon" + }, + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "serde 1.0.159", + "target": "serde" + }, + { + "id": "serde_json 1.0.95", + "target": "serde_json" + }, + { + "id": "tracing 0.1.37", + "target": "tracing" + }, + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.2.0" + }, + "license": null, + "license_ids": [], + "license_file": null + }, + "codeql-extractor-ruby 0.1.0": { + "name": "codeql-extractor-ruby", + "version": "0.1.0", + "package_url": null, + "repository": null, + "targets": [], + "library_target_name": null, + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "clap 4.2.1", + "target": "clap" + }, + { + "id": "codeql-extractor 0.2.0", + "target": "codeql_extractor" + }, + { + "id": "encoding 0.2.33", + "target": "encoding" + }, + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "rayon 1.7.0", + "target": "rayon" + }, + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "tracing 0.1.37", + "target": "tracing" + }, + { + "id": "tracing-subscriber 0.3.16", + "target": "tracing_subscriber" + }, + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + }, + { + "id": "tree-sitter-embedded-template 0.20.0", + "target": "tree_sitter_embedded_template" + }, + { + "id": "tree-sitter-ruby 0.20.0", + "target": "tree_sitter_ruby" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.0" + }, + "license": null, + "license_ids": [], + "license_file": null + }, + "codespan-reporting 0.11.1": { + "name": "codespan-reporting", + "version": "0.11.1", + "package_url": "https://github.com/brendanzab/codespan", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/codespan-reporting/0.11.1/download", + "sha256": "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" + } + }, + "targets": [ + { + "Library": { + "crate_name": "codespan_reporting", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "codespan_reporting", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "termcolor 1.2.0", + "target": "termcolor" + }, + { + "id": "unicode-width 0.1.10", + "target": "unicode_width" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.11.1" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "concolor-override 1.0.0": { + "name": "concolor-override", + "version": "1.0.0", + "package_url": "https://github.com/rust-cli/concolor", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/concolor-override/1.0.0/download", + "sha256": "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "concolor_override", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "concolor_override", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "1.0.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "concolor-query 0.3.3": { + "name": "concolor-query", + "version": "0.3.3", + "package_url": "https://github.com/rust-cli/concolor", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/concolor-query/0.3.3/download", + "sha256": "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf" + } + }, + "targets": [ + { + "Library": { + "crate_name": "concolor_query", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "concolor_query", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2021", + "version": "0.3.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "core-foundation-sys 0.8.4": { + "name": "core-foundation-sys", + "version": "0.8.4", + "package_url": "https://github.com/servo/core-foundation-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/core-foundation-sys/0.8.4/download", + "sha256": "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "core_foundation_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "core_foundation_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.8.4" + }, + "license": "MIT / Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crc32fast 1.3.2": { + "name": "crc32fast", + "version": "1.3.2", + "package_url": "https://github.com/srijs/rust-crc32fast", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crc32fast/1.3.2/download", + "sha256": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crc32fast", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crc32fast", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crc32fast 1.3.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.3.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-channel 0.5.7": { + "name": "crossbeam-channel", + "version": "0.5.7", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-channel/0.5.7/download", + "sha256": "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_channel", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_channel", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "crossbeam-utils", + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.5.7" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-deque 0.8.3": { + "name": "crossbeam-deque", + "version": "0.8.3", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-deque/0.8.3/download", + "sha256": "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_deque", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_deque", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "crossbeam-epoch", + "crossbeam-utils", + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-epoch 0.9.14", + "target": "crossbeam_epoch" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.8.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-epoch 0.9.14": { + "name": "crossbeam-epoch", + "version": "0.9.14", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-epoch/0.9.14/download", + "sha256": "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_epoch", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_epoch", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-epoch 0.9.14", + "target": "build_script_build" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + }, + { + "id": "memoffset 0.8.0", + "target": "memoffset" + }, + { + "id": "scopeguard 1.1.0", + "target": "scopeguard" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.9.14" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-utils 0.8.15": { + "name": "crossbeam-utils", + "version": "0.8.15", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-utils/0.8.15/download", + "sha256": "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_utils", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_utils", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.8.15" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxx 1.0.94": { + "name": "cxx", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxx/1.0.94/download", + "sha256": "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cxx", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxx", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cxx 1.0.94", + "target": "build_script_build" + }, + { + "id": "link-cplusplus 1.0.8", + "target": "link_cplusplus" + } + ], + "selects": {} + }, + "edition": "2018", + "proc_macro_deps": { + "common": [ + { + "id": "cxxbridge-macro 1.0.94", + "target": "cxxbridge_macro" + } + ], + "selects": {} + }, + "version": "1.0.94" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + }, + { + "id": "cxxbridge-flags 1.0.94", + "target": "cxxbridge_flags" + } + ], + "selects": {} + }, + "link_deps": { + "common": [ + { + "id": "link-cplusplus 1.0.8", + "target": "link_cplusplus" + } + ], + "selects": {} + }, + "links": "cxxbridge1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxx-build 1.0.94": { + "name": "cxx-build", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxx-build/1.0.94/download", + "sha256": "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cxx_build", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxx_build", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + }, + { + "id": "codespan-reporting 0.11.1", + "target": "codespan_reporting" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + }, + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "scratch 1.0.5", + "target": "scratch" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.94" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxxbridge-flags 1.0.94": { + "name": "cxxbridge-flags", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxxbridge-flags/1.0.94/download", + "sha256": "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cxxbridge_flags", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxxbridge_flags", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.94" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxxbridge-macro 1.0.94": { + "name": "cxxbridge-macro", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxxbridge-macro/1.0.94/download", + "sha256": "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "cxxbridge_macro", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxxbridge_macro", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.94" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "either 1.8.1": { + "name": "either", + "version": "1.8.1", + "package_url": "https://github.com/bluss/either", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/either/1.8.1/download", + "sha256": "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + } + }, + "targets": [ + { + "Library": { + "crate_name": "either", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "either", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.8.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "encoding 0.2.33": { + "name": "encoding", + "version": "0.2.33", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding/0.2.33/download", + "sha256": "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding-index-japanese 1.20141219.5", + "target": "encoding_index_japanese" + }, + { + "id": "encoding-index-korean 1.20141219.5", + "target": "encoding_index_korean" + }, + { + "id": "encoding-index-simpchinese 1.20141219.5", + "target": "encoding_index_simpchinese" + }, + { + "id": "encoding-index-singlebyte 1.20141219.5", + "target": "encoding_index_singlebyte" + }, + { + "id": "encoding-index-tradchinese 1.20141219.5", + "target": "encoding_index_tradchinese" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.33" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "encoding-index-japanese 1.20141219.5": { + "name": "encoding-index-japanese", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-japanese/1.20141219.5/download", + "sha256": "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_japanese", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_japanese", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-korean 1.20141219.5": { + "name": "encoding-index-korean", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-korean/1.20141219.5/download", + "sha256": "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_korean", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_korean", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-simpchinese 1.20141219.5": { + "name": "encoding-index-simpchinese", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-simpchinese/1.20141219.5/download", + "sha256": "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_simpchinese", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_simpchinese", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-singlebyte 1.20141219.5": { + "name": "encoding-index-singlebyte", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-singlebyte/1.20141219.5/download", + "sha256": "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_singlebyte", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_singlebyte", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-tradchinese 1.20141219.5": { + "name": "encoding-index-tradchinese", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-tradchinese/1.20141219.5/download", + "sha256": "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_tradchinese", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_tradchinese", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding_index_tests 0.1.4": { + "name": "encoding_index_tests", + "version": "0.1.4", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding_index_tests/0.1.4/download", + "sha256": "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_tests", + "crate_root": "index_tests.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_tests", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.1.4" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "errno 0.3.0": { + "name": "errno", + "version": "0.3.0", + "package_url": "https://github.com/lambda-fairy/rust-errno", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/errno/0.3.0/download", + "sha256": "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "errno", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "errno", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(target_os = \"dragonfly\")": [ + { + "id": "errno-dragonfly 0.1.2", + "target": "errno_dragonfly" + } + ], + "cfg(target_os = \"hermit\")": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(target_os = \"wasi\")": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(unix)": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "0.3.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "errno-dragonfly 0.1.2": { + "name": "errno-dragonfly", + "version": "0.1.2", + "package_url": "https://github.com/mneumann/errno-dragonfly-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/errno-dragonfly/0.1.2/download", + "sha256": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" + } + }, + "targets": [ + { + "Library": { + "crate_name": "errno_dragonfly", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "errno_dragonfly", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "errno-dragonfly 0.1.2", + "target": "build_script_build" + }, + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "flate2 1.0.25": { + "name": "flate2", + "version": "1.0.25", + "package_url": "https://github.com/rust-lang/flate2-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/flate2/1.0.25/download", + "sha256": "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" + } + }, + "targets": [ + { + "Library": { + "crate_name": "flate2", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "flate2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "miniz_oxide", + "rust_backend" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "crc32fast 1.3.2", + "target": "crc32fast" + }, + { + "id": "miniz_oxide 0.6.2", + "target": "miniz_oxide" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.25" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "globset 0.4.14": { + "name": "globset", + "version": "0.4.14", + "package_url": "https://github.com/BurntSushi/ripgrep/tree/master/crates/globset", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/globset/0.4.14/download", + "sha256": "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "globset", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "globset", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "log" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 1.1.2", + "target": "aho_corasick" + }, + { + "id": "bstr 1.9.0", + "target": "bstr" + }, + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "regex-automata 0.4.3", + "target": "regex_automata" + }, + { + "id": "regex-syntax 0.8.2", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.14" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "heck 0.4.1": { + "name": "heck", + "version": "0.4.1", + "package_url": "https://github.com/withoutboats/heck", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/heck/0.4.1/download", + "sha256": "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "heck", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "heck", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.4.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "hermit-abi 0.2.6": { + "name": "hermit-abi", + "version": "0.2.6", + "package_url": "https://github.com/hermitcore/rusty-hermit", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/hermit-abi/0.2.6/download", + "sha256": "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" + } + }, + "targets": [ + { + "Library": { + "crate_name": "hermit_abi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "hermit_abi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.2.6" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "hermit-abi 0.3.1": { + "name": "hermit-abi", + "version": "0.3.1", + "package_url": "https://github.com/hermitcore/rusty-hermit", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/hermit-abi/0.3.1/download", + "sha256": "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + } + }, + "targets": [ + { + "Library": { + "crate_name": "hermit_abi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "hermit_abi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "0.3.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "iana-time-zone 0.1.56": { + "name": "iana-time-zone", + "version": "0.1.56", + "package_url": "https://github.com/strawlab/iana-time-zone", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/iana-time-zone/0.1.56/download", + "sha256": "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "iana_time_zone", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "iana_time_zone", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "fallback" + ], + "selects": {} + }, + "deps": { + "common": [], + "selects": { + "cfg(any(target_os = \"macos\", target_os = \"ios\"))": [ + { + "id": "core-foundation-sys 0.8.4", + "target": "core_foundation_sys" + } + ], + "cfg(target_arch = \"wasm32\")": [ + { + "id": "js-sys 0.3.61", + "target": "js_sys" + }, + { + "id": "wasm-bindgen 0.2.84", + "target": "wasm_bindgen" + } + ], + "cfg(target_os = \"android\")": [ + { + "id": "android_system_properties 0.1.5", + "target": "android_system_properties" + } + ], + "cfg(target_os = \"haiku\")": [ + { + "id": "iana-time-zone-haiku 0.1.1", + "target": "iana_time_zone_haiku" + } + ], + "cfg(target_os = \"windows\")": [ + { + "id": "windows 0.48.0", + "target": "windows" + } + ] + } + }, + "edition": "2018", + "version": "0.1.56" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "iana-time-zone-haiku 0.1.1": { + "name": "iana-time-zone-haiku", + "version": "0.1.1", + "package_url": "https://github.com/strawlab/iana-time-zone", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/iana-time-zone-haiku/0.1.1/download", + "sha256": "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" + } + }, + "targets": [ + { + "Library": { + "crate_name": "iana_time_zone_haiku", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "iana_time_zone_haiku", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cxx 1.0.94", + "target": "cxx" + }, + { + "id": "iana-time-zone-haiku 0.1.1", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.1" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cxx-build 1.0.94", + "target": "cxx_build" + } + ], + "selects": {} + }, + "link_deps": { + "common": [ + { + "id": "cxx 1.0.94", + "target": "cxx" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "io-lifetimes 1.0.10": { + "name": "io-lifetimes", + "version": "1.0.10", + "package_url": "https://github.com/sunfishcode/io-lifetimes", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/io-lifetimes/1.0.10/download", + "sha256": "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" + } + }, + "targets": [ + { + "Library": { + "crate_name": "io_lifetimes", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "io_lifetimes", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "close", + "default", + "hermit-abi", + "libc", + "windows-sys" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "io-lifetimes 1.0.10", + "target": "build_script_build" + } + ], + "selects": { + "cfg(not(windows))": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(target_os = \"hermit\")": [ + { + "id": "hermit-abi 0.3.1", + "target": "hermit_abi" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.48.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "1.0.10" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "is-terminal 0.4.6": { + "name": "is-terminal", + "version": "0.4.6", + "package_url": "https://github.com/sunfishcode/is-terminal", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/is-terminal/0.4.6/download", + "sha256": "256017f749ab3117e93acb91063009e1f1bb56d03965b14c2c8df4eb02c524d8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "is_terminal", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "is_terminal", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "io-lifetimes 1.0.10", + "target": "io_lifetimes" + } + ], + "selects": { + "cfg(not(any(windows, target_os = \"hermit\", target_os = \"unknown\")))": [ + { + "id": "rustix 0.37.7", + "target": "rustix" + } + ], + "cfg(target_os = \"hermit\")": [ + { + "id": "hermit-abi 0.3.1", + "target": "hermit_abi" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "0.4.6" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "itoa 1.0.6": { + "name": "itoa", + "version": "1.0.6", + "package_url": "https://github.com/dtolnay/itoa", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/itoa/1.0.6/download", + "sha256": "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "itoa", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "itoa", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "js-sys 0.3.61": { + "name": "js-sys", + "version": "0.3.61", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/js-sys/0.3.61/download", + "sha256": "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" + } + }, + "targets": [ + { + "Library": { + "crate_name": "js_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "js_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "wasm-bindgen 0.2.84", + "target": "wasm_bindgen" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.3.61" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "lazy_static 1.4.0": { + "name": "lazy_static", + "version": "1.4.0", + "package_url": "https://github.com/rust-lang-nursery/lazy-static.rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/lazy_static/1.4.0/download", + "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + } + }, + "targets": [ + { + "Library": { + "crate_name": "lazy_static", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "lazy_static", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.4.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "libc 0.2.141": { + "name": "libc", + "version": "0.2.141", + "package_url": "https://github.com/rust-lang/libc", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/libc/0.2.141/download", + "sha256": "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + } + }, + "targets": [ + { + "Library": { + "crate_name": "libc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "libc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": { + "aarch64-apple-darwin": [ + "extra_traits" + ], + "aarch64-apple-ios": [ + "extra_traits" + ], + "aarch64-apple-ios-sim": [ + "extra_traits" + ], + "aarch64-fuchsia": [ + "extra_traits" + ], + "aarch64-linux-android": [ + "extra_traits" + ], + "aarch64-unknown-linux-gnu": [ + "extra_traits" + ], + "aarch64-unknown-nixos-gnu": [ + "extra_traits" + ], + "aarch64-unknown-nto-qnx710": [ + "extra_traits" + ], + "arm-unknown-linux-gnueabi": [ + "extra_traits" + ], + "armv7-linux-androideabi": [ + "extra_traits" + ], + "armv7-unknown-linux-gnueabi": [ + "extra_traits" + ], + "i686-apple-darwin": [ + "extra_traits" + ], + "i686-linux-android": [ + "extra_traits" + ], + "i686-unknown-freebsd": [ + "extra_traits" + ], + "i686-unknown-linux-gnu": [ + "extra_traits" + ], + "powerpc-unknown-linux-gnu": [ + "extra_traits" + ], + "riscv32imc-unknown-none-elf": [ + "extra_traits" + ], + "riscv64gc-unknown-none-elf": [ + "extra_traits" + ], + "s390x-unknown-linux-gnu": [ + "extra_traits" + ], + "thumbv7em-none-eabi": [ + "extra_traits" + ], + "thumbv8m.main-none-eabi": [ + "extra_traits" + ], + "wasm32-wasi": [ + "extra_traits" + ], + "x86_64-apple-darwin": [ + "extra_traits" + ], + "x86_64-apple-ios": [ + "extra_traits" + ], + "x86_64-fuchsia": [ + "extra_traits" + ], + "x86_64-linux-android": [ + "extra_traits" + ], + "x86_64-unknown-freebsd": [ + "extra_traits" + ], + "x86_64-unknown-linux-gnu": [ + "extra_traits" + ], + "x86_64-unknown-nixos-gnu": [ + "extra_traits" + ], + "x86_64-unknown-none": [ + "extra_traits" + ] + } + }, + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.141" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "link-cplusplus 1.0.8": { + "name": "link-cplusplus", + "version": "1.0.8", + "package_url": "https://github.com/dtolnay/link-cplusplus", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/link-cplusplus/1.0.8/download", + "sha256": "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" + } + }, + "targets": [ + { + "Library": { + "crate_name": "link_cplusplus", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "link_cplusplus", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "link-cplusplus 1.0.8", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.8" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + }, + "links": "cplusplus" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "linux-raw-sys 0.3.1": { + "name": "linux-raw-sys", + "version": "0.3.1", + "package_url": "https://github.com/sunfishcode/linux-raw-sys", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/linux-raw-sys/0.3.1/download", + "sha256": "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "linux_raw_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "linux_raw_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "general", + "no_std" + ], + "selects": { + "aarch64-unknown-linux-gnu": [ + "errno", + "ioctl" + ], + "aarch64-unknown-nixos-gnu": [ + "errno", + "ioctl" + ], + "arm-unknown-linux-gnueabi": [ + "errno", + "ioctl" + ], + "armv7-unknown-linux-gnueabi": [ + "errno", + "ioctl" + ], + "i686-unknown-linux-gnu": [ + "errno", + "ioctl" + ], + "x86_64-unknown-linux-gnu": [ + "errno", + "ioctl" + ], + "x86_64-unknown-nixos-gnu": [ + "errno", + "ioctl" + ] + } + }, + "edition": "2018", + "version": "0.3.1" + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "log 0.4.20": { + "name": "log", + "version": "0.4.20", + "package_url": "https://github.com/rust-lang/log", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/log/0.4.20/download", + "sha256": "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "log", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "log", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "edition": "2015", + "version": "0.4.20" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "matchers 0.1.0": { + "name": "matchers", + "version": "0.1.0", + "package_url": "https://github.com/hawkw/matchers", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/matchers/0.1.0/download", + "sha256": "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" + } + }, + "targets": [ + { + "Library": { + "crate_name": "matchers", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "matchers", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "regex-automata 0.1.10", + "target": "regex_automata" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "memchr 2.7.1": { + "name": "memchr", + "version": "2.7.1", + "package_url": "https://github.com/BurntSushi/memchr", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/memchr/2.7.1/download", + "sha256": "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + } + }, + "targets": [ + { + "Library": { + "crate_name": "memchr", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "memchr", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "2.7.1" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "memoffset 0.8.0": { + "name": "memoffset", + "version": "0.8.0", + "package_url": "https://github.com/Gilnaa/memoffset", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/memoffset/0.8.0/download", + "sha256": "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "memoffset", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "memoffset", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memoffset 0.8.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.8.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "miniz_oxide 0.6.2": { + "name": "miniz_oxide", + "version": "0.6.2", + "package_url": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/miniz_oxide/0.6.2/download", + "sha256": "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "miniz_oxide", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "miniz_oxide", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "with-alloc" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "adler 1.0.2", + "target": "adler" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.6.2" + }, + "license": "MIT OR Zlib OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT", + "Zlib" + ], + "license_file": null + }, + "nu-ansi-term 0.46.0": { + "name": "nu-ansi-term", + "version": "0.46.0", + "package_url": "https://github.com/nushell/nu-ansi-term", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/nu-ansi-term/0.46.0/download", + "sha256": "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" + } + }, + "targets": [ + { + "Library": { + "crate_name": "nu_ansi_term", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "nu_ansi_term", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "overload 0.1.1", + "target": "overload" + } + ], + "selects": { + "cfg(target_os = \"windows\")": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.46.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "num-integer 0.1.45": { + "name": "num-integer", + "version": "0.1.45", + "package_url": "https://github.com/rust-num/num-integer", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/num-integer/0.1.45/download", + "sha256": "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_integer", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "num_integer", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "num-integer 0.1.45", + "target": "build_script_build" + }, + { + "id": "num-traits 0.2.15", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.1.45" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "num-traits 0.2.15": { + "name": "num-traits", + "version": "0.2.15", + "package_url": "https://github.com/rust-num/num-traits", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/num-traits/0.2.15/download", + "sha256": "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_traits", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "num_traits", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "num-traits 0.2.15", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.15" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "num_cpus 1.15.0": { + "name": "num_cpus", + "version": "1.15.0", + "package_url": "https://github.com/seanmonstar/num_cpus", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/num_cpus/1.15.0/download", + "sha256": "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_cpus", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "num_cpus", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(all(any(target_arch = \"x86_64\", target_arch = \"aarch64\"), target_os = \"hermit\"))": [ + { + "id": "hermit-abi 0.2.6", + "target": "hermit_abi" + } + ], + "cfg(not(windows))": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ] + } + }, + "edition": "2015", + "version": "1.15.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "once_cell 1.17.1": { + "name": "once_cell", + "version": "1.17.1", + "package_url": "https://github.com/matklad/once_cell", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/once_cell/1.17.1/download", + "sha256": "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "once_cell", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "once_cell", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "race", + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "1.17.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "overload 0.1.1": { + "name": "overload", + "version": "0.1.1", + "package_url": "https://github.com/danaugrs/overload", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/overload/0.1.1/download", + "sha256": "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + } + }, + "targets": [ + { + "Library": { + "crate_name": "overload", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "overload", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "0.1.1" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "pin-project-lite 0.2.9": { + "name": "pin-project-lite", + "version": "0.2.9", + "package_url": "https://github.com/taiki-e/pin-project-lite", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/pin-project-lite/0.2.9/download", + "sha256": "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pin_project_lite", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "pin_project_lite", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "0.2.9" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "proc-macro2 1.0.56": { + "name": "proc-macro2", + "version": "1.0.56", + "package_url": "https://github.com/dtolnay/proc-macro2", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/proc-macro2/1.0.56/download", + "sha256": "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" + } + }, + "targets": [ + { + "Library": { + "crate_name": "proc_macro2", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "proc_macro2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "proc-macro" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "build_script_build" + }, + { + "id": "unicode-ident 1.0.8", + "target": "unicode_ident" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.56" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "quote 1.0.26": { + "name": "quote", + "version": "1.0.26", + "package_url": "https://github.com/dtolnay/quote", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/quote/1.0.26/download", + "sha256": "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "quote", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "quote", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "proc-macro" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.26" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "rayon 1.7.0": { + "name": "rayon", + "version": "1.7.0", + "package_url": "https://github.com/rayon-rs/rayon", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/rayon/1.7.0/download", + "sha256": "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rayon", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "rayon", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "either 1.8.1", + "target": "either" + }, + { + "id": "rayon-core 1.11.0", + "target": "rayon_core" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.7.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "rayon-core 1.11.0": { + "name": "rayon-core", + "version": "1.11.0", + "package_url": "https://github.com/rayon-rs/rayon", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/rayon-core/1.11.0/download", + "sha256": "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rayon_core", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "rayon_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "crossbeam-channel 0.5.7", + "target": "crossbeam_channel" + }, + { + "id": "crossbeam-deque 0.8.3", + "target": "crossbeam_deque" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + }, + { + "id": "num_cpus 1.15.0", + "target": "num_cpus" + }, + { + "id": "rayon-core 1.11.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.11.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "links": "rayon-core" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex 1.7.3": { + "name": "regex", + "version": "1.7.3", + "package_url": "https://github.com/rust-lang/regex", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex/1.7.3/download", + "sha256": "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "aho-corasick", + "default", + "memchr", + "perf", + "perf-cache", + "perf-dfa", + "perf-inline", + "perf-literal", + "std", + "unicode", + "unicode-age", + "unicode-bool", + "unicode-case", + "unicode-gencat", + "unicode-perl", + "unicode-script", + "unicode-segment" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 0.7.20", + "target": "aho_corasick" + }, + { + "id": "memchr 2.7.1", + "target": "memchr" + }, + { + "id": "regex-syntax 0.6.29", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.7.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex-automata 0.1.10": { + "name": "regex-automata", + "version": "0.1.10", + "package_url": "https://github.com/BurntSushi/regex-automata", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-automata/0.1.10/download", + "sha256": "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_automata", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_automata", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "regex-syntax", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "regex-syntax 0.6.29", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.1.10" + }, + "license": "Unlicense/MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "regex-automata 0.4.3": { + "name": "regex-automata", + "version": "0.4.3", + "package_url": "https://github.com/rust-lang/regex/tree/master/regex-automata", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-automata/0.4.3/download", + "sha256": "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_automata", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_automata", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "hybrid", + "meta", + "nfa", + "nfa-backtrack", + "nfa-pikevm", + "nfa-thompson", + "perf", + "perf-inline", + "perf-literal", + "perf-literal-multisubstring", + "perf-literal-substring", + "std", + "syntax" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 1.1.2", + "target": "aho_corasick" + }, + { + "id": "memchr 2.7.1", + "target": "memchr" + }, + { + "id": "regex-syntax 0.8.2", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex-syntax 0.6.29": { + "name": "regex-syntax", + "version": "0.6.29", + "package_url": "https://github.com/rust-lang/regex", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-syntax/0.6.29/download", + "sha256": "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_syntax", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_syntax", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "unicode", + "unicode-age", + "unicode-bool", + "unicode-case", + "unicode-gencat", + "unicode-perl", + "unicode-script", + "unicode-segment" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.6.29" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex-syntax 0.8.2": { + "name": "regex-syntax", + "version": "0.8.2", + "package_url": "https://github.com/rust-lang/regex/tree/master/regex-syntax", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-syntax/0.8.2/download", + "sha256": "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_syntax", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_syntax", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "0.8.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "rustix 0.37.7": { + "name": "rustix", + "version": "0.37.7", + "package_url": "https://github.com/bytecodealliance/rustix", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/rustix/0.37.7/download", + "sha256": "2aae838e49b3d63e9274e1c01833cc8139d3fec468c3b84688c628f44b1ae11d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rustix", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "rustix", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "io-lifetimes", + "libc", + "std", + "termios", + "use-libc-auxv" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bitflags 1.3.2", + "target": "bitflags" + }, + { + "id": "io-lifetimes 1.0.10", + "target": "io_lifetimes" + }, + { + "id": "rustix 0.37.7", + "target": "build_script_build" + } + ], + "selects": { + "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\"))))))))": [ + { + "id": "linux-raw-sys 0.3.1", + "target": "linux_raw_sys" + } + ], + "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))": [ + { + "id": "libc 0.2.141", + "target": "libc" + }, + { + "id": "linux-raw-sys 0.3.1", + "target": "linux_raw_sys" + } + ], + "cfg(any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))))": [ + { + "id": "errno 0.3.0", + "target": "errno", + "alias": "libc_errno" + }, + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "0.37.7" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "ryu 1.0.13": { + "name": "ryu", + "version": "1.0.13", + "package_url": "https://github.com/dtolnay/ryu", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/ryu/1.0.13/download", + "sha256": "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ryu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "ryu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.13" + }, + "license": "Apache-2.0 OR BSL-1.0", + "license_ids": [ + "Apache-2.0", + "BSL-1.0" + ], + "license_file": null + }, + "scopeguard 1.1.0": { + "name": "scopeguard", + "version": "1.1.0", + "package_url": "https://github.com/bluss/scopeguard", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/scopeguard/1.1.0/download", + "sha256": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + } + }, + "targets": [ + { + "Library": { + "crate_name": "scopeguard", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "scopeguard", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.1.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "scratch 1.0.5": { + "name": "scratch", + "version": "1.0.5", + "package_url": "https://github.com/dtolnay/scratch", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/scratch/1.0.5/download", + "sha256": "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "scratch", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "scratch", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "scratch 1.0.5", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.0.5" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "serde 1.0.159": { + "name": "serde", + "version": "1.0.159", + "package_url": "https://github.com/serde-rs/serde", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/serde/1.0.159/download", + "sha256": "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" + } + }, + "targets": [ + { + "Library": { + "crate_name": "serde", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "serde", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "derive", + "serde_derive", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "serde 1.0.159", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "proc_macro_deps": { + "common": [ + { + "id": "serde_derive 1.0.159", + "target": "serde_derive" + } + ], + "selects": {} + }, + "version": "1.0.159" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "serde_derive 1.0.159": { + "name": "serde_derive", + "version": "1.0.159", + "package_url": "https://github.com/serde-rs/serde", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/serde_derive/1.0.159/download", + "sha256": "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "serde_derive", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "serde_derive", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "serde_derive 1.0.159", + "target": "build_script_build" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.0.159" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "serde_json 1.0.95": { + "name": "serde_json", + "version": "1.0.95", + "package_url": "https://github.com/serde-rs/json", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/serde_json/1.0.95/download", + "sha256": "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" + } + }, + "targets": [ + { + "Library": { + "crate_name": "serde_json", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "serde_json", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "itoa 1.0.6", + "target": "itoa" + }, + { + "id": "ryu 1.0.13", + "target": "ryu" + }, + { + "id": "serde 1.0.159", + "target": "serde" + }, + { + "id": "serde_json 1.0.95", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.95" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "sharded-slab 0.1.4": { + "name": "sharded-slab", + "version": "0.1.4", + "package_url": "https://github.com/hawkw/sharded-slab", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/sharded-slab/0.1.4/download", + "sha256": "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" + } + }, + "targets": [ + { + "Library": { + "crate_name": "sharded_slab", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "sharded_slab", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.4" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "smallvec 1.10.0": { + "name": "smallvec", + "version": "1.10.0", + "package_url": "https://github.com/servo/rust-smallvec", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/smallvec/1.10.0/download", + "sha256": "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "smallvec", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "smallvec", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.10.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "strsim 0.10.0": { + "name": "strsim", + "version": "0.10.0", + "package_url": "https://github.com/dguo/strsim-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/strsim/0.10.0/download", + "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + } + }, + "targets": [ + { + "Library": { + "crate_name": "strsim", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "strsim", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.10.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "syn 1.0.109": { + "name": "syn", + "version": "1.0.109", + "package_url": "https://github.com/dtolnay/syn", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/syn/1.0.109/download", + "sha256": "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" + } + }, + "targets": [ + { + "Library": { + "crate_name": "syn", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "syn", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "clone-impls", + "extra-traits", + "full", + "parsing", + "printing", + "proc-macro", + "quote", + "visit", + "visit-mut" + ], + "selects": { + "wasm32-unknown-unknown": [ + "default", + "derive" + ] + } + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "build_script_build" + }, + { + "id": "unicode-ident 1.0.8", + "target": "unicode_ident" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.109" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "syn 2.0.13": { + "name": "syn", + "version": "2.0.13", + "package_url": "https://github.com/dtolnay/syn", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/syn/2.0.13/download", + "sha256": "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" + } + }, + "targets": [ + { + "Library": { + "crate_name": "syn", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "syn", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "clone-impls", + "default", + "derive", + "full", + "parsing", + "printing", + "proc-macro", + "quote" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "unicode-ident 1.0.8", + "target": "unicode_ident" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "2.0.13" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "termcolor 1.2.0": { + "name": "termcolor", + "version": "1.2.0", + "package_url": "https://github.com/BurntSushi/termcolor", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/termcolor/1.2.0/download", + "sha256": "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "termcolor", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "termcolor", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(windows)": [ + { + "id": "winapi-util 0.1.5", + "target": "winapi_util" + } + ] + } + }, + "edition": "2018", + "version": "1.2.0" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "thread_local 1.1.7": { + "name": "thread_local", + "version": "1.1.7", + "package_url": "https://github.com/Amanieu/thread_local-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/thread_local/1.1.7/download", + "sha256": "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" + } + }, + "targets": [ + { + "Library": { + "crate_name": "thread_local", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "thread_local", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.1.7" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "time 0.1.45": { + "name": "time", + "version": "0.1.45", + "package_url": "https://github.com/time-rs/time", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/time/0.1.45/download", + "sha256": "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "time", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "time", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": { + "cfg(target_os = \"wasi\")": [ + { + "id": "wasi 0.10.0+wasi-snapshot-preview1", + "target": "wasi" + } + ], + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2015", + "version": "0.1.45" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "tracing 0.1.37": { + "name": "tracing", + "version": "0.1.37", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing/0.1.37/download", + "sha256": "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "attributes", + "default", + "std", + "tracing-attributes" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "pin-project-lite 0.2.9", + "target": "pin_project_lite" + }, + { + "id": "tracing-core 0.1.30", + "target": "tracing_core" + } + ], + "selects": {} + }, + "edition": "2018", + "proc_macro_deps": { + "common": [ + { + "id": "tracing-attributes 0.1.23", + "target": "tracing_attributes" + } + ], + "selects": {} + }, + "version": "0.1.37" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-attributes 0.1.23": { + "name": "tracing-attributes", + "version": "0.1.23", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-attributes/0.1.23/download", + "sha256": "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "tracing_attributes", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_attributes", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.23" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-core 0.1.30": { + "name": "tracing-core", + "version": "0.1.30", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-core/0.1.30/download", + "sha256": "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing_core", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "once_cell", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "once_cell 1.17.1", + "target": "once_cell" + } + ], + "selects": { + "cfg(tracing_unstable)": [ + { + "id": "valuable 0.1.0", + "target": "valuable" + } + ] + } + }, + "edition": "2018", + "version": "0.1.30" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-log 0.1.3": { + "name": "tracing-log", + "version": "0.1.3", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-log/0.1.3/download", + "sha256": "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing_log", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_log", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "log-tracer", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "tracing-core 0.1.30", + "target": "tracing_core" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.3" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-subscriber 0.3.16": { + "name": "tracing-subscriber", + "version": "0.3.16", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-subscriber/0.3.16/download", + "sha256": "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing_subscriber", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_subscriber", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "ansi", + "default", + "env-filter", + "fmt", + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "registry", + "sharded-slab", + "smallvec", + "std", + "thread_local", + "tracing", + "tracing-log" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "matchers 0.1.0", + "target": "matchers" + }, + { + "id": "nu-ansi-term 0.46.0", + "target": "nu_ansi_term" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + }, + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "sharded-slab 0.1.4", + "target": "sharded_slab" + }, + { + "id": "smallvec 1.10.0", + "target": "smallvec" + }, + { + "id": "thread_local 1.1.7", + "target": "thread_local" + }, + { + "id": "tracing 0.1.37", + "target": "tracing" + }, + { + "id": "tracing-core 0.1.30", + "target": "tracing_core" + }, + { + "id": "tracing-log 0.1.3", + "target": "tracing_log" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.3.16" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tree-sitter 0.20.10": { + "name": "tree-sitter", + "version": "0.20.10", + "package_url": "https://github.com/tree-sitter/tree-sitter", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tree-sitter/0.20.10/download", + "sha256": "e747b1f9b7b931ed39a548c1fae149101497de3c1fc8d9e18c62c1a66c683d3d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tree_sitter", + "crate_root": "binding_rust/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "binding_rust/build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tree_sitter", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "tree-sitter 0.20.10", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.20.10" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tree-sitter-embedded-template 0.20.0": { + "name": "tree-sitter-embedded-template", + "version": "0.20.0", + "package_url": "https://github.com/tree-sitter/tree-sitter-embedded-template", + "repository": { + "Git": { + "remote": "https://github.com/tree-sitter/tree-sitter-embedded-template.git", + "commitish": { + "Rev": "203f7bd3c1bbfbd98fc19add4b8fcb213c059205" + } + } + }, + "targets": [ + { + "Library": { + "crate_name": "tree_sitter_embedded_template", + "crate_root": "bindings/rust/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "bindings/rust/build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tree_sitter_embedded_template", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + }, + { + "id": "tree-sitter-embedded-template 0.20.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.20.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tree-sitter-ruby 0.20.0": { + "name": "tree-sitter-ruby", + "version": "0.20.0", + "package_url": "https://github.com/tree-sitter/tree-sitter-ruby", + "repository": { + "Git": { + "remote": "https://github.com/tree-sitter/tree-sitter-ruby.git", + "commitish": { + "Rev": "4d9ad3f010fdc47a8433adcf9ae30c8eb8475ae7" + } + } + }, + "targets": [ + { + "Library": { + "crate_name": "tree_sitter_ruby", + "crate_root": "bindings/rust/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "bindings/rust/build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tree_sitter_ruby", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + }, + { + "id": "tree-sitter-ruby 0.20.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.20.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "unicode-ident 1.0.8": { + "name": "unicode-ident", + "version": "1.0.8", + "package_url": "https://github.com/dtolnay/unicode-ident", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/unicode-ident/1.0.8/download", + "sha256": "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + } + }, + "targets": [ + { + "Library": { + "crate_name": "unicode_ident", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "unicode_ident", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.8" + }, + "license": "(MIT OR Apache-2.0) AND Unicode-DFS-2016", + "license_ids": [ + "Apache-2.0", + "MIT", + "Unicode-DFS-2016" + ], + "license_file": null + }, + "unicode-width 0.1.10": { + "name": "unicode-width", + "version": "0.1.10", + "package_url": "https://github.com/unicode-rs/unicode-width", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/unicode-width/0.1.10/download", + "sha256": "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "unicode_width", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "unicode_width", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.1.10" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "utf8parse 0.2.1": { + "name": "utf8parse", + "version": "0.2.1", + "package_url": "https://github.com/alacritty/vte", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/utf8parse/0.2.1/download", + "sha256": "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "utf8parse", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "utf8parse", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "valuable 0.1.0": { + "name": "valuable", + "version": "0.1.0", + "package_url": "https://github.com/tokio-rs/valuable", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/valuable/0.1.0/download", + "sha256": "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "valuable", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "valuable", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "valuable 0.1.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "wasi 0.10.0+wasi-snapshot-preview1": { + "name": "wasi", + "version": "0.10.0+wasi-snapshot-preview1", + "package_url": "https://github.com/bytecodealliance/wasi", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasi/0.10.0+wasi-snapshot-preview1/download", + "sha256": "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.10.0+wasi-snapshot-preview1" + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen 0.2.84": { + "name": "wasm-bindgen", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen/0.2.84/download", + "sha256": "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "spans", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "wasm-bindgen 0.2.84", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "proc_macro_deps": { + "common": [ + { + "id": "wasm-bindgen-macro 0.2.84", + "target": "wasm_bindgen_macro" + } + ], + "selects": {} + }, + "version": "0.2.84" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-backend 0.2.84": { + "name": "wasm-bindgen-backend", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-backend/0.2.84/download", + "sha256": "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen_backend", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_backend", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "spans" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bumpalo 3.12.0", + "target": "bumpalo" + }, + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + }, + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "syn" + }, + { + "id": "wasm-bindgen-shared 0.2.84", + "target": "wasm_bindgen_shared" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-macro 0.2.84": { + "name": "wasm-bindgen-macro", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-macro/0.2.84/download", + "sha256": "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "wasm_bindgen_macro", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_macro", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "spans" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "wasm-bindgen-macro-support 0.2.84", + "target": "wasm_bindgen_macro_support" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-macro-support 0.2.84": { + "name": "wasm-bindgen-macro-support", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-macro-support/0.2.84/download", + "sha256": "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen_macro_support", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_macro_support", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "spans" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "syn" + }, + { + "id": "wasm-bindgen-backend 0.2.84", + "target": "wasm_bindgen_backend" + }, + { + "id": "wasm-bindgen-shared 0.2.84", + "target": "wasm_bindgen_shared" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-shared 0.2.84": { + "name": "wasm-bindgen-shared", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-shared/0.2.84/download", + "sha256": "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen_shared", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_shared", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "wasm-bindgen-shared 0.2.84", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "links": "wasm_bindgen" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "winapi 0.3.9": { + "name": "winapi", + "version": "0.3.9", + "package_url": "https://github.com/retep998/winapi-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi/0.3.9/download", + "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "consoleapi", + "errhandlingapi", + "fileapi", + "handleapi", + "minwinbase", + "minwindef", + "ntdef", + "processenv", + "profileapi", + "std", + "sysinfoapi", + "timezoneapi" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "winapi 0.3.9", + "target": "build_script_build" + } + ], + "selects": { + "i686-pc-windows-gnu": [ + { + "id": "winapi-i686-pc-windows-gnu 0.4.0", + "target": "winapi_i686_pc_windows_gnu" + } + ], + "x86_64-pc-windows-gnu": [ + { + "id": "winapi-x86_64-pc-windows-gnu 0.4.0", + "target": "winapi_x86_64_pc_windows_gnu" + } + ] + } + }, + "edition": "2015", + "version": "0.3.9" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "winapi-i686-pc-windows-gnu 0.4.0": { + "name": "winapi-i686-pc-windows-gnu", + "version": "0.4.0", + "package_url": "https://github.com/retep998/winapi-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi-i686-pc-windows-gnu/0.4.0/download", + "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi_i686_pc_windows_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi_i686_pc_windows_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "winapi-i686-pc-windows-gnu 0.4.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.4.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "winapi-util 0.1.5": { + "name": "winapi-util", + "version": "0.1.5", + "package_url": "https://github.com/BurntSushi/winapi-util", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi-util/0.1.5/download", + "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi_util", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi_util", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.1.5" + }, + "license": "Unlicense/MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "winapi-x86_64-pc-windows-gnu 0.4.0": { + "name": "winapi-x86_64-pc-windows-gnu", + "version": "0.4.0", + "package_url": "https://github.com/retep998/winapi-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download", + "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi_x86_64_pc_windows_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi_x86_64_pc_windows_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "winapi-x86_64-pc-windows-gnu 0.4.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.4.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows 0.48.0": { + "name": "windows", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows/0.48.0/download", + "sha256": "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows-targets 0.48.0", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-sys 0.45.0": { + "name": "windows-sys", + "version": "0.45.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-sys/0.45.0/download", + "sha256": "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "Win32", + "Win32_Foundation", + "Win32_Storage", + "Win32_Storage_FileSystem", + "Win32_System", + "Win32_System_Console", + "default" + ], + "selects": {} + }, + "deps": { + "common": [], + "selects": { + "cfg(not(windows_raw_dylib))": [ + { + "id": "windows-targets 0.42.2", + "target": "windows_targets" + } + ] + } + }, + "edition": "2018", + "version": "0.45.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-sys 0.48.0": { + "name": "windows-sys", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-sys/0.48.0/download", + "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "Win32", + "Win32_Foundation", + "Win32_Networking", + "Win32_Networking_WinSock", + "Win32_Security", + "Win32_Storage", + "Win32_Storage_FileSystem", + "Win32_System", + "Win32_System_IO", + "Win32_System_Threading", + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "windows-targets 0.48.0", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-targets 0.42.2": { + "name": "windows-targets", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-targets/0.42.2/download", + "sha256": "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_targets", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_targets", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "aarch64-pc-windows-gnullvm": [ + { + "id": "windows_aarch64_gnullvm 0.42.2", + "target": "windows_aarch64_gnullvm" + } + ], + "aarch64-pc-windows-msvc": [ + { + "id": "windows_aarch64_msvc 0.42.2", + "target": "windows_aarch64_msvc" + } + ], + "aarch64-uwp-windows-msvc": [ + { + "id": "windows_aarch64_msvc 0.42.2", + "target": "windows_aarch64_msvc" + } + ], + "i686-pc-windows-gnu": [ + { + "id": "windows_i686_gnu 0.42.2", + "target": "windows_i686_gnu" + } + ], + "i686-pc-windows-msvc": [ + { + "id": "windows_i686_msvc 0.42.2", + "target": "windows_i686_msvc" + } + ], + "i686-uwp-windows-gnu": [ + { + "id": "windows_i686_gnu 0.42.2", + "target": "windows_i686_gnu" + } + ], + "i686-uwp-windows-msvc": [ + { + "id": "windows_i686_msvc 0.42.2", + "target": "windows_i686_msvc" + } + ], + "x86_64-pc-windows-gnu": [ + { + "id": "windows_x86_64_gnu 0.42.2", + "target": "windows_x86_64_gnu" + } + ], + "x86_64-pc-windows-gnullvm": [ + { + "id": "windows_x86_64_gnullvm 0.42.2", + "target": "windows_x86_64_gnullvm" + } + ], + "x86_64-pc-windows-msvc": [ + { + "id": "windows_x86_64_msvc 0.42.2", + "target": "windows_x86_64_msvc" + } + ], + "x86_64-uwp-windows-gnu": [ + { + "id": "windows_x86_64_gnu 0.42.2", + "target": "windows_x86_64_gnu" + } + ], + "x86_64-uwp-windows-msvc": [ + { + "id": "windows_x86_64_msvc 0.42.2", + "target": "windows_x86_64_msvc" + } + ] + } + }, + "edition": "2018", + "version": "0.42.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-targets 0.48.0": { + "name": "windows-targets", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-targets/0.48.0/download", + "sha256": "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_targets", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_targets", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(all(target_arch = \"aarch64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [ + { + "id": "windows_aarch64_gnullvm 0.48.0", + "target": "windows_aarch64_gnullvm" + } + ], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_aarch64_msvc 0.48.0", + "target": "windows_aarch64_msvc" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(windows_raw_dylib)))": [ + { + "id": "windows_i686_gnu 0.48.0", + "target": "windows_i686_gnu" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_i686_msvc 0.48.0", + "target": "windows_i686_msvc" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_gnu 0.48.0", + "target": "windows_x86_64_gnu" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_gnullvm 0.48.0", + "target": "windows_x86_64_gnullvm" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_msvc 0.48.0", + "target": "windows_x86_64_msvc" + } + ] + } + }, + "edition": "2018", + "version": "0.48.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_gnullvm 0.42.2": { + "name": "windows_aarch64_gnullvm", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_gnullvm/0.42.2/download", + "sha256": "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_gnullvm 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_gnullvm 0.48.0": { + "name": "windows_aarch64_gnullvm", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_gnullvm/0.48.0/download", + "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_gnullvm 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_msvc 0.42.2": { + "name": "windows_aarch64_msvc", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_msvc/0.42.2/download", + "sha256": "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_msvc 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_msvc 0.48.0": { + "name": "windows_aarch64_msvc", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_msvc/0.48.0/download", + "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_msvc 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_gnu 0.42.2": { + "name": "windows_i686_gnu", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_gnu/0.42.2/download", + "sha256": "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_gnu 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_gnu 0.48.0": { + "name": "windows_i686_gnu", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_gnu/0.48.0/download", + "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_gnu 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_msvc 0.42.2": { + "name": "windows_i686_msvc", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_msvc/0.42.2/download", + "sha256": "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_msvc 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_msvc 0.48.0": { + "name": "windows_i686_msvc", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_msvc/0.48.0/download", + "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_msvc 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnu 0.42.2": { + "name": "windows_x86_64_gnu", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnu/0.42.2/download", + "sha256": "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnu 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnu 0.48.0": { + "name": "windows_x86_64_gnu", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnu/0.48.0/download", + "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnu 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnullvm 0.42.2": { + "name": "windows_x86_64_gnullvm", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnullvm/0.42.2/download", + "sha256": "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnullvm 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnullvm 0.48.0": { + "name": "windows_x86_64_gnullvm", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnullvm/0.48.0/download", + "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnullvm 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_msvc 0.42.2": { + "name": "windows_x86_64_msvc", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_msvc/0.42.2/download", + "sha256": "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_msvc 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_msvc 0.48.0": { + "name": "windows_x86_64_msvc", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_msvc/0.48.0/download", + "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_msvc 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + } + }, + "binary_crates": [], + "workspace_members": { + "codeql-extractor-ruby 0.1.0": "ruby/extractor" + }, + "conditions": { + "aarch64-apple-darwin": [ + "aarch64-apple-darwin" + ], + "aarch64-apple-ios": [ + "aarch64-apple-ios" + ], + "aarch64-apple-ios-sim": [ + "aarch64-apple-ios-sim" + ], + "aarch64-fuchsia": [ + "aarch64-fuchsia" + ], + "aarch64-linux-android": [ + "aarch64-linux-android" + ], + "aarch64-pc-windows-gnullvm": [], + "aarch64-pc-windows-msvc": [ + "aarch64-pc-windows-msvc" + ], + "aarch64-unknown-linux-gnu": [ + "aarch64-unknown-linux-gnu" + ], + "aarch64-unknown-nixos-gnu": [ + "aarch64-unknown-nixos-gnu" + ], + "aarch64-unknown-nto-qnx710": [ + "aarch64-unknown-nto-qnx710" + ], + "aarch64-uwp-windows-msvc": [], + "arm-unknown-linux-gnueabi": [ + "arm-unknown-linux-gnueabi" + ], + "armv7-linux-androideabi": [ + "armv7-linux-androideabi" + ], + "armv7-unknown-linux-gnueabi": [ + "armv7-unknown-linux-gnueabi" + ], + "cfg(all(any(target_arch = \"x86_64\", target_arch = \"aarch64\"), target_os = \"hermit\"))": [], + "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\"))))))))": [ + "aarch64-linux-android", + "armv7-linux-androideabi", + "i686-linux-android", + "powerpc-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-linux-android" + ], + "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))": [ + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "arm-unknown-linux-gnueabi", + "armv7-unknown-linux-gnueabi", + "i686-unknown-linux-gnu", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu" + ], + "cfg(all(target_arch = \"aarch64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + "aarch64-pc-windows-msvc" + ], + "cfg(all(target_arch = \"wasm32\", not(any(target_os = \"emscripten\", target_os = \"wasi\"))))": [ + "wasm32-unknown-unknown" + ], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(windows_raw_dylib)))": [ + "i686-unknown-linux-gnu" + ], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + "i686-pc-windows-msvc" + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu" + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [], + "cfg(all(target_arch = \"x86_64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + "x86_64-pc-windows-msvc" + ], + "cfg(any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-nto-qnx710", + "armv7-linux-androideabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-pc-windows-msvc", + "i686-unknown-freebsd", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-unknown-unknown", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-pc-windows-msvc", + "x86_64-unknown-freebsd", + "x86_64-unknown-none" + ], + "cfg(any(target_os = \"macos\", target_os = \"ios\"))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "i686-apple-darwin", + "x86_64-apple-darwin", + "x86_64-apple-ios" + ], + "cfg(not(any(windows, target_os = \"hermit\", target_os = \"unknown\")))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu", + "x86_64-unknown-none" + ], + "cfg(not(windows))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-unknown-unknown", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu", + "x86_64-unknown-none" + ], + "cfg(not(windows_raw_dylib))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-pc-windows-msvc", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-unknown-unknown", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-pc-windows-msvc", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu", + "x86_64-unknown-none" + ], + "cfg(target_arch = \"wasm32\")": [ + "wasm32-unknown-unknown", + "wasm32-wasi" + ], + "cfg(target_os = \"android\")": [ + "aarch64-linux-android", + "armv7-linux-androideabi", + "i686-linux-android", + "x86_64-linux-android" + ], + "cfg(target_os = \"dragonfly\")": [], + "cfg(target_os = \"haiku\")": [], + "cfg(target_os = \"hermit\")": [], + "cfg(target_os = \"wasi\")": [ + "wasm32-wasi" + ], + "cfg(target_os = \"windows\")": [ + "aarch64-pc-windows-msvc", + "i686-pc-windows-msvc", + "x86_64-pc-windows-msvc" + ], + "cfg(tracing_unstable)": [], + "cfg(unix)": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu" + ], + "cfg(windows)": [ + "aarch64-pc-windows-msvc", + "i686-pc-windows-msvc", + "x86_64-pc-windows-msvc" + ], + "i686-apple-darwin": [ + "i686-apple-darwin" + ], + "i686-linux-android": [ + "i686-linux-android" + ], + "i686-pc-windows-gnu": [], + "i686-pc-windows-msvc": [ + "i686-pc-windows-msvc" + ], + "i686-unknown-freebsd": [ + "i686-unknown-freebsd" + ], + "i686-unknown-linux-gnu": [ + "i686-unknown-linux-gnu" + ], + "i686-uwp-windows-gnu": [], + "i686-uwp-windows-msvc": [], + "powerpc-unknown-linux-gnu": [ + "powerpc-unknown-linux-gnu" + ], + "riscv32imc-unknown-none-elf": [ + "riscv32imc-unknown-none-elf" + ], + "riscv64gc-unknown-none-elf": [ + "riscv64gc-unknown-none-elf" + ], + "s390x-unknown-linux-gnu": [ + "s390x-unknown-linux-gnu" + ], + "thumbv7em-none-eabi": [ + "thumbv7em-none-eabi" + ], + "thumbv8m.main-none-eabi": [ + "thumbv8m.main-none-eabi" + ], + "wasm32-unknown-unknown": [ + "wasm32-unknown-unknown" + ], + "wasm32-wasi": [ + "wasm32-wasi" + ], + "x86_64-apple-darwin": [ + "x86_64-apple-darwin" + ], + "x86_64-apple-ios": [ + "x86_64-apple-ios" + ], + "x86_64-fuchsia": [ + "x86_64-fuchsia" + ], + "x86_64-linux-android": [ + "x86_64-linux-android" + ], + "x86_64-pc-windows-gnu": [], + "x86_64-pc-windows-gnullvm": [], + "x86_64-pc-windows-msvc": [ + "x86_64-pc-windows-msvc" + ], + "x86_64-unknown-freebsd": [ + "x86_64-unknown-freebsd" + ], + "x86_64-unknown-linux-gnu": [ + "x86_64-unknown-linux-gnu" + ], + "x86_64-unknown-nixos-gnu": [ + "x86_64-unknown-nixos-gnu" + ], + "x86_64-unknown-none": [ + "x86_64-unknown-none" + ], + "x86_64-uwp-windows-gnu": [], + "x86_64-uwp-windows-msvc": [] + }, + "direct_deps": [ + "clap 4.2.1", + "codeql-extractor 0.2.0", + "encoding 0.2.33", + "lazy_static 1.4.0", + "rayon 1.7.0", + "regex 1.7.3", + "tracing 0.1.37", + "tracing-subscriber 0.3.16", + "tree-sitter 0.20.10", + "tree-sitter-embedded-template 0.20.0", + "tree-sitter-ruby 0.20.0" + ], + "direct_dev_deps": [] +} diff --git a/ruby/ql/lib/BUILD.bazel b/ruby/ql/lib/BUILD.bazel new file mode 100644 index 00000000000..54a65933149 --- /dev/null +++ b/ruby/ql/lib/BUILD.bazel @@ -0,0 +1,13 @@ +load("@rules_pkg//:mappings.bzl", "pkg_files") + +package(default_visibility = ["//ruby:__pkg__"]) + +pkg_files( + name = "dbscheme", + srcs = ["ruby.dbscheme"], +) + +pkg_files( + name = "dbscheme-stats", + srcs = ["ruby.dbscheme.stats"], +) diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index ddf84b34873..c61a12e0f4a 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,12 @@ +## 0.8.10 + +### Minor Analysis Improvements + +* Calls to `I18n.translate` as well as Rails helper translate methods now propagate taint from their keyword arguments. The Rails translate methods are also recognized as XSS sanitizers when using keys marked as html safe. +* Calls to `Arel::Nodes::SqlLiteral.new` are now modeled as instances of the `SqlConstruction` concept, as well as propagating taint from their argument. +* Additional arguments beyond the first of calls to the `ActiveRecord` methods `select`, `reselect`, `order`, `reorder`, `joins`, `group`, and `pluck` are now recognized as sql injection sinks. +* Calls to several methods of `ActiveRecord::Connection`, such as `ActiveRecord::Connection#exec_query`, are now recognized as SQL executions, including those via subclasses. + ## 0.8.9 ### Minor Analysis Improvements @@ -15,7 +24,7 @@ ### Minor Analysis Improvements -* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF`, ``, `` etc. in their names. Use the PascalCased versions instead. +* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF` etc. in their names. Use the PascalCased versions instead. * Deleted the deprecated `getAUse` and `getARhs` predicates from `API::Node`, use `getASource` and `getASink` instead. * Deleted the deprecated `disablesCertificateValidation` predicate from the `Http` module. * Deleted the deprecated `ParamsCall`, `CookiesCall`, and `ActionControllerControllerClass` classes from `ActionController.qll`, use the simarly named classes from `codeql.ruby.frameworks.Rails::Rails` instead. diff --git a/ruby/ql/lib/change-notes/released/0.8.10.md b/ruby/ql/lib/change-notes/released/0.8.10.md new file mode 100644 index 00000000000..666e28f840e --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.8.10.md @@ -0,0 +1,8 @@ +## 0.8.10 + +### Minor Analysis Improvements + +* Calls to `I18n.translate` as well as Rails helper translate methods now propagate taint from their keyword arguments. The Rails translate methods are also recognized as XSS sanitizers when using keys marked as html safe. +* Calls to `Arel::Nodes::SqlLiteral.new` are now modeled as instances of the `SqlConstruction` concept, as well as propagating taint from their argument. +* Additional arguments beyond the first of calls to the `ActiveRecord` methods `select`, `reselect`, `order`, `reorder`, `joins`, `group`, and `pluck` are now recognized as sql injection sinks. +* Calls to several methods of `ActiveRecord::Connection`, such as `ActiveRecord::Connection#exec_query`, are now recognized as SQL executions, including those via subclasses. diff --git a/ruby/ql/lib/change-notes/released/0.8.7.md b/ruby/ql/lib/change-notes/released/0.8.7.md index 454ab2b2c97..a4b443e17ec 100644 --- a/ruby/ql/lib/change-notes/released/0.8.7.md +++ b/ruby/ql/lib/change-notes/released/0.8.7.md @@ -2,7 +2,7 @@ ### Minor Analysis Improvements -* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF`, ``, `` etc. in their names. Use the PascalCased versions instead. +* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF` etc. in their names. Use the PascalCased versions instead. * Deleted the deprecated `getAUse` and `getARhs` predicates from `API::Node`, use `getASource` and `getASink` instead. * Deleted the deprecated `disablesCertificateValidation` predicate from the `Http` module. * Deleted the deprecated `ParamsCall`, `CookiesCall`, and `ActionControllerControllerClass` classes from `ActionController.qll`, use the simarly named classes from `codeql.ruby.frameworks.Rails::Rails` instead. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 5290c29b7fe..0521f0f75fa 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.9 +lastReleaseVersion: 0.8.10 diff --git a/ruby/ql/lib/codeql/IDEContextual.qll b/ruby/ql/lib/codeql/IDEContextual.qll index 0e58b1d878b..3b8486b4526 100644 --- a/ruby/ql/lib/codeql/IDEContextual.qll +++ b/ruby/ql/lib/codeql/IDEContextual.qll @@ -1,4 +1,9 @@ +/** + * Provides shared predicates related to contextual queries in the code viewer. + */ + private import codeql.files.FileSystem +private import codeql.util.FileSystem /** * Returns an appropriately encoded version of a filename `name` @@ -7,13 +12,5 @@ private import codeql.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/ruby/ql/lib/codeql/ruby/Frameworks.qll b/ruby/ql/lib/codeql/ruby/Frameworks.qll index 225db19dab5..9c66870c305 100644 --- a/ruby/ql/lib/codeql/ruby/Frameworks.qll +++ b/ruby/ql/lib/codeql/ruby/Frameworks.qll @@ -30,6 +30,7 @@ private import codeql.ruby.frameworks.Json private import codeql.ruby.frameworks.Erb private import codeql.ruby.frameworks.Slim private import codeql.ruby.frameworks.Sinatra +private import codeql.ruby.frameworks.Translation private import codeql.ruby.frameworks.Twirp private import codeql.ruby.frameworks.Sqlite3 private import codeql.ruby.frameworks.Mysql2 diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll index 65521d913d0..7a8e6dad9f8 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll @@ -31,4 +31,6 @@ module RubyDataFlow implements InputSig { predicate mayBenefitFromCallContext = Private::mayBenefitFromCallContext/1; predicate viableImplInCallContext = Private::viableImplInCallContext/2; + + predicate ignoreFieldFlowBranchLimit(DataFlowCallable c) { exists(c.asLibraryCallable()) } } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index dca2a310c9f..a7ef050f1c8 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -800,7 +800,17 @@ predicate nodeIsHidden(Node n) { or n = LocalFlow::getParameterDefNode(_) or - isDesugarNode(n.(ExprNode).getExprNode().getExpr()) + exists(AstNode desug | + isDesugarNode(desug) and + desug.isSynthesized() and + not desug = [any(ArrayLiteral al).getDesugared(), any(HashLiteral hl).getDesugared()] + | + desug = n.asExpr().getExpr() + or + desug = n.(PostUpdateNode).getPreUpdateNode().asExpr().getExpr() + or + desug = n.(ParameterNode).getParameter() + ) or n instanceof FlowSummaryNode or @@ -2177,7 +2187,7 @@ predicate allowParameterReturnInSelf(ParameterNodeImpl p) { FlowSummaryImpl::Private::summaryAllowParameterReturnInSelf(c.asLibraryCallable(), pos) ) or - VariableCapture::Flow::heuristicAllowInstanceParameterReturnInSelf(p.(SelfParameterNode) + VariableCapture::Flow::heuristicAllowInstanceParameterReturnInSelf(p.(LambdaSelfReferenceNode) .getCallable()) } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll index 4596c432070..f0917100058 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll @@ -176,11 +176,16 @@ private predicate sqlFragmentArgumentInner(DataFlow::CallNode call, DataFlow::No activeRecordQueryBuilderCall([ "delete_all", "delete_by", "destroy_all", "destroy_by", "exists?", "find_by", "find_by!", "find_or_create_by", "find_or_create_by!", "find_or_initialize_by", "find_by_sql", "from", - "group", "having", "joins", "lock", "not", "order", "reorder", "pluck", "where", "rewhere", - "select", "reselect" + "having", "lock", "not", "where", "rewhere" ]) and sink = call.getArgument(0) or + call = + activeRecordQueryBuilderCall([ + "group", "joins", "order", "reorder", "pluck", "select", "reselect" + ]) and + sink = call.getArgument(_) + or call = activeRecordQueryBuilderCall("calculate") and sink = call.getArgument(1) or @@ -200,7 +205,13 @@ private predicate sqlFragmentArgumentInner(DataFlow::CallNode call, DataFlow::No call = activeRecordQueryBuilderCall("annotate") and sink = call.getArgument(_) or - call = activeRecordConnectionInstance().getAMethodCall("execute") and + call = + activeRecordConnectionInstance() + .getAMethodCall([ + "create", "delete", "exec_query", "exec_delete", "exec_insert", "exec_update", + "execute", "insert", "select_all", "select_one", "select_rows", "select_value", + "select_values", "update" + ]) and sink = call.getArgument(0) or call = activeRecordQueryBuilderCall("update_all") and diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll b/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll index 92fcb9ac5b4..d4336cd35c5 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll @@ -39,4 +39,34 @@ module Arel { override DataFlow::Node getSql() { result = this.getArgument(0) } } + + /** + * Flow summary for `Arel::Nodes::SqlLiteral.new`. This method wraps a SQL string, marking it as + * safe. + */ + private class SqlLiteralNewSummary extends SummarizedCallable { + SqlLiteralNewSummary() { this = "Arel::Nodes::SqlLiteral.new" } + + override MethodCall getACall() { + result = any(ArelSqlLiteralNewConstruction c).asExpr().getExpr() + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + input = "Argument[0]" and output = "ReturnValue" and preservesValue = false + } + } + + /** A call to `Arel::Nodes::SqlLiteral.new`, considered as a SQL construction. */ + private class ArelSqlLiteralNewConstruction extends SqlConstruction::Range, DataFlow::CallNode { + ArelSqlLiteralNewConstruction() { + this.asExpr() = + API::getTopLevelMember("Arel") + .getMember("Nodes") + .getMember("SqlLiteral") + .getAMethodCall("new") + .asExpr() + } + + override DataFlow::Node getSql() { result = this.getArgument(0) } + } } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Translation.qll b/ruby/ql/lib/codeql/ruby/frameworks/Translation.qll new file mode 100644 index 00000000000..cf3f0aa77c4 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/Translation.qll @@ -0,0 +1,67 @@ +/** Provides modeling for the `I18n` translation method and the rails translation helpers. */ + +private import codeql.ruby.ApiGraphs +private import codeql.ruby.dataflow.FlowSummary +private import codeql.ruby.Concepts +private import codeql.ruby.frameworks.ActionView +private import codeql.ruby.frameworks.ActionController + +/** Gets a call to `I18n.translate`, which can use keyword arguments as inputs for string interpolation. */ +private MethodCall getI18nTranslateCall() { + result = API::getTopLevelMember("I18n").getAMethodCall(["t", "translate"]).asExpr().getExpr() +} + +/** + * Gets a call to the rails view helper translate method, which is a wrapper around `I18n.translate` + * that can also escape html if the key ends in `_html` or `.html`. + */ +private MethodCall getViewHelperTranslateCall() { + result.getMethodName() = ["t", "translate"] and + inActionViewContext(result) +} + +/** + * Gets a call to the rails controller helper translate method, which is a wrapper around `I18n.translate` + * that can also escape html if the key ends in `_html` or `.html`. + */ +private MethodCall getControllerHelperTranslateCall() { + result = + any(ActionControllerClass c) + .getSelf() + .track() + .getAMethodCall(["t", "translate"]) + .asExpr() + .getExpr() +} + +/** Flow summary for translation methods. */ +private class TranslateSummary extends SummarizedCallable { + TranslateSummary() { this = "I18n.translate" } + + override MethodCall getACall() { + result = + [getI18nTranslateCall(), getViewHelperTranslateCall(), getControllerHelperTranslateCall()] + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + input = "Argument[hash-splat].Element[any]" and + output = "ReturnValue" and + preservesValue = false + } +} + +/** A call to a translation helper method that escapes HTML. */ +private class TranslateHtmlEscape extends Escaping::Range, DataFlow::CallNode { + TranslateHtmlEscape() { + exists(MethodCall mc | mc = this.asExpr().getExpr() | + mc = [getViewHelperTranslateCall(), getControllerHelperTranslateCall()] and + mc.getArgument(0).getConstantValue().getStringlikeValue().matches(["%\\_html", "%.html"]) + ) + } + + override string getKind() { result = Escaping::getHtmlKind() } + + override DataFlow::Node getAnInput() { result = this.getKeywordArgument(_) } + + override DataFlow::Node getOutput() { result = this } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll b/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll index b24301b676d..87e4a713960 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll @@ -38,8 +38,8 @@ module Request { ParametersCall() { this.getMethodName() = [ - "parameters", "params", "GET", "POST", "query_parameters", "request_parameters", - "filtered_parameters" + "parameters", "params", "[]", "GET", "POST", "query_parameters", "request_parameters", + "filtered_parameters", "query_string" ] } @@ -64,7 +64,7 @@ module Request { this.getMethodName() = [ "authorization", "script_name", "path_info", "user_agent", "referer", "referrer", - "host_authority", "content_type", "host", "hostname", "accept_encoding", + "headers", "cookies", "cookie_jar", "content_type", "accept", "accept_encoding", "accept_language", "if_none_match", "if_none_match_etags", "content_mime_type" ] or @@ -86,8 +86,9 @@ module Request { HostCall() { this.getMethodName() = [ - "authority", "host", "host_authority", "host_with_port", "hostname", "forwarded_for", - "forwarded_host", "port", "forwarded_port" + "authority", "host", "host_authority", "host_with_port", "raw_host_with_port", "hostname", + "forwarded_for", "forwarded_host", "port", "forwarded_port", "port_string", "domain", + "subdomain", "subdomains" ] } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll index 96568e74902..2746faebdc8 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll @@ -44,7 +44,8 @@ module Kernel { */ private predicate isPublicKernelMethod(string method) { method in [ - "class", "clone", "frozen?", "tap", "then", "yield_self", "send", "public_send", "__send__" + "class", "clone", "frozen?", "tap", "then", "yield_self", "send", "public_send", "__send__", + "method", "public_method", "singleton_method" ] } @@ -176,6 +177,24 @@ module Kernel { override predicate runsArbitraryCode() { none() } } + /** + * A call to `method`, `public_method` or `singleton_method` which returns a method object. + * To actually execute the method, the `call` method needs to be called on the object. + * ```ruby + * m = method("exit") + * m.call() + * ``` + */ + class MethodCallCodeExecution extends CodeExecution::Range, KernelMethodCall { + MethodCallCodeExecution() { + this.getMethodName() = ["method", "public_method", "singleton_method"] + } + + override DataFlow::Node getCode() { result = this.getArgument(0) } + + override predicate runsArbitraryCode() { none() } + } + private class TapSummary extends SimpleSummarizedCallable { TapSummary() { this = "tap" } diff --git a/ruby/ql/lib/ide-contextual-queries/printCfg.ql b/ruby/ql/lib/ide-contextual-queries/printCfg.ql index c902474a55c..1c4cec61a3e 100644 --- a/ruby/ql/lib/ide-contextual-queries/printCfg.ql +++ b/ruby/ql/lib/ide-contextual-queries/printCfg.ql @@ -7,47 +7,35 @@ * @tags ide-contextual-queries/print-cfg */ -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput -private import codeql.IDEContextual private import codeql.Locations +private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl private import codeql.ruby.controlflow.ControlFlowGraph -/** - * Gets the source file to generate a CFG from. - */ external string selectedSourceFile(); -external string selectedSourceLine(); +private predicate selectedSourceFileAlias = selectedSourceFile/0; -external string selectedSourceColumn(); +external int selectedSourceLine(); -bindingset[file, line, column] -private CfgScope smallestEnclosingScope(File file, int line, int column) { - result = - min(Location loc, CfgScope scope | - loc = scope.getLocation() and - ( - loc.getStartLine() < line - or - loc.getStartLine() = line and loc.getStartColumn() <= column - ) and - ( - loc.getEndLine() > line - or - loc.getEndLine() = line and loc.getEndColumn() >= column - ) and - loc.getFile() = file - | - scope - order by - loc.getStartLine() desc, loc.getStartColumn() desc, loc.getEndLine(), loc.getEndColumn() - ) -} +private predicate selectedSourceLineAlias = selectedSourceLine/0; -class MyRelevantNode extends RelevantNode { - MyRelevantNode() { - this.getScope() = - smallestEnclosingScope(getFileBySourceArchiveName(selectedSourceFile()), - selectedSourceLine().toInt(), selectedSourceColumn().toInt()) +external int selectedSourceColumn(); + +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; + +module ViewCfgQueryInput implements ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } + +import ViewCfgQuery diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index b043b2ab7ab..de5b41999fe 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 0.8.9 +version: 0.8.10 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 4149c728eff..f875b6d16ad 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.8.10 + +### Minor Analysis Improvements + +* Calls to `Object#method`, `Object#public_method` and `Object#singleton_method` with untrusted data are now recognised as sinks for code injection. +* Added additional request sources for Ruby on Rails. + ## 0.8.9 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/0.8.10.md b/ruby/ql/src/change-notes/released/0.8.10.md new file mode 100644 index 00000000000..985cdf8d22e --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.8.10.md @@ -0,0 +1,6 @@ +## 0.8.10 + +### Minor Analysis Improvements + +* Calls to `Object#method`, `Object#public_method` and `Object#singleton_method` with untrusted data are now recognised as sinks for code injection. +* Added additional request sources for Ruby on Rails. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 5290c29b7fe..0521f0f75fa 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.9 +lastReleaseVersion: 0.8.10 diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qhelp b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qhelp new file mode 100644 index 00000000000..209e051f9f4 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qhelp @@ -0,0 +1,62 @@ + + + + +

    +Deserializing untrusted data using any method that allows the construction of +arbitrary objects is easily exploitable and, in many cases, allows an attacker +to execute arbitrary code. +

    +
    + + + +

    +If deserializing an untrusted YAML document using the psych gem, +prefer the safe_load and safe_load_file methods over +load and load_file, as the former will safely +handle untrusted data. Avoid passing untrusted data to the load_stream +method. In psych version 4.0.0 and above, the load method can +safely be used. +

    + +
    + + +

    +The following example calls the Marshal.load, +JSON.load, YAML.load, and Oj.load methods +on data from an HTTP request. Since these methods are capable of deserializing +to arbitrary objects, this is inherently unsafe. +

    + + +

    +Using JSON.parse and YAML.safe_load instead, as in the +following example, removes the vulnerability. Similarly, calling +Oj.load with any mode other than :object is safe, as +is calling Oj.safe_load. Note that there is no safe way to deserialize +untrusted data using Marshal. +

    + +
    + + + +
  • +OWASP vulnerability description: +deserialization of untrusted data. +
  • +
  • +Ruby documentation: guidance on deserializing objects safely. +
  • +
  • +Ruby documentation: security guidance on the YAML library. +
  • +
  • +You can read that how unsafe yaml load methods can lead to code executions: +Universal Deserialisation Gadget for Ruby 2.x-3.x . +
  • +
    + +
    diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.ql b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.ql new file mode 100644 index 00000000000..8e05c13361a --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.ql @@ -0,0 +1,21 @@ +/** + * @name Deserialization of user-controlled yaml data + * @description Deserializing user-controlled yaml data may allow attackers to + * execute arbitrary code. + * @kind path-problem + * @problem.severity warning + * @security-severity 9.8 + * @precision high + * @id rb/unsafe-unsafeyamldeserialization + * @tags security + * external/cwe/cwe-502 + */ + +import ruby +import codeql.ruby.security.UnsafeDeserializationQuery +import UnsafeCodeConstructionFlow::PathGraph + +from UnsafeCodeConstructionFlow::PathNode source, UnsafeCodeConstructionFlow::PathNode sink +where UnsafeCodeConstructionFlow::flowPath(source, sink) +select sink.getNode(), source, sink, "Unsafe deserialization depends on a $@.", source.getNode(), + source.getNode().(UnsafeDeserialization::Source).describe() diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll new file mode 100644 index 00000000000..6a4c06689ac --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll @@ -0,0 +1,85 @@ +/** + * Provides a taint-tracking configuration for reasoning about unsafe deserialization. + * + * Note, for performance reasons: only import this file if + * `UnsafeYamlDeserializationFlow` is needed, otherwise + * `UnsafeYamlDeserializationCustomizations` should be imported instead. + */ + +private import codeql.ruby.AST +private import codeql.ruby.DataFlow +private import codeql.ruby.TaintTracking +private import codeql.ruby.ApiGraphs +import UnsafeYamlDeserializationCustomizations::UnsafeYamlDeserialization +import Yaml + +private module UnsafeYamlDeserializationConfig implements DataFlow::StateConfigSig { + class FlowState = FlowState::State; + + predicate isSource(DataFlow::Node source, FlowState state) { + source instanceof Source and + (state instanceof FlowState::Parse or state instanceof FlowState::Load) + } + + predicate isSink(DataFlow::Node sink, FlowState state) { + sink instanceof Sink and + (state instanceof FlowState::Parse or state instanceof FlowState::Load) + } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + /** + * Holds if taint with state `stateFrom` can flow from `pred` to `succ` with state `stateTo`. + * + * This is a taint step related to the result of `YAML.parse` calls, or similar. + * In the following example, this step will propagate taint from + * `source` to `sink`: + * this contains two separate steps: + * ```rb + * x = source + * sink = YAML.parse(x) + * ``` + * By second step + * source is a Successor of `YAML.parse(x)` + * which ends with `to_ruby` or an Element of `to_ruby` + * ```ruby + * sink source.to_ruby # Unsafe call + * ``` + */ + predicate isAdditionalFlowStep( + DataFlow::Node pred, FlowState stateFrom, DataFlow::Node succ, FlowState stateTo + ) { + ( + exists(API::Node parseSuccessors, API::Node parseMethod | + parseMethod = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]) and + parseSuccessors = yamlParseNode(parseMethod) + | + succ = parseSuccessors.getMethod("to_ruby").getReturn().asSource() and + pred = parseMethod.getArgument(0).asSink() + ) + or + exists(API::Node parseMethod | + parseMethod = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]) + | + succ = parseMethod.getReturn().asSource() and + pred = parseMethod.getArgument(0).asSink() + ) + ) and + stateFrom instanceof FlowState::Parse and + stateTo instanceof FlowState::Parse + } +} + +predicate isAdditionalFlowStepTest(DataFlow::Node pred, DataFlow::Node succ) { + exists(API::Node parseMethod | + parseMethod = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]) + | + succ = parseMethod.getReturn().asSource() and + pred = parseMethod.getArgument(0).asSink() + ) +} + +/** + * Taint-tracking for reasoning about unsafe deserialization. + */ +module UnsafeCodeConstructionFlow = TaintTracking::GlobalWithState; diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserializationCustomizations.qll b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserializationCustomizations.qll new file mode 100644 index 00000000000..b244797b286 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserializationCustomizations.qll @@ -0,0 +1,136 @@ +/** + * Provides default sources, sinks and sanitizers for reasoning about unsafe + * deserialization, as well as extension points for adding your own. + */ + +private import codeql.ruby.AST +private import codeql.ruby.ApiGraphs +private import codeql.ruby.CFG +private import codeql.ruby.DataFlow +private import codeql.ruby.dataflow.RemoteFlowSources +private import codeql.ruby.frameworks.ActiveJob +private import codeql.ruby.frameworks.core.Module +private import codeql.ruby.frameworks.core.Kernel +private import Yaml + +module UnsafeYamlDeserialization { + /** Flow states used to distinguish whether we are using a yaml parse node or a yaml load node. */ + module FlowState { + private newtype TState = + TParse() or + TLoad() + + /** A flow state used to distinguish whether we have a middle node that use `YAML.load*` or `YAML.parse*` */ + class State extends TState { + /** + * Gets a string representation of this state. + */ + string toString() { result = this.getStringRepresentation() } + + /** + * Gets a canonical string representation of this state. + */ + string getStringRepresentation() { + this = TParse() and result = "parse" + or + this = TLoad() and result = "load" + } + } + + /** + * A flow state used for `YAML.parse*` methods. + */ + class Parse extends State, TParse { } + + /** + * A flow state used for `YAML.load*` methods. + */ + class Load extends State, TLoad { } + } + + /** + * A data flow source for unsafe deserialization vulnerabilities. + */ + abstract class Source extends DataFlow::Node { + /** Gets a string that describes the source. */ + string describe() { result = "user-provided value" } + } + + /** + * A data flow sink for unsafe deserialization vulnerabilities. + */ + abstract class Sink extends DataFlow::Node { } + + /** + * A sanitizer for unsafe deserialization vulnerabilities. + */ + abstract class Sanitizer extends DataFlow::Node { } + + /** A source of remote user input, considered as a flow source for unsafe deserialization. */ + class RemoteFlowSourceAsSource extends Source instanceof RemoteFlowSource { } + + /** A read of data from `STDIN`/`ARGV`, considered as a flow source for unsafe deserialization. */ + class StdInSource extends UnsafeYamlDeserialization::Source { + boolean stdin; + + StdInSource() { + this = API::getTopLevelMember(["STDIN", "ARGF"]).getAMethodCall(["gets", "read"]) and + stdin = true + or + // > $stdin == STDIN + // => true + // but $stdin is special in that it is a global variable and not a constant. `API::getTopLevelMember` only gets constants. + exists(DataFlow::Node dollarStdin | + dollarStdin.asExpr().getExpr().(GlobalVariableReadAccess).getVariable().getName() = "$stdin" and + this = dollarStdin.getALocalSource().getAMethodCall(["gets", "read"]) + ) and + stdin = true + or + // ARGV. + this.asExpr().getExpr().(GlobalVariableReadAccess).getVariable().getName() = "ARGV" and + stdin = false + or + this.(Kernel::KernelMethodCall).getMethodName() = ["gets", "readline", "readlines"] and + stdin = true + } + + override string describe() { + if stdin = true then result = "value from stdin" else result = "value from ARGV" + } + } + + /** + * An argument in a call to `YAML.unsafe_*` and `YAML.load_stream` , considered a sink + * for unsafe deserialization. The `YAML` module is an alias of `Psych` in + * recent versions of Ruby. + */ + class YamlLoadArgument extends Sink { + YamlLoadArgument() { + // Note: this is safe in psych/yaml >= 4.0.0. + this = yamlLibrary().getAMethodCall("load").getArgument(0) + or + this = + yamlLibrary() + .getAMethodCall(["unsafe_load_file", "unsafe_load", "load_stream"]) + .getArgument(0) + or + this = yamlLibrary().getAMethodCall(["unsafe_load", "load_stream"]).getKeywordArgument("yaml") + or + this = yamlLibrary().getAMethodCall("unsafe_load_file").getKeywordArgument("filename") + } + } + + /** + * An argument in a call to `YAML.parse*`, considered a sink for unsafe deserialization + * if there is a call to `to_ruby` on the returned value of any Successor. + */ + class YamlParseArgument extends Sink { + YamlParseArgument() { + this = + yamlParseNode(yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"])) + .getMethod(["to_ruby", "transform"]) + .getReturn() + .asSource() + } + } +} diff --git a/ruby/ql/src/experimental/cwe-502/Yaml.qll b/ruby/ql/src/experimental/cwe-502/Yaml.qll new file mode 100644 index 00000000000..3751faba312 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/Yaml.qll @@ -0,0 +1,33 @@ +/** + * Provides modeling for the `YAML` and `Psych` libraries. + */ + +private import codeql.ruby.dataflow.FlowSteps +private import codeql.ruby.DataFlow +private import codeql.ruby.ApiGraphs + +/** + * Gets A Node ends with YAML parse, parse_stream, parse_file methods + */ +API::Node yamlParseNode(API::Node yamlParseInstance) { + result = yamlParseInstance + or + result = yamlParseNode(yamlParseInstance).getReturn() + or + result = yamlParseNode(yamlParseInstance).getBlock() + or + result = yamlParseNode(yamlParseInstance).getAnElement() + or + result = yamlParseNode(yamlParseInstance).getParameter(_) + or + result = yamlParseNode(yamlParseInstance).getMethod(_) + or + result = yamlParseNode(yamlParseInstance).getMember(_) + or + result = yamlParseNode(yamlParseInstance).getArgument(_) +} + +/** + * Gets A YAML module instance + */ +API::Node yamlLibrary() { result = API::getTopLevelMember(["YAML", "Psych"]) } diff --git a/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationBad.rb b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationBad.rb new file mode 100644 index 00000000000..f4455ba3da0 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationBad.rb @@ -0,0 +1,16 @@ +require 'yaml' + +class UserController < ActionController::Base + def yaml_example + object = YAML.unsafe_load params[:yaml] + object = YAML.load_stream params[:yaml] + parsed_yaml = Psych.parse_stream(params[:yaml]) + + # to_ruby is unsafe + parsed_yaml.children.each do |child| + object = child.to_ruby + end + object = Psych.parse(params[:yaml]).to_ruby + # ... + end +end \ No newline at end of file diff --git a/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationGood.rb b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationGood.rb new file mode 100644 index 00000000000..99a1408cffc --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationGood.rb @@ -0,0 +1,10 @@ +require 'yaml' + +class UserController < ActionController::Base + def safe_yaml_example + object = YAML.load params[:yaml] + object = Psych.load_file params[:yaml] + object = YAML.safe_load params[:yaml] + # ... + end +end \ No newline at end of file diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index b0f0501437a..5e379268234 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 0.8.9 +version: 0.8.10 groups: - ruby - queries diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql index b4a5bbe946f..5e7dfe69d87 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -3,8 +3,9 @@ */ import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput -class MyRelevantNode extends RelevantNode { - MyRelevantNode() { exists(this) } +class MyRelevantNode extends CfgNode { + string getOrderDisambiguation() { result = "" } } + +import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput 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 046f19b454e..94906c18fb5 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 @@ -8,7 +8,8 @@ edges | array_flow.rb:5:10:5:10 | a [element 0] | array_flow.rb:5:10:5:13 | ...[...] | provenance | | | array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:11:10:11:10 | a [element 1] | provenance | | | array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:13:10:13:10 | a [element 1] | provenance | | -| array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:5:9:5 | a [element 1] | provenance | | +| array_flow.rb:9:9:9:25 | call to [] [element 1] | array_flow.rb:9:5:9:5 | a [element 1] | provenance | | +| array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:9:9:25 | call to [] [element 1] | provenance | | | array_flow.rb:11:10:11:10 | a [element 1] | array_flow.rb:11:10:11:13 | ...[...] | provenance | | | array_flow.rb:13:10:13:10 | a [element 1] | array_flow.rb:13:10:13:13 | ...[...] | provenance | | | array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:18:10:18:10 | a [element] | provenance | | @@ -31,15 +32,18 @@ edges | array_flow.rb:28:10:28:10 | c [element] | array_flow.rb:28:10:28:13 | ...[...] | provenance | | | array_flow.rb:29:10:29:10 | c [element] | array_flow.rb:29:10:29:13 | ...[...] | provenance | | | array_flow.rb:33:5:33:5 | a [element 0] | array_flow.rb:34:27:34:27 | a [element 0] | provenance | | -| array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:5:33:5 | a [element 0] | provenance | | +| array_flow.rb:33:9:33:22 | call to [] [element 0] | array_flow.rb:33:5:33:5 | a [element 0] | provenance | | +| array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:9:33:22 | call to [] [element 0] | provenance | | | array_flow.rb:34:5:34:5 | b [element 0] | array_flow.rb:35:10:35:10 | b [element 0] | provenance | | | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | array_flow.rb:34:5:34:5 | b [element 0] | provenance | | | array_flow.rb:34:27:34:27 | a [element 0] | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | provenance | | | array_flow.rb:35:10:35:10 | b [element 0] | array_flow.rb:35:10:35:13 | ...[...] | provenance | | | array_flow.rb:40:5:40:5 | a [element 0] | array_flow.rb:42:9:42:9 | a [element 0] | provenance | | -| array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:5:40:5 | a [element 0] | provenance | | +| array_flow.rb:40:9:40:24 | call to [] [element 0] | array_flow.rb:40:5:40:5 | a [element 0] | provenance | | +| array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:9:40:24 | call to [] [element 0] | provenance | | | array_flow.rb:41:5:41:5 | b [element 2] | array_flow.rb:42:13:42:13 | b [element 2] | provenance | | -| array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:5:41:5 | b [element 2] | provenance | | +| array_flow.rb:41:9:41:27 | call to [] [element 2] | array_flow.rb:41:5:41:5 | b [element 2] | provenance | | +| array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:9:41:27 | call to [] [element 2] | provenance | | | array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:43:10:43:10 | c [element] | provenance | | | array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:44:10:44:10 | c [element] | provenance | | | array_flow.rb:42:9:42:9 | a [element 0] | array_flow.rb:42:9:42:13 | ... & ... [element] | provenance | | @@ -48,7 +52,8 @@ edges | array_flow.rb:43:10:43:10 | c [element] | array_flow.rb:43:10:43:13 | ...[...] | provenance | | | array_flow.rb:44:10:44:10 | c [element] | array_flow.rb:44:10:44:13 | ...[...] | provenance | | | array_flow.rb:48:5:48:5 | a [element 0] | array_flow.rb:49:9:49:9 | a [element 0] | provenance | | -| array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:5:48:5 | a [element 0] | provenance | | +| array_flow.rb:48:9:48:22 | call to [] [element 0] | array_flow.rb:48:5:48:5 | a [element 0] | provenance | | +| array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:9:48:22 | call to [] [element 0] | provenance | | | array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:50:10:50:10 | b [element] | provenance | | | array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:51:10:51:10 | b [element] | provenance | | | array_flow.rb:49:9:49:9 | a [element 0] | array_flow.rb:49:9:49:13 | ... * ... [element] | provenance | | @@ -56,9 +61,11 @@ edges | array_flow.rb:50:10:50:10 | b [element] | array_flow.rb:50:10:50:13 | ...[...] | provenance | | | array_flow.rb:51:10:51:10 | b [element] | array_flow.rb:51:10:51:13 | ...[...] | provenance | | | array_flow.rb:55:5:55:5 | a [element 0] | array_flow.rb:57:9:57:9 | a [element 0] | provenance | | -| array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:5:55:5 | a [element 0] | provenance | | +| array_flow.rb:55:9:55:24 | call to [] [element 0] | array_flow.rb:55:5:55:5 | a [element 0] | provenance | | +| array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:9:55:24 | call to [] [element 0] | provenance | | | array_flow.rb:56:5:56:5 | b [element 1] | array_flow.rb:57:13:57:13 | b [element 1] | provenance | | -| array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:5:56:5 | b [element 1] | provenance | | +| array_flow.rb:56:9:56:24 | call to [] [element 1] | array_flow.rb:56:5:56:5 | b [element 1] | provenance | | +| array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:9:56:24 | call to [] [element 1] | provenance | | | array_flow.rb:57:5:57:5 | c [element 0] | array_flow.rb:58:10:58:10 | c [element 0] | provenance | | | array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:58:10:58:10 | c [element] | provenance | | | array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:59:10:59:10 | c [element] | provenance | | @@ -70,7 +77,8 @@ edges | array_flow.rb:58:10:58:10 | c [element] | array_flow.rb:58:10:58:13 | ...[...] | provenance | | | array_flow.rb:59:10:59:10 | c [element] | array_flow.rb:59:10:59:13 | ...[...] | provenance | | | array_flow.rb:63:5:63:5 | a [element 0] | array_flow.rb:65:9:65:9 | a [element 0] | provenance | | -| array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:5:63:5 | a [element 0] | provenance | | +| array_flow.rb:63:9:63:24 | call to [] [element 0] | array_flow.rb:63:5:63:5 | a [element 0] | provenance | | +| array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:9:63:24 | call to [] [element 0] | provenance | | | array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:66:10:66:10 | c [element] | provenance | | | array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:67:10:67:10 | c [element] | provenance | | | array_flow.rb:65:9:65:9 | a [element 0] | array_flow.rb:65:9:65:13 | ... - ... [element] | provenance | | @@ -79,7 +87,8 @@ edges | array_flow.rb:67:10:67:10 | c [element] | array_flow.rb:67:10:67:13 | ...[...] | provenance | | | array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:72:9:72:9 | a [element 0] | provenance | | | array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:73:10:73:10 | a [element 0] | provenance | | -| array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:5:71:5 | a [element 0] | provenance | | +| array_flow.rb:71:9:71:24 | call to [] [element 0] | array_flow.rb:71:5:71:5 | a [element 0] | provenance | | +| array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:9:71:24 | call to [] [element 0] | provenance | | | array_flow.rb:72:5:72:5 | b [element 0] | array_flow.rb:75:10:75:10 | b [element 0] | provenance | | | array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:75:10:75:10 | b [element] | provenance | | | array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:76:10:76:10 | b [element] | provenance | | @@ -97,11 +106,13 @@ edges | array_flow.rb:75:10:75:10 | b [element] | array_flow.rb:75:10:75:13 | ...[...] | provenance | | | array_flow.rb:76:10:76:10 | b [element] | array_flow.rb:76:10:76:13 | ...[...] | provenance | | | array_flow.rb:80:5:80:5 | a [element 1] | array_flow.rb:81:15:81:15 | a [element 1] | provenance | | -| array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:5:80:5 | a [element 1] | provenance | | +| array_flow.rb:80:9:80:25 | call to [] [element 1] | array_flow.rb:80:5:80:5 | a [element 1] | provenance | | +| array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:9:80:25 | call to [] [element 1] | provenance | | | array_flow.rb:81:8:81:8 | c | array_flow.rb:83:10:83:10 | c | provenance | | | array_flow.rb:81:15:81:15 | a [element 1] | array_flow.rb:81:8:81:8 | c | provenance | | | array_flow.rb:88:5:88:5 | a [element 1] | array_flow.rb:89:9:89:9 | a [element 1] | provenance | | -| array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:5:88:5 | a [element 1] | provenance | | +| array_flow.rb:88:9:88:26 | call to [] [element 1] | array_flow.rb:88:5:88:5 | a [element 1] | provenance | | +| array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:9:88:26 | call to [] [element 1] | provenance | | | array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:91:10:91:10 | b [element 1] | provenance | | | array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:92:10:92:10 | b [element 1] | provenance | | | array_flow.rb:89:9:89:9 | a [element 1] | array_flow.rb:89:9:89:15 | ...[...] [element 1] | provenance | | @@ -109,7 +120,8 @@ edges | array_flow.rb:91:10:91:10 | b [element 1] | array_flow.rb:91:10:91:13 | ...[...] | provenance | | | array_flow.rb:92:10:92:10 | b [element 1] | array_flow.rb:92:10:92:13 | ...[...] | provenance | | | array_flow.rb:96:5:96:5 | a [element 1] | array_flow.rb:97:9:97:9 | a [element 1] | provenance | | -| array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:5:96:5 | a [element 1] | provenance | | +| array_flow.rb:96:9:96:26 | call to [] [element 1] | array_flow.rb:96:5:96:5 | a [element 1] | provenance | | +| array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:9:96:26 | call to [] [element 1] | provenance | | | array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:99:10:99:10 | b [element 1] | provenance | | | array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:101:10:101:10 | b [element 1] | provenance | | | array_flow.rb:97:9:97:9 | a [element 1] | array_flow.rb:97:9:97:15 | ...[...] [element 1] | provenance | | @@ -117,7 +129,8 @@ edges | array_flow.rb:99:10:99:10 | b [element 1] | array_flow.rb:99:10:99:13 | ...[...] | provenance | | | array_flow.rb:101:10:101:10 | b [element 1] | array_flow.rb:101:10:101:13 | ...[...] | provenance | | | array_flow.rb:103:5:103:5 | a [element 1] | array_flow.rb:104:9:104:9 | a [element 1] | provenance | | -| array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:5:103:5 | a [element 1] | provenance | | +| array_flow.rb:103:9:103:39 | call to [] [element 1] | array_flow.rb:103:5:103:5 | a [element 1] | provenance | | +| array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:9:103:39 | call to [] [element 1] | provenance | | | array_flow.rb:104:5:104:5 | b [element 1] | array_flow.rb:106:10:106:10 | b [element 1] | provenance | | | array_flow.rb:104:9:104:9 | a [element 1] | array_flow.rb:104:9:104:16 | ...[...] [element 1] | provenance | | | array_flow.rb:104:9:104:16 | ...[...] [element 1] | array_flow.rb:104:5:104:5 | b [element 1] | provenance | | @@ -126,8 +139,10 @@ edges | array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:114:9:114:9 | a [element 1] | provenance | | | array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:110:9:110:9 | a [element 3] | provenance | | | array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:114:9:114:9 | a [element 3] | provenance | | -| array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:5:109:5 | a [element 1] | provenance | | -| array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:5:109:5 | a [element 3] | provenance | | +| array_flow.rb:109:9:109:42 | call to [] [element 1] | array_flow.rb:109:5:109:5 | a [element 1] | provenance | | +| array_flow.rb:109:9:109:42 | call to [] [element 3] | array_flow.rb:109:5:109:5 | a [element 3] | provenance | | +| array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:9:109:42 | call to [] [element 1] | provenance | | +| array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:9:109:42 | call to [] [element 3] | provenance | | | array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:111:10:111:10 | b [element] | provenance | | | array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:112:10:112:10 | b [element] | provenance | | | array_flow.rb:110:9:110:9 | a [element 1] | array_flow.rb:110:9:110:18 | ...[...] [element] | provenance | | @@ -152,7 +167,8 @@ edges | array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:130:10:130:10 | a [element] | provenance | | | array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:131:10:131:10 | a [element] | provenance | | | array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:132:10:132:10 | a [element] | provenance | | -| array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:5:129:5 | [post] a [element] | provenance | | +| array_flow.rb:129:15:129:32 | call to [] [element 1] | array_flow.rb:129:5:129:5 | [post] a [element] | provenance | | +| array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:15:129:32 | call to [] [element 1] | provenance | | | array_flow.rb:130:10:130:10 | a [element] | array_flow.rb:130:10:130:13 | ...[...] | provenance | | | array_flow.rb:131:10:131:10 | a [element] | array_flow.rb:131:10:131:13 | ...[...] | provenance | | | array_flow.rb:132:10:132:10 | a [element] | array_flow.rb:132:10:132:13 | ...[...] | provenance | | @@ -166,21 +182,25 @@ edges | array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:146:10:146:10 | a [element] | provenance | | | array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:147:10:147:10 | a [element] | provenance | | | array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:148:10:148:10 | a [element] | provenance | | -| array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:5:145:5 | [post] a [element] | provenance | | +| array_flow.rb:145:15:145:32 | call to [] [element 1] | array_flow.rb:145:5:145:5 | [post] a [element] | provenance | | +| array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:15:145:32 | call to [] [element 1] | provenance | | | array_flow.rb:146:10:146:10 | a [element] | array_flow.rb:146:10:146:13 | ...[...] | provenance | | | array_flow.rb:147:10:147:10 | a [element] | array_flow.rb:147:10:147:13 | ...[...] | provenance | | | array_flow.rb:148:10:148:10 | a [element] | array_flow.rb:148:10:148:13 | ...[...] | provenance | | | array_flow.rb:152:5:152:5 | a [element 2] | array_flow.rb:153:5:153:5 | a [element 2] | provenance | | -| array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:5:152:5 | a [element 2] | provenance | | +| array_flow.rb:152:9:152:26 | call to [] [element 2] | array_flow.rb:152:5:152:5 | a [element 2] | provenance | | +| array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:9:152:26 | call to [] [element 2] | provenance | | | array_flow.rb:153:5:153:5 | a [element 2] | array_flow.rb:153:16:153:16 | x | provenance | | | array_flow.rb:153:16:153:16 | x | array_flow.rb:154:14:154:14 | x | provenance | | | array_flow.rb:159:5:159:5 | a [element 2] | array_flow.rb:160:5:160:5 | a [element 2] | provenance | | -| array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:5:159:5 | a [element 2] | provenance | | +| array_flow.rb:159:9:159:26 | call to [] [element 2] | array_flow.rb:159:5:159:5 | a [element 2] | provenance | | +| array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:9:159:26 | call to [] [element 2] | provenance | | | array_flow.rb:160:5:160:5 | a [element 2] | array_flow.rb:160:16:160:16 | x | provenance | | | array_flow.rb:160:16:160:16 | x | array_flow.rb:161:14:161:14 | x | provenance | | | array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:167:9:167:9 | a [element 0] | provenance | | | array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:168:10:168:10 | a [element 0] | provenance | | -| array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:5:166:5 | a [element 0] | provenance | | +| array_flow.rb:166:9:166:25 | call to [] [element 0] | array_flow.rb:166:5:166:5 | a [element 0] | provenance | | +| array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:9:166:25 | call to [] [element 0] | provenance | | | array_flow.rb:167:5:167:5 | b [element 0] | array_flow.rb:170:10:170:10 | b [element 0] | provenance | | | array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:170:10:170:10 | b [element] | provenance | | | array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:171:10:171:10 | b [element] | provenance | | @@ -200,10 +220,12 @@ edges | array_flow.rb:170:10:170:10 | b [element] | array_flow.rb:170:10:170:13 | ...[...] | provenance | | | array_flow.rb:171:10:171:10 | b [element] | array_flow.rb:171:10:171:13 | ...[...] | provenance | | | array_flow.rb:177:5:177:5 | c [element 1] | array_flow.rb:178:16:178:16 | c [element 1] | provenance | | -| array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:5:177:5 | c [element 1] | provenance | | +| array_flow.rb:177:9:177:25 | call to [] [element 1] | array_flow.rb:177:5:177:5 | c [element 1] | provenance | | +| array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:9:177:25 | call to [] [element 1] | provenance | | | array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:179:11:179:11 | d [element 2, element 1] | provenance | | | array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:180:11:180:11 | d [element 2, element 1] | provenance | | -| array_flow.rb:178:16:178:16 | c [element 1] | array_flow.rb:178:5:178:5 | d [element 2, element 1] | provenance | | +| array_flow.rb:178:9:178:17 | call to [] [element 2, element 1] | array_flow.rb:178:5:178:5 | d [element 2, element 1] | provenance | | +| array_flow.rb:178:16:178:16 | c [element 1] | array_flow.rb:178:9:178:17 | call to [] [element 2, element 1] | provenance | | | array_flow.rb:179:11:179:11 | d [element 2, element 1] | array_flow.rb:179:11:179:22 | call to assoc [element 1] | provenance | | | array_flow.rb:179:11:179:22 | call to assoc [element 1] | array_flow.rb:179:11:179:25 | ...[...] | provenance | | | array_flow.rb:179:11:179:25 | ...[...] | array_flow.rb:179:10:179:26 | ( ... ) | provenance | | @@ -212,28 +234,34 @@ edges | array_flow.rb:180:11:180:25 | ...[...] | array_flow.rb:180:10:180:26 | ( ... ) | provenance | | | array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:186:10:186:10 | a [element 1] | provenance | | | array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:188:10:188:10 | a [element 1] | provenance | | -| array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:5:184:5 | a [element 1] | provenance | | +| array_flow.rb:184:9:184:26 | call to [] [element 1] | array_flow.rb:184:5:184:5 | a [element 1] | provenance | | +| array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:9:184:26 | call to [] [element 1] | provenance | | | array_flow.rb:186:10:186:10 | a [element 1] | array_flow.rb:186:10:186:16 | call to at | provenance | | | array_flow.rb:188:10:188:10 | a [element 1] | array_flow.rb:188:10:188:16 | call to at | provenance | | | array_flow.rb:192:5:192:5 | a [element 2] | array_flow.rb:193:9:193:9 | a [element 2] | provenance | | -| array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:5:192:5 | a [element 2] | provenance | | +| array_flow.rb:192:9:192:26 | call to [] [element 2] | array_flow.rb:192:5:192:5 | a [element 2] | provenance | | +| array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:9:192:26 | call to [] [element 2] | provenance | | | array_flow.rb:193:5:193:5 | b | array_flow.rb:196:10:196:10 | b | provenance | | | array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:9:195:7 | call to bsearch | provenance | | | array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:23:193:23 | x | provenance | | | array_flow.rb:193:9:195:7 | call to bsearch | array_flow.rb:193:5:193:5 | b | provenance | | | array_flow.rb:193:23:193:23 | x | array_flow.rb:194:14:194:14 | x | provenance | | | array_flow.rb:200:5:200:5 | a [element 2] | array_flow.rb:201:9:201:9 | a [element 2] | provenance | | -| array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:5:200:5 | a [element 2] | provenance | | +| array_flow.rb:200:9:200:26 | call to [] [element 2] | array_flow.rb:200:5:200:5 | a [element 2] | provenance | | +| array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:9:200:26 | call to [] [element 2] | provenance | | | array_flow.rb:201:9:201:9 | a [element 2] | array_flow.rb:201:29:201:29 | x | provenance | | | array_flow.rb:201:29:201:29 | x | array_flow.rb:202:14:202:14 | x | provenance | | | array_flow.rb:208:5:208:5 | a [element 2] | array_flow.rb:209:5:209:5 | a [element 2] | provenance | | -| array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:5:208:5 | a [element 2] | provenance | | +| array_flow.rb:208:9:208:26 | call to [] [element 2] | array_flow.rb:208:5:208:5 | a [element 2] | provenance | | +| array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:9:208:26 | call to [] [element 2] | provenance | | | array_flow.rb:209:5:209:5 | a [element 2] | array_flow.rb:209:17:209:17 | x | provenance | | | array_flow.rb:209:17:209:17 | x | array_flow.rb:210:14:210:14 | x | provenance | | | array_flow.rb:215:5:215:5 | a [element 2] | array_flow.rb:216:9:216:9 | a [element 2] | provenance | | | array_flow.rb:215:5:215:5 | a [element 3] | array_flow.rb:216:9:216:9 | a [element 3] | provenance | | -| array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:5:215:5 | a [element 2] | provenance | | -| array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:5:215:5 | a [element 3] | provenance | | +| array_flow.rb:215:9:215:42 | call to [] [element 2] | array_flow.rb:215:5:215:5 | a [element 2] | provenance | | +| array_flow.rb:215:9:215:42 | call to [] [element 3] | array_flow.rb:215:5:215:5 | a [element 3] | provenance | | +| array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:9:215:42 | call to [] [element 2] | provenance | | +| array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:9:215:42 | call to [] [element 3] | provenance | | | array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:27:216:27 | x | provenance | | | array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:30:216:30 | y | provenance | | | array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:27:216:27 | x | provenance | | @@ -241,7 +269,8 @@ edges | array_flow.rb:216:27:216:27 | x | array_flow.rb:217:14:217:14 | x | provenance | | | array_flow.rb:216:30:216:30 | y | array_flow.rb:218:14:218:14 | y | provenance | | | array_flow.rb:231:5:231:5 | a [element 2] | array_flow.rb:232:9:232:9 | a [element 2] | provenance | | -| array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:5:231:5 | a [element 2] | provenance | | +| array_flow.rb:231:9:231:28 | call to [] [element 2] | array_flow.rb:231:5:231:5 | a [element 2] | provenance | | +| array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:9:231:28 | call to [] [element 2] | provenance | | | array_flow.rb:232:5:232:5 | b [element] | array_flow.rb:236:10:236:10 | b [element] | provenance | | | array_flow.rb:232:9:232:9 | a [element 2] | array_flow.rb:232:23:232:23 | x | provenance | | | array_flow.rb:232:9:235:7 | call to collect [element] | array_flow.rb:232:5:232:5 | b [element] | provenance | | @@ -249,7 +278,8 @@ edges | array_flow.rb:234:9:234:19 | call to source | array_flow.rb:232:9:235:7 | call to collect [element] | provenance | | | array_flow.rb:236:10:236:10 | b [element] | array_flow.rb:236:10:236:13 | ...[...] | provenance | | | array_flow.rb:240:5:240:5 | a [element 2] | array_flow.rb:241:9:241:9 | a [element 2] | provenance | | -| array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:5:240:5 | a [element 2] | provenance | | +| array_flow.rb:240:9:240:28 | call to [] [element 2] | array_flow.rb:240:5:240:5 | a [element 2] | provenance | | +| array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:9:240:28 | call to [] [element 2] | provenance | | | array_flow.rb:241:5:241:5 | b [element] | array_flow.rb:246:10:246:10 | b [element] | provenance | | | array_flow.rb:241:9:241:9 | [post] a [element] | array_flow.rb:245:10:245:10 | a [element] | provenance | | | array_flow.rb:241:9:241:9 | a [element 2] | array_flow.rb:241:24:241:24 | x | provenance | | @@ -261,13 +291,15 @@ edges | array_flow.rb:246:10:246:10 | b [element] | array_flow.rb:246:10:246:13 | ...[...] | provenance | | | array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:251:9:251:9 | a [element 2] | provenance | | | array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:256:9:256:9 | a [element 2] | provenance | | -| array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:5:250:5 | a [element 2] | provenance | | +| array_flow.rb:250:9:250:28 | call to [] [element 2] | array_flow.rb:250:5:250:5 | a [element 2] | provenance | | +| array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:9:250:28 | call to [] [element 2] | provenance | | | array_flow.rb:251:5:251:5 | b [element] | array_flow.rb:255:10:255:10 | b [element] | provenance | | | array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | provenance | | | array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:30:251:30 | x | provenance | | | array_flow.rb:251:9:254:7 | call to collect_concat [element] | array_flow.rb:251:5:251:5 | b [element] | provenance | | | array_flow.rb:251:30:251:30 | x | array_flow.rb:252:14:252:14 | x | provenance | | -| array_flow.rb:253:13:253:24 | call to source | array_flow.rb:251:9:254:7 | call to collect_concat [element] | provenance | | +| array_flow.rb:253:9:253:25 | call to [] [element 1] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | provenance | | +| array_flow.rb:253:13:253:24 | call to source | array_flow.rb:253:9:253:25 | call to [] [element 1] | provenance | | | array_flow.rb:255:10:255:10 | b [element] | array_flow.rb:255:10:255:13 | ...[...] | provenance | | | array_flow.rb:256:5:256:5 | b [element] | array_flow.rb:260:10:260:10 | b [element] | provenance | | | array_flow.rb:256:9:256:9 | a [element 2] | array_flow.rb:256:30:256:30 | x | provenance | | @@ -276,7 +308,8 @@ edges | array_flow.rb:258:9:258:20 | call to source | array_flow.rb:256:9:259:7 | call to collect_concat [element] | provenance | | | array_flow.rb:260:10:260:10 | b [element] | array_flow.rb:260:10:260:13 | ...[...] | provenance | | | array_flow.rb:264:5:264:5 | a [element 2] | array_flow.rb:265:9:265:9 | a [element 2] | provenance | | -| array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:5:264:5 | a [element 2] | provenance | | +| array_flow.rb:264:9:264:26 | call to [] [element 2] | array_flow.rb:264:5:264:5 | a [element 2] | provenance | | +| array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:9:264:26 | call to [] [element 2] | provenance | | | array_flow.rb:265:5:265:5 | b [element 2] | array_flow.rb:269:10:269:10 | b [element 2] | provenance | | | array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:9:267:7 | call to combination [element 2] | provenance | | | array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:30:265:30 | x [element] | provenance | | @@ -285,13 +318,15 @@ edges | array_flow.rb:266:14:266:14 | x [element] | array_flow.rb:266:14:266:17 | ...[...] | provenance | | | array_flow.rb:269:10:269:10 | b [element 2] | array_flow.rb:269:10:269:13 | ...[...] | provenance | | | array_flow.rb:273:5:273:5 | a [element 2] | array_flow.rb:274:9:274:9 | a [element 2] | provenance | | -| array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:5:273:5 | a [element 2] | provenance | | +| array_flow.rb:273:9:273:26 | call to [] [element 2] | array_flow.rb:273:5:273:5 | a [element 2] | provenance | | +| array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:9:273:26 | call to [] [element 2] | provenance | | | array_flow.rb:274:5:274:5 | b [element] | array_flow.rb:275:10:275:10 | b [element] | provenance | | | array_flow.rb:274:9:274:9 | a [element 2] | array_flow.rb:274:9:274:17 | call to compact [element] | provenance | | | array_flow.rb:274:9:274:17 | call to compact [element] | array_flow.rb:274:5:274:5 | b [element] | provenance | | | array_flow.rb:275:10:275:10 | b [element] | array_flow.rb:275:10:275:13 | ...[...] | provenance | | | array_flow.rb:279:5:279:5 | a [element 2] | array_flow.rb:280:9:280:9 | a [element 2] | provenance | | -| array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:5:279:5 | a [element 2] | provenance | | +| array_flow.rb:279:9:279:26 | call to [] [element 2] | array_flow.rb:279:5:279:5 | a [element 2] | provenance | | +| array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:9:279:26 | call to [] [element 2] | provenance | | | array_flow.rb:280:5:280:5 | b [element] | array_flow.rb:282:10:282:10 | b [element] | provenance | | | array_flow.rb:280:9:280:9 | [post] a [element] | array_flow.rb:281:10:281:10 | a [element] | provenance | | | array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:9 | [post] a [element] | provenance | | @@ -300,9 +335,11 @@ edges | array_flow.rb:281:10:281:10 | a [element] | array_flow.rb:281:10:281:13 | ...[...] | provenance | | | array_flow.rb:282:10:282:10 | b [element] | array_flow.rb:282:10:282:13 | ...[...] | provenance | | | array_flow.rb:286:5:286:5 | a [element 2] | array_flow.rb:290:10:290:10 | a [element 2] | provenance | | -| array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:5:286:5 | a [element 2] | provenance | | +| array_flow.rb:286:9:286:28 | call to [] [element 2] | array_flow.rb:286:5:286:5 | a [element 2] | provenance | | +| array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:9:286:28 | call to [] [element 2] | provenance | | | array_flow.rb:287:5:287:5 | b [element 2] | array_flow.rb:288:14:288:14 | b [element 2] | provenance | | -| array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:5:287:5 | b [element 2] | provenance | | +| array_flow.rb:287:9:287:28 | call to [] [element 2] | array_flow.rb:287:5:287:5 | b [element 2] | provenance | | +| array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:9:287:28 | call to [] [element 2] | provenance | | | array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:289:10:289:10 | a [element] | provenance | | | array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:290:10:290:10 | a [element] | provenance | | | array_flow.rb:288:14:288:14 | b [element 2] | array_flow.rb:288:5:288:5 | [post] a [element] | provenance | | @@ -310,29 +347,35 @@ edges | array_flow.rb:290:10:290:10 | a [element 2] | array_flow.rb:290:10:290:13 | ...[...] | provenance | | | array_flow.rb:290:10:290:10 | a [element] | array_flow.rb:290:10:290:13 | ...[...] | provenance | | | array_flow.rb:294:5:294:5 | a [element 2] | array_flow.rb:295:5:295:5 | a [element 2] | provenance | | -| array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:5:294:5 | a [element 2] | provenance | | +| array_flow.rb:294:9:294:26 | call to [] [element 2] | array_flow.rb:294:5:294:5 | a [element 2] | provenance | | +| array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:9:294:26 | call to [] [element 2] | provenance | | | array_flow.rb:295:5:295:5 | a [element 2] | array_flow.rb:295:17:295:17 | x | provenance | | | array_flow.rb:295:17:295:17 | x | array_flow.rb:296:14:296:14 | x | provenance | | | array_flow.rb:301:5:301:5 | a [element 2] | array_flow.rb:302:5:302:5 | a [element 2] | provenance | | -| array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:5:301:5 | a [element 2] | provenance | | +| array_flow.rb:301:9:301:26 | call to [] [element 2] | array_flow.rb:301:5:301:5 | a [element 2] | provenance | | +| array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:9:301:26 | call to [] [element 2] | provenance | | | array_flow.rb:302:5:302:5 | a [element 2] | array_flow.rb:302:20:302:20 | x | provenance | | | array_flow.rb:302:20:302:20 | x | array_flow.rb:303:14:303:14 | x | provenance | | | array_flow.rb:308:5:308:5 | a [element 2] | array_flow.rb:309:9:309:9 | a [element 2] | provenance | | -| array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:5:308:5 | a [element 2] | provenance | | +| array_flow.rb:308:9:308:26 | call to [] [element 2] | array_flow.rb:308:5:308:5 | a [element 2] | provenance | | +| array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:9:308:26 | call to [] [element 2] | provenance | | | array_flow.rb:309:5:309:5 | b [element 2] | array_flow.rb:312:10:312:10 | b [element 2] | provenance | | | array_flow.rb:309:9:309:9 | a [element 2] | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | provenance | | | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | array_flow.rb:309:5:309:5 | b [element 2] | provenance | | | array_flow.rb:312:10:312:10 | b [element 2] | array_flow.rb:312:10:312:13 | ...[...] | provenance | | | array_flow.rb:316:5:316:5 | a [element 2] | array_flow.rb:317:9:317:9 | a [element 2] | provenance | | -| array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:5:316:5 | a [element 2] | provenance | | +| array_flow.rb:316:9:316:28 | call to [] [element 2] | array_flow.rb:316:5:316:5 | a [element 2] | provenance | | +| array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:9:316:28 | call to [] [element 2] | provenance | | | array_flow.rb:317:5:317:5 | b | array_flow.rb:318:10:318:10 | b | provenance | | | array_flow.rb:317:9:317:9 | a [element 2] | array_flow.rb:317:9:317:36 | call to delete | provenance | | | array_flow.rb:317:9:317:36 | call to delete | array_flow.rb:317:5:317:5 | b | provenance | | | array_flow.rb:317:23:317:34 | call to source | array_flow.rb:317:9:317:36 | call to delete | provenance | | | array_flow.rb:325:5:325:5 | a [element 2] | array_flow.rb:326:9:326:9 | a [element 2] | provenance | | | array_flow.rb:325:5:325:5 | a [element 3] | array_flow.rb:326:9:326:9 | a [element 3] | provenance | | -| array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:5:325:5 | a [element 2] | provenance | | -| array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:5:325:5 | a [element 3] | provenance | | +| array_flow.rb:325:9:325:42 | call to [] [element 2] | array_flow.rb:325:5:325:5 | a [element 2] | provenance | | +| array_flow.rb:325:9:325:42 | call to [] [element 3] | array_flow.rb:325:5:325:5 | a [element 3] | provenance | | +| array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:9:325:42 | call to [] [element 2] | provenance | | +| array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:9:325:42 | call to [] [element 3] | provenance | | | array_flow.rb:326:5:326:5 | b | array_flow.rb:327:10:327:10 | b | provenance | | | array_flow.rb:326:9:326:9 | [post] a [element 2] | array_flow.rb:328:10:328:10 | a [element 2] | provenance | | | array_flow.rb:326:9:326:9 | a [element 2] | array_flow.rb:326:9:326:22 | call to delete_at | provenance | | @@ -341,8 +384,10 @@ edges | array_flow.rb:328:10:328:10 | a [element 2] | array_flow.rb:328:10:328:13 | ...[...] | provenance | | | array_flow.rb:330:5:330:5 | a [element 2] | array_flow.rb:331:9:331:9 | a [element 2] | provenance | | | array_flow.rb:330:5:330:5 | a [element 3] | array_flow.rb:331:9:331:9 | a [element 3] | provenance | | -| array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:5:330:5 | a [element 2] | provenance | | -| array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:5:330:5 | a [element 3] | provenance | | +| array_flow.rb:330:9:330:42 | call to [] [element 2] | array_flow.rb:330:5:330:5 | a [element 2] | provenance | | +| array_flow.rb:330:9:330:42 | call to [] [element 3] | array_flow.rb:330:5:330:5 | a [element 3] | provenance | | +| array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:9:330:42 | call to [] [element 2] | provenance | | +| array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:9:330:42 | call to [] [element 3] | provenance | | | array_flow.rb:331:5:331:5 | b | array_flow.rb:332:10:332:10 | b | provenance | | | array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:333:10:333:10 | a [element] | provenance | | | array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:334:10:334:10 | a [element] | provenance | | @@ -354,7 +399,8 @@ edges | array_flow.rb:333:10:333:10 | a [element] | array_flow.rb:333:10:333:13 | ...[...] | provenance | | | array_flow.rb:334:10:334:10 | a [element] | array_flow.rb:334:10:334:13 | ...[...] | provenance | | | array_flow.rb:338:5:338:5 | a [element 2] | array_flow.rb:339:9:339:9 | a [element 2] | provenance | | -| array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:5:338:5 | a [element 2] | provenance | | +| array_flow.rb:338:9:338:26 | call to [] [element 2] | array_flow.rb:338:5:338:5 | a [element 2] | provenance | | +| array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:9:338:26 | call to [] [element 2] | provenance | | | array_flow.rb:339:5:339:5 | b [element] | array_flow.rb:342:10:342:10 | b [element] | provenance | | | array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:343:10:343:10 | a [element] | provenance | | | array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:344:10:344:10 | a [element] | provenance | | @@ -369,7 +415,8 @@ edges | array_flow.rb:344:10:344:10 | a [element] | array_flow.rb:344:10:344:13 | ...[...] | provenance | | | array_flow.rb:345:10:345:10 | a [element] | array_flow.rb:345:10:345:13 | ...[...] | provenance | | | array_flow.rb:349:5:349:5 | a [element 2] | array_flow.rb:350:9:350:9 | a [element 2] | provenance | | -| array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:5:349:5 | a [element 2] | provenance | | +| array_flow.rb:349:9:349:26 | call to [] [element 2] | array_flow.rb:349:5:349:5 | a [element 2] | provenance | | +| array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:9:349:26 | call to [] [element 2] | provenance | | | array_flow.rb:350:5:350:5 | b [element] | array_flow.rb:351:10:351:10 | b [element] | provenance | | | array_flow.rb:350:9:350:9 | a [element 2] | array_flow.rb:350:9:350:25 | call to difference [element] | provenance | | | array_flow.rb:350:9:350:25 | call to difference [element] | array_flow.rb:350:5:350:5 | b [element] | provenance | | @@ -377,13 +424,17 @@ edges | array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:357:10:357:10 | a [element 2] | provenance | | | array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:358:10:358:10 | a [element 2] | provenance | | | array_flow.rb:355:5:355:5 | a [element 3, element 1] | array_flow.rb:360:10:360:10 | a [element 3, element 1] | provenance | | -| array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:5:355:5 | a [element 2] | provenance | | -| array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:5:355:5 | a [element 3, element 1] | provenance | | +| array_flow.rb:355:9:355:47 | call to [] [element 2] | array_flow.rb:355:5:355:5 | a [element 2] | provenance | | +| array_flow.rb:355:9:355:47 | call to [] [element 3, element 1] | array_flow.rb:355:5:355:5 | a [element 3, element 1] | provenance | | +| array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:9:355:47 | call to [] [element 2] | provenance | | +| array_flow.rb:355:30:355:46 | call to [] [element 1] | array_flow.rb:355:9:355:47 | call to [] [element 3, element 1] | provenance | | +| array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:30:355:46 | call to [] [element 1] | provenance | | | array_flow.rb:357:10:357:10 | a [element 2] | array_flow.rb:357:10:357:17 | call to dig | provenance | | | array_flow.rb:358:10:358:10 | a [element 2] | array_flow.rb:358:10:358:17 | call to dig | provenance | | | array_flow.rb:360:10:360:10 | a [element 3, element 1] | array_flow.rb:360:10:360:19 | call to dig | provenance | | | array_flow.rb:364:5:364:5 | a [element 2] | array_flow.rb:365:9:365:9 | a [element 2] | provenance | | -| array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:5:364:5 | a [element 2] | provenance | | +| array_flow.rb:364:9:364:28 | call to [] [element 2] | array_flow.rb:364:5:364:5 | a [element 2] | provenance | | +| array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:9:364:28 | call to [] [element 2] | provenance | | | array_flow.rb:365:5:365:5 | b | array_flow.rb:368:10:368:10 | b | provenance | | | array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:9:367:7 | call to detect | provenance | | | array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:43:365:43 | x | provenance | | @@ -395,8 +446,10 @@ edges | array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:380:9:380:9 | a [element 2] | provenance | | | array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:373:9:373:9 | a [element 3] | provenance | | | array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:375:9:375:9 | a [element 3] | provenance | | -| array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:5:372:5 | a [element 2] | provenance | | -| array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:5:372:5 | a [element 3] | provenance | | +| array_flow.rb:372:9:372:42 | call to [] [element 2] | array_flow.rb:372:5:372:5 | a [element 2] | provenance | | +| array_flow.rb:372:9:372:42 | call to [] [element 3] | array_flow.rb:372:5:372:5 | a [element 3] | provenance | | +| array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:9:372:42 | call to [] [element 2] | provenance | | +| array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:9:372:42 | call to [] [element 3] | provenance | | | array_flow.rb:373:5:373:5 | b [element] | array_flow.rb:374:10:374:10 | b [element] | provenance | | | array_flow.rb:373:9:373:9 | a [element 2] | array_flow.rb:373:9:373:17 | call to drop [element] | provenance | | | array_flow.rb:373:9:373:9 | a [element 3] | array_flow.rb:373:9:373:17 | call to drop [element] | provenance | | @@ -429,8 +482,10 @@ edges | array_flow.rb:383:10:383:10 | c [element] | array_flow.rb:383:10:383:13 | ...[...] | provenance | | | array_flow.rb:387:5:387:5 | a [element 2] | array_flow.rb:388:9:388:9 | a [element 2] | provenance | | | array_flow.rb:387:5:387:5 | a [element 3] | array_flow.rb:388:9:388:9 | a [element 3] | provenance | | -| array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:5:387:5 | a [element 2] | provenance | | -| array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:5:387:5 | a [element 3] | provenance | | +| array_flow.rb:387:9:387:42 | call to [] [element 2] | array_flow.rb:387:5:387:5 | a [element 2] | provenance | | +| array_flow.rb:387:9:387:42 | call to [] [element 3] | array_flow.rb:387:5:387:5 | a [element 3] | provenance | | +| array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:9:387:42 | call to [] [element 2] | provenance | | +| array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:9:387:42 | call to [] [element 3] | provenance | | | array_flow.rb:388:5:388:5 | b [element] | array_flow.rb:391:10:391:10 | b [element] | provenance | | | array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:9:390:7 | call to drop_while [element] | provenance | | | array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:26:388:26 | x | provenance | | @@ -440,7 +495,8 @@ edges | array_flow.rb:388:26:388:26 | x | array_flow.rb:389:14:389:14 | x | provenance | | | array_flow.rb:391:10:391:10 | b [element] | array_flow.rb:391:10:391:13 | ...[...] | provenance | | | array_flow.rb:395:5:395:5 | a [element 2] | array_flow.rb:396:9:396:9 | a [element 2] | provenance | | -| array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:5:395:5 | a [element 2] | provenance | | +| array_flow.rb:395:9:395:26 | call to [] [element 2] | array_flow.rb:395:5:395:5 | a [element 2] | provenance | | +| array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:9:395:26 | call to [] [element 2] | provenance | | | array_flow.rb:396:5:396:5 | b [element 2] | array_flow.rb:399:10:399:10 | b [element 2] | provenance | | | array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:9:398:7 | call to each [element 2] | provenance | | | array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:20:396:20 | x | provenance | | @@ -448,22 +504,23 @@ edges | array_flow.rb:396:20:396:20 | x | array_flow.rb:397:14:397:14 | x | provenance | | | array_flow.rb:399:10:399:10 | b [element 2] | array_flow.rb:399:10:399:13 | ...[...] | provenance | | | array_flow.rb:403:5:403:5 | a [element 2] | array_flow.rb:404:18:404:18 | a [element 2] | provenance | | -| array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:5:403:5 | a [element 2] | provenance | | +| array_flow.rb:403:9:403:26 | call to [] [element 2] | array_flow.rb:403:5:403:5 | a [element 2] | provenance | | +| array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:9:403:26 | call to [] [element 2] | provenance | | | array_flow.rb:404:5:404:5 | b [element 2] | array_flow.rb:408:10:408:10 | b [element 2] | provenance | | -| array_flow.rb:404:9:406:7 | [post] { ... } [captured x] | array_flow.rb:407:10:407:10 | x | provenance | | -| array_flow.rb:404:9:406:7 | __synth__0__1 | array_flow.rb:405:14:405:14 | x | provenance | | | array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:5:404:5 | b [element 2] | provenance | | -| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:9:406:7 | [post] { ... } [captured x] | provenance | | -| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:9:406:7 | __synth__0__1 | provenance | | +| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:405:14:405:14 | x | provenance | | +| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:407:10:407:10 | x | provenance | | | array_flow.rb:408:10:408:10 | b [element 2] | array_flow.rb:408:10:408:13 | ...[...] | provenance | | | array_flow.rb:412:5:412:5 | a [element 2] | array_flow.rb:413:5:413:5 | a [element 2] | provenance | | -| array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:5:412:5 | a [element 2] | provenance | | +| array_flow.rb:412:9:412:26 | call to [] [element 2] | array_flow.rb:412:5:412:5 | a [element 2] | provenance | | +| array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:9:412:26 | call to [] [element 2] | provenance | | | array_flow.rb:413:5:413:5 | a [element 2] | array_flow.rb:413:24:413:24 | x [element] | provenance | | | array_flow.rb:413:24:413:24 | x [element] | array_flow.rb:414:15:414:15 | x [element] | provenance | | | array_flow.rb:414:15:414:15 | x [element] | array_flow.rb:414:15:414:18 | ...[...] | provenance | | | array_flow.rb:414:15:414:18 | ...[...] | array_flow.rb:414:14:414:19 | ( ... ) | provenance | | | array_flow.rb:419:5:419:5 | a [element 2] | array_flow.rb:420:9:420:9 | a [element 2] | provenance | | -| array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:5:419:5 | a [element 2] | provenance | | +| array_flow.rb:419:9:419:26 | call to [] [element 2] | array_flow.rb:419:5:419:5 | a [element 2] | provenance | | +| array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:9:419:26 | call to [] [element 2] | provenance | | | array_flow.rb:420:5:420:5 | b [element 2] | array_flow.rb:423:10:423:10 | b [element 2] | provenance | | | array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | provenance | | | array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:26:420:26 | x | provenance | | @@ -471,18 +528,21 @@ edges | array_flow.rb:420:26:420:26 | x | array_flow.rb:421:14:421:14 | x | provenance | | | array_flow.rb:423:10:423:10 | b [element 2] | array_flow.rb:423:10:423:13 | ...[...] | provenance | | | array_flow.rb:427:5:427:5 | a [element 2] | array_flow.rb:428:9:428:9 | a [element 2] | provenance | | -| array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:5:427:5 | a [element 2] | provenance | | +| array_flow.rb:427:9:427:26 | call to [] [element 2] | array_flow.rb:427:5:427:5 | a [element 2] | provenance | | +| array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:9:427:26 | call to [] [element 2] | provenance | | | array_flow.rb:428:5:428:5 | b [element 2] | array_flow.rb:431:10:431:10 | b [element 2] | provenance | | | array_flow.rb:428:9:428:9 | a [element 2] | array_flow.rb:428:9:430:7 | call to each_index [element 2] | provenance | | | array_flow.rb:428:9:430:7 | call to each_index [element 2] | array_flow.rb:428:5:428:5 | b [element 2] | provenance | | | array_flow.rb:431:10:431:10 | b [element 2] | array_flow.rb:431:10:431:13 | ...[...] | provenance | | | array_flow.rb:435:5:435:5 | a [element 3] | array_flow.rb:436:5:436:5 | a [element 3] | provenance | | -| array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:5:435:5 | a [element 3] | provenance | | +| array_flow.rb:435:9:435:29 | call to [] [element 3] | array_flow.rb:435:5:435:5 | a [element 3] | provenance | | +| array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:9:435:29 | call to [] [element 3] | provenance | | | array_flow.rb:436:5:436:5 | a [element 3] | array_flow.rb:436:25:436:25 | x [element] | provenance | | | array_flow.rb:436:25:436:25 | x [element] | array_flow.rb:437:14:437:14 | x [element] | provenance | | | array_flow.rb:437:14:437:14 | x [element] | array_flow.rb:437:14:437:17 | ...[...] | provenance | | | array_flow.rb:442:5:442:5 | a [element 3] | array_flow.rb:443:9:443:9 | a [element 3] | provenance | | -| array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:5:442:5 | a [element 3] | provenance | | +| array_flow.rb:442:9:442:29 | call to [] [element 3] | array_flow.rb:442:5:442:5 | a [element 3] | provenance | | +| array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:9:442:29 | call to [] [element 3] | provenance | | | array_flow.rb:443:5:443:5 | b [element 3] | array_flow.rb:447:10:447:10 | b [element 3] | provenance | | | array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | provenance | | | array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:31:443:31 | x | provenance | | @@ -490,7 +550,8 @@ edges | array_flow.rb:443:31:443:31 | x | array_flow.rb:444:14:444:14 | x | provenance | | | array_flow.rb:447:10:447:10 | b [element 3] | array_flow.rb:447:10:447:13 | ...[...] | provenance | | | array_flow.rb:451:5:451:5 | a [element 3] | array_flow.rb:452:9:452:9 | a [element 3] | provenance | | -| array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:5:451:5 | a [element 3] | provenance | | +| array_flow.rb:451:9:451:31 | call to [] [element 3] | array_flow.rb:451:5:451:5 | a [element 3] | provenance | | +| array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:9:451:31 | call to [] [element 3] | provenance | | | array_flow.rb:452:5:452:5 | b | array_flow.rb:456:10:456:10 | b | provenance | | | array_flow.rb:452:9:452:9 | a [element 3] | array_flow.rb:452:46:452:46 | x | provenance | | | array_flow.rb:452:9:455:7 | call to each_with_object | array_flow.rb:452:5:452:5 | b | provenance | | @@ -499,7 +560,8 @@ edges | array_flow.rb:452:46:452:46 | x | array_flow.rb:453:14:453:14 | x | provenance | | | array_flow.rb:452:48:452:48 | a | array_flow.rb:454:14:454:14 | a | provenance | | | array_flow.rb:460:5:460:5 | a [element 3] | array_flow.rb:461:9:461:9 | a [element 3] | provenance | | -| array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:5:460:5 | a [element 3] | provenance | | +| array_flow.rb:460:9:460:29 | call to [] [element 3] | array_flow.rb:460:5:460:5 | a [element 3] | provenance | | +| array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:9:460:29 | call to [] [element 3] | provenance | | | array_flow.rb:461:5:461:5 | b [element 3] | array_flow.rb:462:10:462:10 | b [element 3] | provenance | | | array_flow.rb:461:9:461:9 | a [element 3] | array_flow.rb:461:9:461:17 | call to entries [element 3] | provenance | | | array_flow.rb:461:9:461:17 | call to entries [element 3] | array_flow.rb:461:5:461:5 | b [element 3] | provenance | | @@ -510,8 +572,10 @@ edges | array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:477:9:477:9 | a [element 3] | provenance | | | array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:467:9:467:9 | a [element 4] | provenance | | | array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:477:9:477:9 | a [element 4] | provenance | | -| array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:5:466:5 | a [element 3] | provenance | | -| array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:5:466:5 | a [element 4] | provenance | | +| array_flow.rb:466:9:466:45 | call to [] [element 3] | array_flow.rb:466:5:466:5 | a [element 3] | provenance | | +| array_flow.rb:466:9:466:45 | call to [] [element 4] | array_flow.rb:466:5:466:5 | a [element 4] | provenance | | +| array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:9:466:45 | call to [] [element 3] | provenance | | +| array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:9:466:45 | call to [] [element 4] | provenance | | | array_flow.rb:467:5:467:5 | b | array_flow.rb:470:10:470:10 | b | provenance | | | array_flow.rb:467:9:467:9 | a [element 3] | array_flow.rb:467:9:469:7 | call to fetch | provenance | | | array_flow.rb:467:9:467:9 | a [element 4] | array_flow.rb:467:9:469:7 | call to fetch | provenance | | @@ -534,7 +598,8 @@ edges | array_flow.rb:477:9:477:32 | call to fetch | array_flow.rb:477:5:477:5 | b | provenance | | | array_flow.rb:477:20:477:31 | call to source | array_flow.rb:477:9:477:32 | call to fetch | provenance | | | array_flow.rb:482:5:482:5 | a [element 3] | array_flow.rb:484:10:484:10 | a [element 3] | provenance | | -| array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:5:482:5 | a [element 3] | provenance | | +| array_flow.rb:482:9:482:31 | call to [] [element 3] | array_flow.rb:482:5:482:5 | a [element 3] | provenance | | +| array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:9:482:31 | call to [] [element 3] | provenance | | | array_flow.rb:483:5:483:5 | [post] a [element] | array_flow.rb:484:10:484:10 | a [element] | provenance | | | array_flow.rb:483:12:483:23 | call to source | array_flow.rb:483:5:483:5 | [post] a [element] | provenance | | | array_flow.rb:484:10:484:10 | a [element 3] | array_flow.rb:484:10:484:13 | ...[...] | provenance | | @@ -550,7 +615,8 @@ edges | array_flow.rb:492:9:492:20 | call to source | array_flow.rb:491:5:491:5 | [post] a [element] | provenance | | | array_flow.rb:494:10:494:10 | a [element] | array_flow.rb:494:10:494:13 | ...[...] | provenance | | | array_flow.rb:498:5:498:5 | a [element 3] | array_flow.rb:499:9:499:9 | a [element 3] | provenance | | -| array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:5:498:5 | a [element 3] | provenance | | +| array_flow.rb:498:9:498:29 | call to [] [element 3] | array_flow.rb:498:5:498:5 | a [element 3] | provenance | | +| array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:9:498:29 | call to [] [element 3] | provenance | | | array_flow.rb:499:5:499:5 | b [element] | array_flow.rb:502:10:502:10 | b [element] | provenance | | | array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:9:501:7 | call to filter [element] | provenance | | | array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:22:499:22 | x | provenance | | @@ -558,7 +624,8 @@ edges | array_flow.rb:499:22:499:22 | x | array_flow.rb:500:14:500:14 | x | provenance | | | array_flow.rb:502:10:502:10 | b [element] | array_flow.rb:502:10:502:13 | ...[...] | provenance | | | array_flow.rb:506:5:506:5 | a [element 3] | array_flow.rb:507:9:507:9 | a [element 3] | provenance | | -| array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:5:506:5 | a [element 3] | provenance | | +| array_flow.rb:506:9:506:29 | call to [] [element 3] | array_flow.rb:506:5:506:5 | a [element 3] | provenance | | +| array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:9:506:29 | call to [] [element 3] | provenance | | | array_flow.rb:507:5:507:5 | b [element] | array_flow.rb:511:10:511:10 | b [element] | provenance | | | array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:9:510:7 | call to filter_map [element] | provenance | | | array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:26:507:26 | x | provenance | | @@ -570,7 +637,8 @@ edges | array_flow.rb:519:9:519:20 | call to source | array_flow.rb:518:9:520:7 | call to filter_map [element] | provenance | | | array_flow.rb:521:10:521:10 | d [element] | array_flow.rb:521:10:521:13 | ...[...] | provenance | | | array_flow.rb:525:5:525:5 | a [element 3] | array_flow.rb:526:9:526:9 | a [element 3] | provenance | | -| array_flow.rb:525:19:525:28 | call to source | array_flow.rb:525:5:525:5 | a [element 3] | provenance | | +| array_flow.rb:525:9:525:29 | call to [] [element 3] | array_flow.rb:525:5:525:5 | a [element 3] | provenance | | +| array_flow.rb:525:19:525:28 | call to source | array_flow.rb:525:9:525:29 | call to [] [element 3] | provenance | | | array_flow.rb:526:5:526:5 | b [element] | array_flow.rb:531:10:531:10 | b [element] | provenance | | | array_flow.rb:526:9:526:9 | [post] a [element] | array_flow.rb:530:10:530:10 | a [element] | provenance | | | array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:9:526:9 | [post] a [element] | provenance | | @@ -581,7 +649,8 @@ edges | array_flow.rb:530:10:530:10 | a [element] | array_flow.rb:530:10:530:13 | ...[...] | provenance | | | array_flow.rb:531:10:531:10 | b [element] | array_flow.rb:531:10:531:13 | ...[...] | provenance | | | array_flow.rb:535:5:535:5 | a [element 3] | array_flow.rb:536:9:536:9 | a [element 3] | provenance | | -| array_flow.rb:535:19:535:30 | call to source | array_flow.rb:535:5:535:5 | a [element 3] | provenance | | +| array_flow.rb:535:9:535:31 | call to [] [element 3] | array_flow.rb:535:5:535:5 | a [element 3] | provenance | | +| array_flow.rb:535:19:535:30 | call to source | array_flow.rb:535:9:535:31 | call to [] [element 3] | provenance | | | array_flow.rb:536:5:536:5 | b | array_flow.rb:539:10:539:10 | b | provenance | | | array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:9:538:7 | call to find | provenance | | | array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:41:536:41 | x | provenance | | @@ -589,7 +658,8 @@ edges | array_flow.rb:536:21:536:32 | call to source | array_flow.rb:536:9:538:7 | call to find | provenance | | | array_flow.rb:536:41:536:41 | x | array_flow.rb:537:14:537:14 | x | provenance | | | array_flow.rb:543:5:543:5 | a [element 3] | array_flow.rb:544:9:544:9 | a [element 3] | provenance | | -| array_flow.rb:543:19:543:28 | call to source | array_flow.rb:543:5:543:5 | a [element 3] | provenance | | +| array_flow.rb:543:9:543:29 | call to [] [element 3] | array_flow.rb:543:5:543:5 | a [element 3] | provenance | | +| array_flow.rb:543:19:543:28 | call to source | array_flow.rb:543:9:543:29 | call to [] [element 3] | provenance | | | array_flow.rb:544:5:544:5 | b [element] | array_flow.rb:547:10:547:10 | b [element] | provenance | | | array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:9:546:7 | call to find_all [element] | provenance | | | array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:24:544:24 | x | provenance | | @@ -597,15 +667,18 @@ edges | array_flow.rb:544:24:544:24 | x | array_flow.rb:545:14:545:14 | x | provenance | | | array_flow.rb:547:10:547:10 | b [element] | array_flow.rb:547:10:547:13 | ...[...] | provenance | | | array_flow.rb:551:5:551:5 | a [element 3] | array_flow.rb:552:5:552:5 | a [element 3] | provenance | | -| array_flow.rb:551:19:551:28 | call to source | array_flow.rb:551:5:551:5 | a [element 3] | provenance | | +| array_flow.rb:551:9:551:29 | call to [] [element 3] | array_flow.rb:551:5:551:5 | a [element 3] | provenance | | +| array_flow.rb:551:19:551:28 | call to source | array_flow.rb:551:9:551:29 | call to [] [element 3] | provenance | | | array_flow.rb:552:5:552:5 | a [element 3] | array_flow.rb:552:22:552:22 | x | provenance | | | array_flow.rb:552:22:552:22 | x | array_flow.rb:553:14:553:14 | x | provenance | | | array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:560:10:560:10 | a [element 0] | provenance | | | array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:561:9:561:9 | a [element 0] | provenance | | | array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:564:9:564:9 | a [element 0] | provenance | | | array_flow.rb:558:5:558:5 | a [element 3] | array_flow.rb:564:9:564:9 | a [element 3] | provenance | | -| array_flow.rb:558:10:558:21 | call to source | array_flow.rb:558:5:558:5 | a [element 0] | provenance | | -| array_flow.rb:558:30:558:41 | call to source | array_flow.rb:558:5:558:5 | a [element 3] | provenance | | +| array_flow.rb:558:9:558:42 | call to [] [element 0] | array_flow.rb:558:5:558:5 | a [element 0] | provenance | | +| array_flow.rb:558:9:558:42 | call to [] [element 3] | array_flow.rb:558:5:558:5 | a [element 3] | provenance | | +| array_flow.rb:558:10:558:21 | call to source | array_flow.rb:558:9:558:42 | call to [] [element 0] | provenance | | +| array_flow.rb:558:30:558:41 | call to source | array_flow.rb:558:9:558:42 | call to [] [element 3] | provenance | | | array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:560:10:560:10 | a [element] | provenance | | | array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:561:9:561:9 | a [element] | provenance | | | array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:564:9:564:9 | a [element] | provenance | | @@ -638,13 +711,15 @@ edges | array_flow.rb:566:10:566:10 | c [element] | array_flow.rb:566:10:566:13 | ...[...] | provenance | | | array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:571:9:571:9 | a [element 2] | provenance | | | array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:576:9:576:9 | a [element 2] | provenance | | -| array_flow.rb:570:16:570:27 | call to source | array_flow.rb:570:5:570:5 | a [element 2] | provenance | | +| array_flow.rb:570:9:570:28 | call to [] [element 2] | array_flow.rb:570:5:570:5 | a [element 2] | provenance | | +| array_flow.rb:570:16:570:27 | call to source | array_flow.rb:570:9:570:28 | call to [] [element 2] | provenance | | | array_flow.rb:571:5:571:5 | b [element] | array_flow.rb:575:10:575:10 | b [element] | provenance | | | array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:9:574:7 | call to flat_map [element] | provenance | | | array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:24:571:24 | x | provenance | | | array_flow.rb:571:9:574:7 | call to flat_map [element] | array_flow.rb:571:5:571:5 | b [element] | provenance | | | array_flow.rb:571:24:571:24 | x | array_flow.rb:572:14:572:14 | x | provenance | | -| array_flow.rb:573:13:573:24 | call to source | array_flow.rb:571:9:574:7 | call to flat_map [element] | provenance | | +| array_flow.rb:573:9:573:25 | call to [] [element 1] | array_flow.rb:571:9:574:7 | call to flat_map [element] | provenance | | +| array_flow.rb:573:13:573:24 | call to source | array_flow.rb:573:9:573:25 | call to [] [element 1] | provenance | | | array_flow.rb:575:10:575:10 | b [element] | array_flow.rb:575:10:575:13 | ...[...] | provenance | | | array_flow.rb:576:5:576:5 | b [element] | array_flow.rb:580:10:580:10 | b [element] | provenance | | | array_flow.rb:576:9:576:9 | a [element 2] | array_flow.rb:576:24:576:24 | x | provenance | | @@ -653,14 +728,18 @@ edges | array_flow.rb:578:9:578:20 | call to source | array_flow.rb:576:9:579:7 | call to flat_map [element] | provenance | | | array_flow.rb:580:10:580:10 | b [element] | array_flow.rb:580:10:580:13 | ...[...] | provenance | | | array_flow.rb:584:5:584:5 | a [element 2, element 1] | array_flow.rb:585:9:585:9 | a [element 2, element 1] | provenance | | -| array_flow.rb:584:20:584:29 | call to source | array_flow.rb:584:5:584:5 | a [element 2, element 1] | provenance | | +| array_flow.rb:584:9:584:31 | call to [] [element 2, element 1] | array_flow.rb:584:5:584:5 | a [element 2, element 1] | provenance | | +| array_flow.rb:584:16:584:30 | call to [] [element 1] | array_flow.rb:584:9:584:31 | call to [] [element 2, element 1] | provenance | | +| array_flow.rb:584:20:584:29 | call to source | array_flow.rb:584:16:584:30 | call to [] [element 1] | provenance | | | array_flow.rb:585:5:585:5 | b [element] | array_flow.rb:586:10:586:10 | b [element] | provenance | | | array_flow.rb:585:9:585:9 | a [element 2, element 1] | array_flow.rb:585:9:585:17 | call to flatten [element] | provenance | | | array_flow.rb:585:9:585:17 | call to flatten [element] | array_flow.rb:585:5:585:5 | b [element] | provenance | | | array_flow.rb:586:10:586:10 | b [element] | array_flow.rb:586:10:586:13 | ...[...] | provenance | | | array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:591:10:591:10 | a [element 2, element 1] | provenance | | | array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | a [element 2, element 1] | provenance | | -| array_flow.rb:590:20:590:29 | call to source | array_flow.rb:590:5:590:5 | a [element 2, element 1] | provenance | | +| array_flow.rb:590:9:590:31 | call to [] [element 2, element 1] | array_flow.rb:590:5:590:5 | a [element 2, element 1] | provenance | | +| array_flow.rb:590:16:590:30 | call to [] [element 1] | array_flow.rb:590:9:590:31 | call to [] [element 2, element 1] | provenance | | +| array_flow.rb:590:20:590:29 | call to source | array_flow.rb:590:16:590:30 | call to [] [element 1] | provenance | | | array_flow.rb:591:10:591:10 | a [element 2, element 1] | array_flow.rb:591:10:591:13 | ...[...] [element 1] | provenance | | | array_flow.rb:591:10:591:13 | ...[...] [element 1] | array_flow.rb:591:10:591:16 | ...[...] | provenance | | | array_flow.rb:592:5:592:5 | b [element, element 1] | array_flow.rb:596:10:596:10 | b [element, element 1] | provenance | | @@ -681,7 +760,8 @@ edges | array_flow.rb:596:10:596:13 | ...[...] [element 1] | array_flow.rb:596:10:596:16 | ...[...] | provenance | | | array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:601:9:601:9 | a [element 3] | provenance | | | array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:603:9:603:9 | a [element 3] | provenance | | -| array_flow.rb:600:19:600:30 | call to source | array_flow.rb:600:5:600:5 | a [element 3] | provenance | | +| array_flow.rb:600:9:600:31 | call to [] [element 3] | array_flow.rb:600:5:600:5 | a [element 3] | provenance | | +| array_flow.rb:600:19:600:30 | call to source | array_flow.rb:600:9:600:31 | call to [] [element 3] | provenance | | | array_flow.rb:601:5:601:5 | b [element] | array_flow.rb:602:10:602:10 | b [element] | provenance | | | array_flow.rb:601:9:601:9 | a [element 3] | array_flow.rb:601:9:601:20 | call to grep [element] | provenance | | | array_flow.rb:601:9:601:20 | call to grep [element] | array_flow.rb:601:5:601:5 | b [element] | provenance | | @@ -694,7 +774,8 @@ edges | array_flow.rb:607:10:607:10 | b [element] | array_flow.rb:607:10:607:13 | ...[...] | provenance | | | array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:612:9:612:9 | a [element 3] | provenance | | | array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:614:9:614:9 | a [element 3] | provenance | | -| array_flow.rb:611:19:611:30 | call to source | array_flow.rb:611:5:611:5 | a [element 3] | provenance | | +| array_flow.rb:611:9:611:31 | call to [] [element 3] | array_flow.rb:611:5:611:5 | a [element 3] | provenance | | +| array_flow.rb:611:19:611:30 | call to source | array_flow.rb:611:9:611:31 | call to [] [element 3] | provenance | | | array_flow.rb:612:5:612:5 | b [element] | array_flow.rb:613:10:613:10 | b [element] | provenance | | | array_flow.rb:612:9:612:9 | a [element 3] | array_flow.rb:612:9:612:21 | call to grep_v [element] | provenance | | | array_flow.rb:612:9:612:21 | call to grep_v [element] | array_flow.rb:612:5:612:5 | b [element] | provenance | | @@ -706,19 +787,23 @@ edges | array_flow.rb:616:9:616:20 | call to source | array_flow.rb:614:9:617:7 | call to grep_v [element] | provenance | | | array_flow.rb:618:10:618:10 | b [element] | array_flow.rb:618:10:618:13 | ...[...] | provenance | | | array_flow.rb:622:5:622:5 | a [element 3] | array_flow.rb:623:9:623:9 | a [element 3] | provenance | | -| array_flow.rb:622:19:622:30 | call to source | array_flow.rb:622:5:622:5 | a [element 3] | provenance | | +| array_flow.rb:622:9:622:31 | call to [] [element 3] | array_flow.rb:622:5:622:5 | a [element 3] | provenance | | +| array_flow.rb:622:19:622:30 | call to source | array_flow.rb:622:9:622:31 | call to [] [element 3] | provenance | | | array_flow.rb:623:9:623:9 | a [element 3] | array_flow.rb:623:24:623:24 | x | provenance | | | array_flow.rb:623:24:623:24 | x | array_flow.rb:624:14:624:14 | x | provenance | | | array_flow.rb:631:5:631:5 | a [element 3] | array_flow.rb:632:5:632:5 | a [element 3] | provenance | | -| array_flow.rb:631:19:631:28 | call to source | array_flow.rb:631:5:631:5 | a [element 3] | provenance | | +| array_flow.rb:631:9:631:29 | call to [] [element 3] | array_flow.rb:631:5:631:5 | a [element 3] | provenance | | +| array_flow.rb:631:19:631:28 | call to source | array_flow.rb:631:9:631:29 | call to [] [element 3] | provenance | | | array_flow.rb:632:5:632:5 | a [element 3] | array_flow.rb:632:17:632:17 | x | provenance | | | array_flow.rb:632:17:632:17 | x | array_flow.rb:633:14:633:14 | x | provenance | | | array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:639:9:639:9 | a [element 0] | provenance | | | array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:645:9:645:9 | a [element 0] | provenance | | | array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:639:9:639:9 | a [element 2] | provenance | | | array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:645:9:645:9 | a [element 2] | provenance | | -| array_flow.rb:638:10:638:21 | call to source | array_flow.rb:638:5:638:5 | a [element 0] | provenance | | -| array_flow.rb:638:27:638:38 | call to source | array_flow.rb:638:5:638:5 | a [element 2] | provenance | | +| array_flow.rb:638:9:638:39 | call to [] [element 0] | array_flow.rb:638:5:638:5 | a [element 0] | provenance | | +| array_flow.rb:638:9:638:39 | call to [] [element 2] | array_flow.rb:638:5:638:5 | a [element 2] | provenance | | +| array_flow.rb:638:10:638:21 | call to source | array_flow.rb:638:9:638:39 | call to [] [element 0] | provenance | | +| array_flow.rb:638:27:638:38 | call to source | array_flow.rb:638:9:638:39 | call to [] [element 2] | provenance | | | array_flow.rb:639:5:639:5 | b | array_flow.rb:644:10:644:10 | b | provenance | | | array_flow.rb:639:9:639:9 | a [element 0] | array_flow.rb:639:22:639:22 | x | provenance | | | array_flow.rb:639:9:639:9 | a [element 2] | array_flow.rb:639:25:639:25 | y | provenance | | @@ -733,7 +818,8 @@ edges | array_flow.rb:645:28:645:28 | y | array_flow.rb:647:14:647:14 | y | provenance | | | array_flow.rb:648:9:648:19 | call to source | array_flow.rb:645:9:649:7 | call to inject | provenance | | | array_flow.rb:655:5:655:5 | a [element 2] | array_flow.rb:656:9:656:9 | a [element 2] | provenance | | -| array_flow.rb:655:16:655:27 | call to source | array_flow.rb:655:5:655:5 | a [element 2] | provenance | | +| array_flow.rb:655:9:655:28 | call to [] [element 2] | array_flow.rb:655:5:655:5 | a [element 2] | provenance | | +| array_flow.rb:655:16:655:27 | call to source | array_flow.rb:655:9:655:28 | call to [] [element 2] | provenance | | | array_flow.rb:656:5:656:5 | b [element 1] | array_flow.rb:663:10:663:10 | b [element 1] | provenance | | | array_flow.rb:656:5:656:5 | b [element 2] | array_flow.rb:664:10:664:10 | b [element 2] | provenance | | | array_flow.rb:656:5:656:5 | b [element 4] | array_flow.rb:666:10:666:10 | b [element 4] | provenance | | @@ -756,7 +842,8 @@ edges | array_flow.rb:664:10:664:10 | b [element 2] | array_flow.rb:664:10:664:13 | ...[...] | provenance | | | array_flow.rb:666:10:666:10 | b [element 4] | array_flow.rb:666:10:666:13 | ...[...] | provenance | | | array_flow.rb:669:5:669:5 | c [element 2] | array_flow.rb:670:9:670:9 | c [element 2] | provenance | | -| array_flow.rb:669:16:669:27 | call to source | array_flow.rb:669:5:669:5 | c [element 2] | provenance | | +| array_flow.rb:669:9:669:28 | call to [] [element 2] | array_flow.rb:669:5:669:5 | c [element 2] | provenance | | +| array_flow.rb:669:16:669:27 | call to source | array_flow.rb:669:9:669:28 | call to [] [element 2] | provenance | | | array_flow.rb:670:5:670:5 | d [element] | array_flow.rb:672:10:672:10 | d [element] | provenance | | | array_flow.rb:670:9:670:9 | [post] c [element] | array_flow.rb:671:10:671:10 | c [element] | provenance | | | array_flow.rb:670:9:670:9 | c [element 2] | array_flow.rb:670:9:670:9 | [post] c [element] | provenance | | @@ -769,15 +856,19 @@ edges | array_flow.rb:671:10:671:10 | c [element] | array_flow.rb:671:10:671:13 | ...[...] | provenance | | | array_flow.rb:672:10:672:10 | d [element] | array_flow.rb:672:10:672:13 | ...[...] | provenance | | | array_flow.rb:683:5:683:5 | a [element 2] | array_flow.rb:684:9:684:9 | a [element 2] | provenance | | -| array_flow.rb:683:16:683:27 | call to source | array_flow.rb:683:5:683:5 | a [element 2] | provenance | | +| array_flow.rb:683:9:683:28 | call to [] [element 2] | array_flow.rb:683:5:683:5 | a [element 2] | provenance | | +| array_flow.rb:683:16:683:27 | call to source | array_flow.rb:683:9:683:28 | call to [] [element 2] | provenance | | | array_flow.rb:684:5:684:5 | b [element] | array_flow.rb:685:10:685:10 | b [element] | provenance | | | array_flow.rb:684:9:684:9 | a [element 2] | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | | array_flow.rb:684:9:684:60 | call to intersection [element] | array_flow.rb:684:5:684:5 | b [element] | provenance | | -| array_flow.rb:684:31:684:42 | call to source | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | -| array_flow.rb:684:47:684:58 | call to source | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | +| array_flow.rb:684:24:684:43 | call to [] [element 2] | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | +| array_flow.rb:684:31:684:42 | call to source | array_flow.rb:684:24:684:43 | call to [] [element 2] | provenance | | +| array_flow.rb:684:46:684:59 | call to [] [element 0] | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | +| array_flow.rb:684:47:684:58 | call to source | array_flow.rb:684:46:684:59 | call to [] [element 0] | provenance | | | array_flow.rb:685:10:685:10 | b [element] | array_flow.rb:685:10:685:13 | ...[...] | provenance | | | array_flow.rb:689:5:689:5 | a [element 2] | array_flow.rb:690:9:690:9 | a [element 2] | provenance | | -| array_flow.rb:689:16:689:25 | call to source | array_flow.rb:689:5:689:5 | a [element 2] | provenance | | +| array_flow.rb:689:9:689:26 | call to [] [element 2] | array_flow.rb:689:5:689:5 | a [element 2] | provenance | | +| array_flow.rb:689:16:689:25 | call to source | array_flow.rb:689:9:689:26 | call to [] [element 2] | provenance | | | array_flow.rb:690:5:690:5 | b [element] | array_flow.rb:695:10:695:10 | b [element] | provenance | | | array_flow.rb:690:9:690:9 | [post] a [element] | array_flow.rb:694:10:694:10 | a [element] | provenance | | | array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:9:690:9 | [post] a [element] | provenance | | @@ -789,7 +880,8 @@ edges | array_flow.rb:695:10:695:10 | b [element] | array_flow.rb:695:10:695:13 | ...[...] | provenance | | | array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:701:10:701:10 | a [element 2] | provenance | | | array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:702:9:702:9 | a [element 2] | provenance | | -| array_flow.rb:699:16:699:27 | call to source | array_flow.rb:699:5:699:5 | a [element 2] | provenance | | +| array_flow.rb:699:9:699:28 | call to [] [element 2] | array_flow.rb:699:5:699:5 | a [element 2] | provenance | | +| array_flow.rb:699:16:699:27 | call to source | array_flow.rb:699:9:699:28 | call to [] [element 2] | provenance | | | array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:701:10:701:10 | a [element] | provenance | | | array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:702:9:702:9 | a [element] | provenance | | | array_flow.rb:700:12:700:23 | call to source | array_flow.rb:700:5:700:5 | [post] a [element] | provenance | | @@ -803,7 +895,8 @@ edges | array_flow.rb:703:10:703:10 | b [element] | array_flow.rb:703:10:703:13 | ...[...] | provenance | | | array_flow.rb:704:10:704:10 | b [element] | array_flow.rb:704:10:704:13 | ...[...] | provenance | | | array_flow.rb:708:5:708:5 | a [element 2] | array_flow.rb:709:9:709:9 | a [element 2] | provenance | | -| array_flow.rb:708:16:708:27 | call to source | array_flow.rb:708:5:708:5 | a [element 2] | provenance | | +| array_flow.rb:708:9:708:28 | call to [] [element 2] | array_flow.rb:708:5:708:5 | a [element 2] | provenance | | +| array_flow.rb:708:16:708:27 | call to source | array_flow.rb:708:9:708:28 | call to [] [element 2] | provenance | | | array_flow.rb:709:5:709:5 | b [element] | array_flow.rb:713:10:713:10 | b [element] | provenance | | | array_flow.rb:709:9:709:9 | a [element 2] | array_flow.rb:709:19:709:19 | x | provenance | | | array_flow.rb:709:9:712:7 | call to map [element] | array_flow.rb:709:5:709:5 | b [element] | provenance | | @@ -811,7 +904,8 @@ edges | array_flow.rb:711:9:711:19 | call to source | array_flow.rb:709:9:712:7 | call to map [element] | provenance | | | array_flow.rb:713:10:713:10 | b [element] | array_flow.rb:713:10:713:13 | ...[...] | provenance | | | array_flow.rb:717:5:717:5 | a [element 2] | array_flow.rb:718:9:718:9 | a [element 2] | provenance | | -| array_flow.rb:717:16:717:27 | call to source | array_flow.rb:717:5:717:5 | a [element 2] | provenance | | +| array_flow.rb:717:9:717:28 | call to [] [element 2] | array_flow.rb:717:5:717:5 | a [element 2] | provenance | | +| array_flow.rb:717:16:717:27 | call to source | array_flow.rb:717:9:717:28 | call to [] [element 2] | provenance | | | array_flow.rb:718:5:718:5 | b [element] | array_flow.rb:722:10:722:10 | b [element] | provenance | | | array_flow.rb:718:9:718:9 | a [element 2] | array_flow.rb:718:20:718:20 | x | provenance | | | array_flow.rb:718:9:721:7 | call to map! [element] | array_flow.rb:718:5:718:5 | b [element] | provenance | | @@ -822,7 +916,8 @@ edges | array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:733:9:733:9 | a [element 2] | provenance | | | array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:737:9:737:9 | a [element 2] | provenance | | | array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:745:9:745:9 | a [element 2] | provenance | | -| array_flow.rb:726:16:726:25 | call to source | array_flow.rb:726:5:726:5 | a [element 2] | provenance | | +| array_flow.rb:726:9:726:26 | call to [] [element 2] | array_flow.rb:726:5:726:5 | a [element 2] | provenance | | +| array_flow.rb:726:16:726:25 | call to source | array_flow.rb:726:9:726:26 | call to [] [element 2] | provenance | | | array_flow.rb:729:5:729:5 | b | array_flow.rb:730:10:730:10 | b | provenance | | | array_flow.rb:729:9:729:9 | a [element 2] | array_flow.rb:729:9:729:13 | call to max | provenance | | | array_flow.rb:729:9:729:13 | call to max | array_flow.rb:729:5:729:5 | b | provenance | | @@ -847,7 +942,8 @@ edges | array_flow.rb:750:10:750:10 | e [element] | array_flow.rb:750:10:750:13 | ...[...] | provenance | | | array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:757:9:757:9 | a [element 2] | provenance | | | array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:764:9:764:9 | a [element 2] | provenance | | -| array_flow.rb:754:16:754:25 | call to source | array_flow.rb:754:5:754:5 | a [element 2] | provenance | | +| array_flow.rb:754:9:754:26 | call to [] [element 2] | array_flow.rb:754:5:754:5 | a [element 2] | provenance | | +| array_flow.rb:754:16:754:25 | call to source | array_flow.rb:754:9:754:26 | call to [] [element 2] | provenance | | | array_flow.rb:757:5:757:5 | b | array_flow.rb:761:10:761:10 | b | provenance | | | array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:9:760:7 | call to max_by | provenance | | | array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:22:757:22 | x | provenance | | @@ -863,7 +959,8 @@ edges | array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:779:9:779:9 | a [element 2] | provenance | | | array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:783:9:783:9 | a [element 2] | provenance | | | array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:791:9:791:9 | a [element 2] | provenance | | -| array_flow.rb:772:16:772:25 | call to source | array_flow.rb:772:5:772:5 | a [element 2] | provenance | | +| array_flow.rb:772:9:772:26 | call to [] [element 2] | array_flow.rb:772:5:772:5 | a [element 2] | provenance | | +| array_flow.rb:772:16:772:25 | call to source | array_flow.rb:772:9:772:26 | call to [] [element 2] | provenance | | | array_flow.rb:775:5:775:5 | b | array_flow.rb:776:10:776:10 | b | provenance | | | array_flow.rb:775:9:775:9 | a [element 2] | array_flow.rb:775:9:775:13 | call to min | provenance | | | array_flow.rb:775:9:775:13 | call to min | array_flow.rb:775:5:775:5 | b | provenance | | @@ -888,7 +985,8 @@ edges | array_flow.rb:796:10:796:10 | e [element] | array_flow.rb:796:10:796:13 | ...[...] | provenance | | | array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:803:9:803:9 | a [element 2] | provenance | | | array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:810:9:810:9 | a [element 2] | provenance | | -| array_flow.rb:800:16:800:25 | call to source | array_flow.rb:800:5:800:5 | a [element 2] | provenance | | +| array_flow.rb:800:9:800:26 | call to [] [element 2] | array_flow.rb:800:5:800:5 | a [element 2] | provenance | | +| array_flow.rb:800:16:800:25 | call to source | array_flow.rb:800:9:800:26 | call to [] [element 2] | provenance | | | array_flow.rb:803:5:803:5 | b | array_flow.rb:807:10:807:10 | b | provenance | | | array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:9:806:7 | call to min_by | provenance | | | array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:22:803:22 | x | provenance | | @@ -902,7 +1000,8 @@ edges | array_flow.rb:814:10:814:10 | c [element] | array_flow.rb:814:10:814:13 | ...[...] | provenance | | | array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:820:9:820:9 | a [element 2] | provenance | | | array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:824:9:824:9 | a [element 2] | provenance | | -| array_flow.rb:818:16:818:25 | call to source | array_flow.rb:818:5:818:5 | a [element 2] | provenance | | +| array_flow.rb:818:9:818:26 | call to [] [element 2] | array_flow.rb:818:5:818:5 | a [element 2] | provenance | | +| array_flow.rb:818:16:818:25 | call to source | array_flow.rb:818:9:818:26 | call to [] [element 2] | provenance | | | array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:821:10:821:10 | b [element] | provenance | | | array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:822:10:822:10 | b [element] | provenance | | | array_flow.rb:820:9:820:9 | a [element 2] | array_flow.rb:820:9:820:16 | call to minmax [element] | provenance | | @@ -920,7 +1019,8 @@ edges | array_flow.rb:829:10:829:10 | c [element] | array_flow.rb:829:10:829:13 | ...[...] | provenance | | | array_flow.rb:830:10:830:10 | c [element] | array_flow.rb:830:10:830:13 | ...[...] | provenance | | | array_flow.rb:834:5:834:5 | a [element 2] | array_flow.rb:835:9:835:9 | a [element 2] | provenance | | -| array_flow.rb:834:16:834:25 | call to source | array_flow.rb:834:5:834:5 | a [element 2] | provenance | | +| array_flow.rb:834:9:834:26 | call to [] [element 2] | array_flow.rb:834:5:834:5 | a [element 2] | provenance | | +| array_flow.rb:834:16:834:25 | call to source | array_flow.rb:834:9:834:26 | call to [] [element 2] | provenance | | | array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:839:10:839:10 | b [element] | provenance | | | array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:840:10:840:10 | b [element] | provenance | | | array_flow.rb:835:9:835:9 | a [element 2] | array_flow.rb:835:9:838:7 | call to minmax_by [element] | provenance | | @@ -930,15 +1030,18 @@ edges | array_flow.rb:839:10:839:10 | b [element] | array_flow.rb:839:10:839:13 | ...[...] | provenance | | | array_flow.rb:840:10:840:10 | b [element] | array_flow.rb:840:10:840:13 | ...[...] | provenance | | | array_flow.rb:844:5:844:5 | a [element 2] | array_flow.rb:845:5:845:5 | a [element 2] | provenance | | -| array_flow.rb:844:16:844:25 | call to source | array_flow.rb:844:5:844:5 | a [element 2] | provenance | | +| array_flow.rb:844:9:844:26 | call to [] [element 2] | array_flow.rb:844:5:844:5 | a [element 2] | provenance | | +| array_flow.rb:844:16:844:25 | call to source | array_flow.rb:844:9:844:26 | call to [] [element 2] | provenance | | | array_flow.rb:845:5:845:5 | a [element 2] | array_flow.rb:845:17:845:17 | x | provenance | | | array_flow.rb:845:17:845:17 | x | array_flow.rb:846:14:846:14 | x | provenance | | | array_flow.rb:853:5:853:5 | a [element 2] | array_flow.rb:854:5:854:5 | a [element 2] | provenance | | -| array_flow.rb:853:16:853:25 | call to source | array_flow.rb:853:5:853:5 | a [element 2] | provenance | | +| array_flow.rb:853:9:853:26 | call to [] [element 2] | array_flow.rb:853:5:853:5 | a [element 2] | provenance | | +| array_flow.rb:853:16:853:25 | call to source | array_flow.rb:853:9:853:26 | call to [] [element 2] | provenance | | | array_flow.rb:854:5:854:5 | a [element 2] | array_flow.rb:854:16:854:16 | x | provenance | | | array_flow.rb:854:16:854:16 | x | array_flow.rb:855:14:855:14 | x | provenance | | | array_flow.rb:866:5:866:5 | a [element 2] | array_flow.rb:867:9:867:9 | a [element 2] | provenance | | -| array_flow.rb:866:16:866:25 | call to source | array_flow.rb:866:5:866:5 | a [element 2] | provenance | | +| array_flow.rb:866:9:866:26 | call to [] [element 2] | array_flow.rb:866:5:866:5 | a [element 2] | provenance | | +| array_flow.rb:866:16:866:25 | call to source | array_flow.rb:866:9:866:26 | call to [] [element 2] | provenance | | | array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:871:10:871:10 | b [element, element] | provenance | | | array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:872:10:872:10 | b [element, element] | provenance | | | array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:9:870:7 | call to partition [element, element] | provenance | | @@ -952,7 +1055,8 @@ edges | array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:878:9:878:9 | a [element 2] | provenance | | | array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:886:9:886:9 | a [element 2] | provenance | | | array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:893:9:893:9 | a [element 2] | provenance | | -| array_flow.rb:876:16:876:25 | call to source | array_flow.rb:876:5:876:5 | a [element 2] | provenance | | +| array_flow.rb:876:9:876:26 | call to [] [element 2] | array_flow.rb:876:5:876:5 | a [element 2] | provenance | | +| array_flow.rb:876:16:876:25 | call to source | array_flow.rb:876:9:876:26 | call to [] [element 2] | provenance | | | array_flow.rb:878:5:878:5 | b [element 2] | array_flow.rb:884:10:884:10 | b [element 2] | provenance | | | array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:9:882:7 | call to permutation [element 2] | provenance | | | array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:27:878:27 | x [element] | provenance | | @@ -984,8 +1088,10 @@ edges | array_flow.rb:905:5:905:5 | a [element 1] | array_flow.rb:909:10:909:10 | a [element 1] | provenance | | | array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:906:9:906:9 | a [element 3] | provenance | | | array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:911:10:911:10 | a [element 3] | provenance | | -| array_flow.rb:905:13:905:24 | call to source | array_flow.rb:905:5:905:5 | a [element 1] | provenance | | -| array_flow.rb:905:30:905:41 | call to source | array_flow.rb:905:5:905:5 | a [element 3] | provenance | | +| array_flow.rb:905:9:905:42 | call to [] [element 1] | array_flow.rb:905:5:905:5 | a [element 1] | provenance | | +| array_flow.rb:905:9:905:42 | call to [] [element 3] | array_flow.rb:905:5:905:5 | a [element 3] | provenance | | +| array_flow.rb:905:13:905:24 | call to source | array_flow.rb:905:9:905:42 | call to [] [element 1] | provenance | | +| array_flow.rb:905:30:905:41 | call to source | array_flow.rb:905:9:905:42 | call to [] [element 3] | provenance | | | array_flow.rb:906:5:906:5 | b | array_flow.rb:907:10:907:10 | b | provenance | | | array_flow.rb:906:9:906:9 | a [element 1] | array_flow.rb:906:9:906:13 | call to pop | provenance | | | array_flow.rb:906:9:906:9 | a [element 3] | array_flow.rb:906:9:906:13 | call to pop | provenance | | @@ -996,8 +1102,10 @@ edges | array_flow.rb:913:5:913:5 | a [element 1] | array_flow.rb:918:10:918:10 | a [element 1] | provenance | | | array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:914:9:914:9 | a [element 3] | provenance | | | array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:920:10:920:10 | a [element 3] | provenance | | -| array_flow.rb:913:13:913:24 | call to source | array_flow.rb:913:5:913:5 | a [element 1] | provenance | | -| array_flow.rb:913:30:913:41 | call to source | array_flow.rb:913:5:913:5 | a [element 3] | provenance | | +| array_flow.rb:913:9:913:42 | call to [] [element 1] | array_flow.rb:913:5:913:5 | a [element 1] | provenance | | +| array_flow.rb:913:9:913:42 | call to [] [element 3] | array_flow.rb:913:5:913:5 | a [element 3] | provenance | | +| array_flow.rb:913:13:913:24 | call to source | array_flow.rb:913:9:913:42 | call to [] [element 1] | provenance | | +| array_flow.rb:913:30:913:41 | call to source | array_flow.rb:913:9:913:42 | call to [] [element 3] | provenance | | | array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:915:10:915:10 | b [element] | provenance | | | array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:916:10:916:10 | b [element] | provenance | | | array_flow.rb:914:9:914:9 | a [element 1] | array_flow.rb:914:9:914:16 | call to pop [element] | provenance | | @@ -1008,7 +1116,8 @@ edges | array_flow.rb:918:10:918:10 | a [element 1] | array_flow.rb:918:10:918:13 | ...[...] | provenance | | | array_flow.rb:920:10:920:10 | a [element 3] | array_flow.rb:920:10:920:13 | ...[...] | provenance | | | array_flow.rb:924:5:924:5 | a [element 2] | array_flow.rb:925:5:925:5 | a [element 2] | provenance | | -| array_flow.rb:924:16:924:27 | call to source | array_flow.rb:924:5:924:5 | a [element 2] | provenance | | +| array_flow.rb:924:9:924:28 | call to [] [element 2] | array_flow.rb:924:5:924:5 | a [element 2] | provenance | | +| array_flow.rb:924:16:924:27 | call to source | array_flow.rb:924:9:924:28 | call to [] [element 2] | provenance | | | array_flow.rb:925:5:925:5 | [post] a [element 2] | array_flow.rb:928:10:928:10 | a [element 2] | provenance | | | array_flow.rb:925:5:925:5 | [post] a [element 5] | array_flow.rb:931:10:931:10 | a [element 5] | provenance | | | array_flow.rb:925:5:925:5 | a [element 2] | array_flow.rb:925:5:925:5 | [post] a [element 5] | provenance | | @@ -1016,11 +1125,14 @@ edges | array_flow.rb:928:10:928:10 | a [element 2] | array_flow.rb:928:10:928:13 | ...[...] | provenance | | | array_flow.rb:931:10:931:10 | a [element 5] | array_flow.rb:931:10:931:13 | ...[...] | provenance | | | array_flow.rb:935:5:935:5 | a [element 2] | array_flow.rb:938:9:938:9 | a [element 2] | provenance | | -| array_flow.rb:935:16:935:27 | call to source | array_flow.rb:935:5:935:5 | a [element 2] | provenance | | +| array_flow.rb:935:9:935:28 | call to [] [element 2] | array_flow.rb:935:5:935:5 | a [element 2] | provenance | | +| array_flow.rb:935:16:935:27 | call to source | array_flow.rb:935:9:935:28 | call to [] [element 2] | provenance | | | array_flow.rb:936:5:936:5 | b [element 1] | array_flow.rb:938:19:938:19 | b [element 1] | provenance | | -| array_flow.rb:936:13:936:24 | call to source | array_flow.rb:936:5:936:5 | b [element 1] | provenance | | +| array_flow.rb:936:9:936:28 | call to [] [element 1] | array_flow.rb:936:5:936:5 | b [element 1] | provenance | | +| array_flow.rb:936:13:936:24 | call to source | array_flow.rb:936:9:936:28 | call to [] [element 1] | provenance | | | array_flow.rb:937:5:937:5 | c [element 0] | array_flow.rb:938:22:938:22 | c [element 0] | provenance | | -| array_flow.rb:937:10:937:21 | call to source | array_flow.rb:937:5:937:5 | c [element 0] | provenance | | +| array_flow.rb:937:9:937:28 | call to [] [element 0] | array_flow.rb:937:5:937:5 | c [element 0] | provenance | | +| array_flow.rb:937:10:937:21 | call to source | array_flow.rb:937:9:937:28 | call to [] [element 0] | provenance | | | array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:939:10:939:10 | d [element, element] | provenance | | | array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:940:10:940:10 | d [element, element] | provenance | | | array_flow.rb:938:9:938:9 | a [element 2] | array_flow.rb:938:9:938:22 | call to product [element, element] | provenance | | @@ -1033,7 +1145,8 @@ edges | array_flow.rb:940:10:940:13 | ...[...] [element] | array_flow.rb:940:10:940:16 | ...[...] | provenance | | | array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:945:9:945:9 | a [element 0] | provenance | | | array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:946:10:946:10 | a [element 0] | provenance | | -| array_flow.rb:944:10:944:21 | call to source | array_flow.rb:944:5:944:5 | a [element 0] | provenance | | +| array_flow.rb:944:9:944:25 | call to [] [element 0] | array_flow.rb:944:5:944:5 | a [element 0] | provenance | | +| array_flow.rb:944:10:944:21 | call to source | array_flow.rb:944:9:944:25 | call to [] [element 0] | provenance | | | array_flow.rb:945:5:945:5 | b [element 0] | array_flow.rb:948:10:948:10 | b [element 0] | provenance | | | array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:948:10:948:10 | b [element] | provenance | | | array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:949:10:949:10 | b [element] | provenance | | @@ -1053,10 +1166,12 @@ edges | array_flow.rb:948:10:948:10 | b [element] | array_flow.rb:948:10:948:13 | ...[...] | provenance | | | array_flow.rb:949:10:949:10 | b [element] | array_flow.rb:949:10:949:13 | ...[...] | provenance | | | array_flow.rb:955:5:955:5 | c [element 0] | array_flow.rb:956:16:956:16 | c [element 0] | provenance | | -| array_flow.rb:955:10:955:19 | call to source | array_flow.rb:955:5:955:5 | c [element 0] | provenance | | +| array_flow.rb:955:9:955:25 | call to [] [element 0] | array_flow.rb:955:5:955:5 | c [element 0] | provenance | | +| array_flow.rb:955:10:955:19 | call to source | array_flow.rb:955:9:955:25 | call to [] [element 0] | provenance | | | array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:957:10:957:10 | d [element 2, element 0] | provenance | | | array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:958:10:958:10 | d [element 2, element 0] | provenance | | -| array_flow.rb:956:16:956:16 | c [element 0] | array_flow.rb:956:5:956:5 | d [element 2, element 0] | provenance | | +| array_flow.rb:956:9:956:17 | call to [] [element 2, element 0] | array_flow.rb:956:5:956:5 | d [element 2, element 0] | provenance | | +| array_flow.rb:956:16:956:16 | c [element 0] | array_flow.rb:956:9:956:17 | call to [] [element 2, element 0] | provenance | | | array_flow.rb:957:10:957:10 | d [element 2, element 0] | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | provenance | | | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | array_flow.rb:957:10:957:25 | ...[...] | provenance | | | array_flow.rb:958:10:958:10 | d [element 2, element 0] | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | provenance | | @@ -1065,8 +1180,10 @@ edges | array_flow.rb:962:5:962:5 | a [element 0] | array_flow.rb:968:9:968:9 | a [element 0] | provenance | | | array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:963:9:963:9 | a [element 2] | provenance | | | array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:968:9:968:9 | a [element 2] | provenance | | -| array_flow.rb:962:10:962:21 | call to source | array_flow.rb:962:5:962:5 | a [element 0] | provenance | | -| array_flow.rb:962:27:962:38 | call to source | array_flow.rb:962:5:962:5 | a [element 2] | provenance | | +| array_flow.rb:962:9:962:39 | call to [] [element 0] | array_flow.rb:962:5:962:5 | a [element 0] | provenance | | +| array_flow.rb:962:9:962:39 | call to [] [element 2] | array_flow.rb:962:5:962:5 | a [element 2] | provenance | | +| array_flow.rb:962:10:962:21 | call to source | array_flow.rb:962:9:962:39 | call to [] [element 0] | provenance | | +| array_flow.rb:962:27:962:38 | call to source | array_flow.rb:962:9:962:39 | call to [] [element 2] | provenance | | | array_flow.rb:963:9:963:9 | a [element 0] | array_flow.rb:963:22:963:22 | x | provenance | | | array_flow.rb:963:9:963:9 | a [element 2] | array_flow.rb:963:25:963:25 | y | provenance | | | array_flow.rb:963:22:963:22 | x | array_flow.rb:964:14:964:14 | x | provenance | | @@ -1075,7 +1192,8 @@ edges | array_flow.rb:968:9:968:9 | a [element 2] | array_flow.rb:968:28:968:28 | y | provenance | | | array_flow.rb:968:28:968:28 | y | array_flow.rb:970:14:970:14 | y | provenance | | | array_flow.rb:976:5:976:5 | a [element 2] | array_flow.rb:977:9:977:9 | a [element 2] | provenance | | -| array_flow.rb:976:16:976:25 | call to source | array_flow.rb:976:5:976:5 | a [element 2] | provenance | | +| array_flow.rb:976:9:976:26 | call to [] [element 2] | array_flow.rb:976:5:976:5 | a [element 2] | provenance | | +| array_flow.rb:976:16:976:25 | call to source | array_flow.rb:976:9:976:26 | call to [] [element 2] | provenance | | | array_flow.rb:977:5:977:5 | b [element] | array_flow.rb:981:10:981:10 | b [element] | provenance | | | array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:9:980:7 | call to reject [element] | provenance | | | array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:22:977:22 | x | provenance | | @@ -1083,7 +1201,8 @@ edges | array_flow.rb:977:22:977:22 | x | array_flow.rb:978:14:978:14 | x | provenance | | | array_flow.rb:981:10:981:10 | b [element] | array_flow.rb:981:10:981:13 | ...[...] | provenance | | | array_flow.rb:985:5:985:5 | a [element 2] | array_flow.rb:986:9:986:9 | a [element 2] | provenance | | -| array_flow.rb:985:16:985:25 | call to source | array_flow.rb:985:5:985:5 | a [element 2] | provenance | | +| array_flow.rb:985:9:985:26 | call to [] [element 2] | array_flow.rb:985:5:985:5 | a [element 2] | provenance | | +| array_flow.rb:985:16:985:25 | call to source | array_flow.rb:985:9:985:26 | call to [] [element 2] | provenance | | | array_flow.rb:986:5:986:5 | b [element] | array_flow.rb:991:10:991:10 | b [element] | provenance | | | array_flow.rb:986:9:986:9 | [post] a [element] | array_flow.rb:990:10:990:10 | a [element] | provenance | | | array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:9:986:9 | [post] a [element] | provenance | | @@ -1094,7 +1213,8 @@ edges | array_flow.rb:990:10:990:10 | a [element] | array_flow.rb:990:10:990:13 | ...[...] | provenance | | | array_flow.rb:991:10:991:10 | b [element] | array_flow.rb:991:10:991:13 | ...[...] | provenance | | | array_flow.rb:995:5:995:5 | a [element 2] | array_flow.rb:996:9:996:9 | a [element 2] | provenance | | -| array_flow.rb:995:16:995:25 | call to source | array_flow.rb:995:5:995:5 | a [element 2] | provenance | | +| array_flow.rb:995:9:995:26 | call to [] [element 2] | array_flow.rb:995:5:995:5 | a [element 2] | provenance | | +| array_flow.rb:995:16:995:25 | call to source | array_flow.rb:995:9:995:26 | call to [] [element 2] | provenance | | | array_flow.rb:996:5:996:5 | b [element 2] | array_flow.rb:1001:10:1001:10 | b [element 2] | provenance | | | array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | provenance | | | array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:39:996:39 | x [element] | provenance | | @@ -1105,7 +1225,8 @@ edges | array_flow.rb:998:14:998:14 | x [element] | array_flow.rb:998:14:998:17 | ...[...] | provenance | | | array_flow.rb:1001:10:1001:10 | b [element 2] | array_flow.rb:1001:10:1001:13 | ...[...] | provenance | | | array_flow.rb:1005:5:1005:5 | a [element 2] | array_flow.rb:1006:9:1006:9 | a [element 2] | provenance | | -| array_flow.rb:1005:16:1005:25 | call to source | array_flow.rb:1005:5:1005:5 | a [element 2] | provenance | | +| array_flow.rb:1005:9:1005:26 | call to [] [element 2] | array_flow.rb:1005:5:1005:5 | a [element 2] | provenance | | +| array_flow.rb:1005:16:1005:25 | call to source | array_flow.rb:1005:9:1005:26 | call to [] [element 2] | provenance | | | array_flow.rb:1006:5:1006:5 | b [element 2] | array_flow.rb:1011:10:1011:10 | b [element 2] | provenance | | | array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | provenance | | | array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:39:1006:39 | x [element] | provenance | | @@ -1118,16 +1239,19 @@ edges | array_flow.rb:1017:5:1017:5 | b [element 0] | array_flow.rb:1019:10:1019:10 | b [element 0] | provenance | | | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | array_flow.rb:1018:10:1018:10 | a [element 0] | provenance | | | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | array_flow.rb:1017:5:1017:5 | b [element 0] | provenance | | -| array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | provenance | | -| array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | provenance | | +| array_flow.rb:1017:19:1017:32 | call to [] [element 0] | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | provenance | | +| array_flow.rb:1017:19:1017:32 | call to [] [element 0] | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | provenance | | +| array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:19:1017:32 | call to [] [element 0] | provenance | | | array_flow.rb:1018:10:1018:10 | a [element 0] | array_flow.rb:1018:10:1018:13 | ...[...] | provenance | | | array_flow.rb:1019:10:1019:10 | b [element 0] | array_flow.rb:1019:10:1019:13 | ...[...] | provenance | | | array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1024:9:1024:9 | a [element 2] | provenance | | | array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1029:10:1029:10 | a [element 2] | provenance | | | array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1024:9:1024:9 | a [element 3] | provenance | | | array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1030:10:1030:10 | a [element 3] | provenance | | -| array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:5:1023:5 | a [element 2] | provenance | | -| array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:5:1023:5 | a [element 3] | provenance | | +| array_flow.rb:1023:9:1023:44 | call to [] [element 2] | array_flow.rb:1023:5:1023:5 | a [element 2] | provenance | | +| array_flow.rb:1023:9:1023:44 | call to [] [element 3] | array_flow.rb:1023:5:1023:5 | a [element 3] | provenance | | +| array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:9:1023:44 | call to [] [element 2] | provenance | | +| array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:9:1023:44 | call to [] [element 3] | provenance | | | array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1025:10:1025:10 | b [element] | provenance | | | array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1026:10:1026:10 | b [element] | provenance | | | array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1027:10:1027:10 | b [element] | provenance | | @@ -1143,8 +1267,10 @@ edges | array_flow.rb:1034:5:1034:5 | a [element 2] | array_flow.rb:1040:10:1040:10 | a [element 2] | provenance | | | array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1035:9:1035:9 | a [element 3] | provenance | | | array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1041:10:1041:10 | a [element 3] | provenance | | -| array_flow.rb:1034:16:1034:28 | call to source | array_flow.rb:1034:5:1034:5 | a [element 2] | provenance | | -| array_flow.rb:1034:31:1034:43 | call to source | array_flow.rb:1034:5:1034:5 | a [element 3] | provenance | | +| array_flow.rb:1034:9:1034:44 | call to [] [element 2] | array_flow.rb:1034:5:1034:5 | a [element 2] | provenance | | +| array_flow.rb:1034:9:1034:44 | call to [] [element 3] | array_flow.rb:1034:5:1034:5 | a [element 3] | provenance | | +| array_flow.rb:1034:16:1034:28 | call to source | array_flow.rb:1034:9:1034:44 | call to [] [element 2] | provenance | | +| array_flow.rb:1034:31:1034:43 | call to source | array_flow.rb:1034:9:1034:44 | call to [] [element 3] | provenance | | | array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1036:10:1036:10 | b [element] | provenance | | | array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1037:10:1037:10 | b [element] | provenance | | | array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1038:10:1038:10 | b [element] | provenance | | @@ -1165,7 +1291,8 @@ edges | array_flow.rb:1041:10:1041:10 | a [element 3] | array_flow.rb:1041:10:1041:13 | ...[...] | provenance | | | array_flow.rb:1041:10:1041:10 | a [element] | array_flow.rb:1041:10:1041:13 | ...[...] | provenance | | | array_flow.rb:1045:5:1045:5 | a [element 2] | array_flow.rb:1046:9:1046:9 | a [element 2] | provenance | | -| array_flow.rb:1045:16:1045:26 | call to source | array_flow.rb:1045:5:1045:5 | a [element 2] | provenance | | +| array_flow.rb:1045:9:1045:27 | call to [] [element 2] | array_flow.rb:1045:5:1045:5 | a [element 2] | provenance | | +| array_flow.rb:1045:16:1045:26 | call to source | array_flow.rb:1045:9:1045:27 | call to [] [element 2] | provenance | | | array_flow.rb:1046:5:1046:5 | b [element 2] | array_flow.rb:1049:10:1049:10 | b [element 2] | provenance | | | array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | provenance | | | array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:28:1046:28 | x | provenance | | @@ -1173,7 +1300,8 @@ edges | array_flow.rb:1046:28:1046:28 | x | array_flow.rb:1047:14:1047:14 | x | provenance | | | array_flow.rb:1049:10:1049:10 | b [element 2] | array_flow.rb:1049:10:1049:13 | ...[...] | provenance | | | array_flow.rb:1053:5:1053:5 | a [element 2] | array_flow.rb:1054:5:1054:5 | a [element 2] | provenance | | -| array_flow.rb:1053:16:1053:26 | call to source | array_flow.rb:1053:5:1053:5 | a [element 2] | provenance | | +| array_flow.rb:1053:9:1053:27 | call to [] [element 2] | array_flow.rb:1053:5:1053:5 | a [element 2] | provenance | | +| array_flow.rb:1053:16:1053:26 | call to source | array_flow.rb:1053:9:1053:27 | call to [] [element 2] | provenance | | | array_flow.rb:1054:5:1054:5 | a [element 2] | array_flow.rb:1054:18:1054:18 | x | provenance | | | array_flow.rb:1054:18:1054:18 | x | array_flow.rb:1055:14:1055:14 | x | provenance | | | array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1065:9:1065:9 | a [element 0] | provenance | | @@ -1188,9 +1316,12 @@ edges | array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1071:9:1071:9 | a [element 3] | provenance | | | array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1077:9:1077:9 | a [element 3] | provenance | | | array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1083:9:1083:9 | a [element 3] | provenance | | -| array_flow.rb:1063:10:1063:22 | call to source | array_flow.rb:1063:5:1063:5 | a [element 0] | provenance | | -| array_flow.rb:1063:28:1063:40 | call to source | array_flow.rb:1063:5:1063:5 | a [element 2] | provenance | | -| array_flow.rb:1063:43:1063:55 | call to source | array_flow.rb:1063:5:1063:5 | a [element 3] | provenance | | +| array_flow.rb:1063:9:1063:56 | call to [] [element 0] | array_flow.rb:1063:5:1063:5 | a [element 0] | provenance | | +| array_flow.rb:1063:9:1063:56 | call to [] [element 2] | array_flow.rb:1063:5:1063:5 | a [element 2] | provenance | | +| array_flow.rb:1063:9:1063:56 | call to [] [element 3] | array_flow.rb:1063:5:1063:5 | a [element 3] | provenance | | +| array_flow.rb:1063:10:1063:22 | call to source | array_flow.rb:1063:9:1063:56 | call to [] [element 0] | provenance | | +| array_flow.rb:1063:28:1063:40 | call to source | array_flow.rb:1063:9:1063:56 | call to [] [element 2] | provenance | | +| array_flow.rb:1063:43:1063:55 | call to source | array_flow.rb:1063:9:1063:56 | call to [] [element 3] | provenance | | | array_flow.rb:1065:5:1065:5 | b [element 1] | array_flow.rb:1067:10:1067:10 | b [element 1] | provenance | | | array_flow.rb:1065:5:1065:5 | b [element 2] | array_flow.rb:1068:10:1068:10 | b [element 2] | provenance | | | array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1066:10:1066:10 | b [element] | provenance | | @@ -1254,9 +1385,12 @@ edges | array_flow.rb:1095:5:1095:5 | a [element 0] | array_flow.rb:1096:9:1096:9 | a [element 0] | provenance | | | array_flow.rb:1095:5:1095:5 | a [element 2] | array_flow.rb:1096:9:1096:9 | a [element 2] | provenance | | | array_flow.rb:1095:5:1095:5 | a [element 3] | array_flow.rb:1096:9:1096:9 | a [element 3] | provenance | | -| array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:5:1095:5 | a [element 0] | provenance | | -| array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:5:1095:5 | a [element 2] | provenance | | -| array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:5:1095:5 | a [element 3] | provenance | | +| array_flow.rb:1095:9:1095:56 | call to [] [element 0] | array_flow.rb:1095:5:1095:5 | a [element 0] | provenance | | +| array_flow.rb:1095:9:1095:56 | call to [] [element 2] | array_flow.rb:1095:5:1095:5 | a [element 2] | provenance | | +| array_flow.rb:1095:9:1095:56 | call to [] [element 3] | array_flow.rb:1095:5:1095:5 | a [element 3] | provenance | | +| array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:9:1095:56 | call to [] [element 0] | provenance | | +| array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:9:1095:56 | call to [] [element 2] | provenance | | +| array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:9:1095:56 | call to [] [element 3] | provenance | | | array_flow.rb:1096:5:1096:5 | b [element 1] | array_flow.rb:1102:10:1102:10 | b [element 1] | provenance | | | array_flow.rb:1096:5:1096:5 | b [element 2] | array_flow.rb:1103:10:1103:10 | b [element 2] | provenance | | | array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1101:10:1101:10 | b [element] | provenance | | @@ -1293,9 +1427,12 @@ edges | array_flow.rb:1106:5:1106:5 | a [element 0] | array_flow.rb:1107:9:1107:9 | a [element 0] | provenance | | | array_flow.rb:1106:5:1106:5 | a [element 2] | array_flow.rb:1107:9:1107:9 | a [element 2] | provenance | | | array_flow.rb:1106:5:1106:5 | a [element 3] | array_flow.rb:1107:9:1107:9 | a [element 3] | provenance | | -| array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:5:1106:5 | a [element 0] | provenance | | -| array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:5:1106:5 | a [element 2] | provenance | | -| array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:5:1106:5 | a [element 3] | provenance | | +| array_flow.rb:1106:9:1106:56 | call to [] [element 0] | array_flow.rb:1106:5:1106:5 | a [element 0] | provenance | | +| array_flow.rb:1106:9:1106:56 | call to [] [element 2] | array_flow.rb:1106:5:1106:5 | a [element 2] | provenance | | +| array_flow.rb:1106:9:1106:56 | call to [] [element 3] | array_flow.rb:1106:5:1106:5 | a [element 3] | provenance | | +| array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:9:1106:56 | call to [] [element 0] | provenance | | +| array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:9:1106:56 | call to [] [element 2] | provenance | | +| array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:9:1106:56 | call to [] [element 3] | provenance | | | array_flow.rb:1107:5:1107:5 | b [element 0] | array_flow.rb:1112:10:1112:10 | b [element 0] | provenance | | | array_flow.rb:1107:5:1107:5 | b [element 1] | array_flow.rb:1113:10:1113:10 | b [element 1] | provenance | | | array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1112:10:1112:10 | b [element] | provenance | | @@ -1332,9 +1469,12 @@ edges | array_flow.rb:1117:5:1117:5 | a [element 0] | array_flow.rb:1118:9:1118:9 | a [element 0] | provenance | | | array_flow.rb:1117:5:1117:5 | a [element 2] | array_flow.rb:1118:9:1118:9 | a [element 2] | provenance | | | array_flow.rb:1117:5:1117:5 | a [element 3] | array_flow.rb:1118:9:1118:9 | a [element 3] | provenance | | -| array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:5:1117:5 | a [element 0] | provenance | | -| array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:5:1117:5 | a [element 2] | provenance | | -| array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:5:1117:5 | a [element 3] | provenance | | +| array_flow.rb:1117:9:1117:56 | call to [] [element 0] | array_flow.rb:1117:5:1117:5 | a [element 0] | provenance | | +| array_flow.rb:1117:9:1117:56 | call to [] [element 2] | array_flow.rb:1117:5:1117:5 | a [element 2] | provenance | | +| array_flow.rb:1117:9:1117:56 | call to [] [element 3] | array_flow.rb:1117:5:1117:5 | a [element 3] | provenance | | +| array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:9:1117:56 | call to [] [element 0] | provenance | | +| array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:9:1117:56 | call to [] [element 2] | provenance | | +| array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:9:1117:56 | call to [] [element 3] | provenance | | | array_flow.rb:1118:5:1118:5 | b [element 0] | array_flow.rb:1123:10:1123:10 | b [element 0] | provenance | | | array_flow.rb:1118:5:1118:5 | b [element 2] | array_flow.rb:1125:10:1125:10 | b [element 2] | provenance | | | array_flow.rb:1118:5:1118:5 | b [element 3] | array_flow.rb:1126:10:1126:10 | b [element 3] | provenance | | @@ -1359,9 +1499,12 @@ edges | array_flow.rb:1128:5:1128:5 | a [element 0] | array_flow.rb:1129:9:1129:9 | a [element 0] | provenance | | | array_flow.rb:1128:5:1128:5 | a [element 2] | array_flow.rb:1129:9:1129:9 | a [element 2] | provenance | | | array_flow.rb:1128:5:1128:5 | a [element 3] | array_flow.rb:1129:9:1129:9 | a [element 3] | provenance | | -| array_flow.rb:1128:10:1128:22 | call to source | array_flow.rb:1128:5:1128:5 | a [element 0] | provenance | | -| array_flow.rb:1128:28:1128:40 | call to source | array_flow.rb:1128:5:1128:5 | a [element 2] | provenance | | -| array_flow.rb:1128:43:1128:55 | call to source | array_flow.rb:1128:5:1128:5 | a [element 3] | provenance | | +| array_flow.rb:1128:9:1128:56 | call to [] [element 0] | array_flow.rb:1128:5:1128:5 | a [element 0] | provenance | | +| array_flow.rb:1128:9:1128:56 | call to [] [element 2] | array_flow.rb:1128:5:1128:5 | a [element 2] | provenance | | +| array_flow.rb:1128:9:1128:56 | call to [] [element 3] | array_flow.rb:1128:5:1128:5 | a [element 3] | provenance | | +| array_flow.rb:1128:10:1128:22 | call to source | array_flow.rb:1128:9:1128:56 | call to [] [element 0] | provenance | | +| array_flow.rb:1128:28:1128:40 | call to source | array_flow.rb:1128:9:1128:56 | call to [] [element 2] | provenance | | +| array_flow.rb:1128:43:1128:55 | call to source | array_flow.rb:1128:9:1128:56 | call to [] [element 3] | provenance | | | array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1134:10:1134:10 | b [element] | provenance | | | array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1135:10:1135:10 | b [element] | provenance | | | array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1136:10:1136:10 | b [element] | provenance | | @@ -1386,7 +1529,8 @@ edges | array_flow.rb:1136:10:1136:10 | b [element] | array_flow.rb:1136:10:1136:13 | ...[...] | provenance | | | array_flow.rb:1137:10:1137:10 | b [element] | array_flow.rb:1137:10:1137:13 | ...[...] | provenance | | | array_flow.rb:1141:5:1141:5 | a [element 3] | array_flow.rb:1142:9:1142:9 | a [element 3] | provenance | | -| array_flow.rb:1141:19:1141:29 | call to source | array_flow.rb:1141:5:1141:5 | a [element 3] | provenance | | +| array_flow.rb:1141:9:1141:30 | call to [] [element 3] | array_flow.rb:1141:5:1141:5 | a [element 3] | provenance | | +| array_flow.rb:1141:19:1141:29 | call to source | array_flow.rb:1141:9:1141:30 | call to [] [element 3] | provenance | | | array_flow.rb:1142:5:1142:5 | b [element] | array_flow.rb:1145:10:1145:10 | b [element] | provenance | | | array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:9:1144:7 | call to select [element] | provenance | | | array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:22:1142:22 | x | provenance | | @@ -1394,7 +1538,8 @@ edges | array_flow.rb:1142:22:1142:22 | x | array_flow.rb:1143:14:1143:14 | x | provenance | | | array_flow.rb:1145:10:1145:10 | b [element] | array_flow.rb:1145:10:1145:13 | ...[...] | provenance | | | array_flow.rb:1149:5:1149:5 | a [element 2] | array_flow.rb:1150:9:1150:9 | a [element 2] | provenance | | -| array_flow.rb:1149:16:1149:26 | call to source | array_flow.rb:1149:5:1149:5 | a [element 2] | provenance | | +| array_flow.rb:1149:9:1149:27 | call to [] [element 2] | array_flow.rb:1149:5:1149:5 | a [element 2] | provenance | | +| array_flow.rb:1149:16:1149:26 | call to source | array_flow.rb:1149:9:1149:27 | call to [] [element 2] | provenance | | | array_flow.rb:1150:5:1150:5 | b [element] | array_flow.rb:1155:10:1155:10 | b [element] | provenance | | | array_flow.rb:1150:9:1150:9 | [post] a [element] | array_flow.rb:1154:10:1154:10 | a [element] | provenance | | | array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:9:1150:9 | [post] a [element] | provenance | | @@ -1406,8 +1551,10 @@ edges | array_flow.rb:1155:10:1155:10 | b [element] | array_flow.rb:1155:10:1155:13 | ...[...] | provenance | | | array_flow.rb:1159:5:1159:5 | a [element 0] | array_flow.rb:1160:9:1160:9 | a [element 0] | provenance | | | array_flow.rb:1159:5:1159:5 | a [element 2] | array_flow.rb:1160:9:1160:9 | a [element 2] | provenance | | -| array_flow.rb:1159:10:1159:22 | call to source | array_flow.rb:1159:5:1159:5 | a [element 0] | provenance | | -| array_flow.rb:1159:28:1159:40 | call to source | array_flow.rb:1159:5:1159:5 | a [element 2] | provenance | | +| array_flow.rb:1159:9:1159:41 | call to [] [element 0] | array_flow.rb:1159:5:1159:5 | a [element 0] | provenance | | +| array_flow.rb:1159:9:1159:41 | call to [] [element 2] | array_flow.rb:1159:5:1159:5 | a [element 2] | provenance | | +| array_flow.rb:1159:10:1159:22 | call to source | array_flow.rb:1159:9:1159:41 | call to [] [element 0] | provenance | | +| array_flow.rb:1159:28:1159:40 | call to source | array_flow.rb:1159:9:1159:41 | call to [] [element 2] | provenance | | | array_flow.rb:1160:5:1160:5 | b | array_flow.rb:1161:10:1161:10 | b | provenance | | | array_flow.rb:1160:9:1160:9 | [post] a [element 1] | array_flow.rb:1163:10:1163:10 | a [element 1] | provenance | | | array_flow.rb:1160:9:1160:9 | a [element 0] | array_flow.rb:1160:9:1160:15 | call to shift | provenance | | @@ -1416,8 +1563,10 @@ edges | array_flow.rb:1163:10:1163:10 | a [element 1] | array_flow.rb:1163:10:1163:13 | ...[...] | provenance | | | array_flow.rb:1166:5:1166:5 | a [element 0] | array_flow.rb:1167:9:1167:9 | a [element 0] | provenance | | | array_flow.rb:1166:5:1166:5 | a [element 2] | array_flow.rb:1167:9:1167:9 | a [element 2] | provenance | | -| array_flow.rb:1166:10:1166:22 | call to source | array_flow.rb:1166:5:1166:5 | a [element 0] | provenance | | -| array_flow.rb:1166:28:1166:40 | call to source | array_flow.rb:1166:5:1166:5 | a [element 2] | provenance | | +| array_flow.rb:1166:9:1166:41 | call to [] [element 0] | array_flow.rb:1166:5:1166:5 | a [element 0] | provenance | | +| array_flow.rb:1166:9:1166:41 | call to [] [element 2] | array_flow.rb:1166:5:1166:5 | a [element 2] | provenance | | +| array_flow.rb:1166:10:1166:22 | call to source | array_flow.rb:1166:9:1166:41 | call to [] [element 0] | provenance | | +| array_flow.rb:1166:28:1166:40 | call to source | array_flow.rb:1166:9:1166:41 | call to [] [element 2] | provenance | | | array_flow.rb:1167:5:1167:5 | b [element 0] | array_flow.rb:1168:10:1168:10 | b [element 0] | provenance | | | array_flow.rb:1167:9:1167:9 | [post] a [element 0] | array_flow.rb:1170:10:1170:10 | a [element 0] | provenance | | | array_flow.rb:1167:9:1167:9 | a [element 0] | array_flow.rb:1167:9:1167:18 | call to shift [element 0] | provenance | | @@ -1429,8 +1578,10 @@ edges | array_flow.rb:1174:5:1174:5 | a [element 0] | array_flow.rb:1178:10:1178:10 | a [element 0] | provenance | | | array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1175:9:1175:9 | a [element 2] | provenance | | | array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1180:10:1180:10 | a [element 2] | provenance | | -| array_flow.rb:1174:10:1174:22 | call to source | array_flow.rb:1174:5:1174:5 | a [element 0] | provenance | | -| array_flow.rb:1174:28:1174:40 | call to source | array_flow.rb:1174:5:1174:5 | a [element 2] | provenance | | +| array_flow.rb:1174:9:1174:41 | call to [] [element 0] | array_flow.rb:1174:5:1174:5 | a [element 0] | provenance | | +| array_flow.rb:1174:9:1174:41 | call to [] [element 2] | array_flow.rb:1174:5:1174:5 | a [element 2] | provenance | | +| array_flow.rb:1174:10:1174:22 | call to source | array_flow.rb:1174:9:1174:41 | call to [] [element 0] | provenance | | +| array_flow.rb:1174:28:1174:40 | call to source | array_flow.rb:1174:9:1174:41 | call to [] [element 2] | provenance | | | array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1176:10:1176:10 | b [element] | provenance | | | array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1177:10:1177:10 | b [element] | provenance | | | array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1178:10:1178:10 | a [element] | provenance | | @@ -1450,7 +1601,8 @@ edges | array_flow.rb:1180:10:1180:10 | a [element] | array_flow.rb:1180:10:1180:13 | ...[...] | provenance | | | array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1185:9:1185:9 | a [element 2] | provenance | | | array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1188:10:1188:10 | a [element 2] | provenance | | -| array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:5:1184:5 | a [element 2] | provenance | | +| array_flow.rb:1184:9:1184:27 | call to [] [element 2] | array_flow.rb:1184:5:1184:5 | a [element 2] | provenance | | +| array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:9:1184:27 | call to [] [element 2] | provenance | | | array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1189:10:1189:10 | b [element] | provenance | | | array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1190:10:1190:10 | b [element] | provenance | | | array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1191:10:1191:10 | b [element] | provenance | | @@ -1462,7 +1614,8 @@ edges | array_flow.rb:1191:10:1191:10 | b [element] | array_flow.rb:1191:10:1191:13 | ...[...] | provenance | | | array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1196:9:1196:9 | a [element 2] | provenance | | | array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1199:10:1199:10 | a [element 2] | provenance | | -| array_flow.rb:1195:16:1195:26 | call to source | array_flow.rb:1195:5:1195:5 | a [element 2] | provenance | | +| array_flow.rb:1195:9:1195:27 | call to [] [element 2] | array_flow.rb:1195:5:1195:5 | a [element 2] | provenance | | +| array_flow.rb:1195:16:1195:26 | call to source | array_flow.rb:1195:9:1195:27 | call to [] [element 2] | provenance | | | array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1200:10:1200:10 | b [element] | provenance | | | array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1201:10:1201:10 | b [element] | provenance | | | array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1202:10:1202:10 | b [element] | provenance | | @@ -1497,8 +1650,10 @@ edges | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1240:9:1240:9 | a [element 4] | provenance | | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1244:9:1244:9 | a [element 4] | provenance | | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1253:9:1253:9 | a [element 4] | provenance | | -| array_flow.rb:1206:16:1206:28 | call to source | array_flow.rb:1206:5:1206:5 | a [element 2] | provenance | | -| array_flow.rb:1206:34:1206:46 | call to source | array_flow.rb:1206:5:1206:5 | a [element 4] | provenance | | +| array_flow.rb:1206:9:1206:47 | call to [] [element 2] | array_flow.rb:1206:5:1206:5 | a [element 2] | provenance | | +| array_flow.rb:1206:9:1206:47 | call to [] [element 4] | array_flow.rb:1206:5:1206:5 | a [element 4] | provenance | | +| array_flow.rb:1206:16:1206:28 | call to source | array_flow.rb:1206:9:1206:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1206:34:1206:46 | call to source | array_flow.rb:1206:9:1206:47 | call to [] [element 4] | provenance | | | array_flow.rb:1208:5:1208:5 | b | array_flow.rb:1209:10:1209:10 | b | provenance | | | array_flow.rb:1208:9:1208:9 | a [element 4] | array_flow.rb:1208:9:1208:17 | call to slice | provenance | | | array_flow.rb:1208:9:1208:17 | call to slice | array_flow.rb:1208:5:1208:5 | b | provenance | | @@ -1562,8 +1717,10 @@ edges | array_flow.rb:1256:10:1256:10 | b [element] | array_flow.rb:1256:10:1256:13 | ...[...] | provenance | | | array_flow.rb:1260:5:1260:5 | a [element 2] | array_flow.rb:1261:9:1261:9 | a [element 2] | provenance | | | array_flow.rb:1260:5:1260:5 | a [element 4] | array_flow.rb:1261:9:1261:9 | a [element 4] | provenance | | -| array_flow.rb:1260:16:1260:28 | call to source | array_flow.rb:1260:5:1260:5 | a [element 2] | provenance | | -| array_flow.rb:1260:34:1260:46 | call to source | array_flow.rb:1260:5:1260:5 | a [element 4] | provenance | | +| array_flow.rb:1260:9:1260:47 | call to [] [element 2] | array_flow.rb:1260:5:1260:5 | a [element 2] | provenance | | +| array_flow.rb:1260:9:1260:47 | call to [] [element 4] | array_flow.rb:1260:5:1260:5 | a [element 4] | provenance | | +| array_flow.rb:1260:16:1260:28 | call to source | array_flow.rb:1260:9:1260:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1260:34:1260:46 | call to source | array_flow.rb:1260:9:1260:47 | call to [] [element 4] | provenance | | | array_flow.rb:1261:5:1261:5 | b | array_flow.rb:1262:10:1262:10 | b | provenance | | | array_flow.rb:1261:9:1261:9 | [post] a [element 3] | array_flow.rb:1266:10:1266:10 | a [element 3] | provenance | | | array_flow.rb:1261:9:1261:9 | a [element 2] | array_flow.rb:1261:9:1261:19 | call to slice! | provenance | | @@ -1572,8 +1729,10 @@ edges | array_flow.rb:1266:10:1266:10 | a [element 3] | array_flow.rb:1266:10:1266:13 | ...[...] | provenance | | | array_flow.rb:1268:5:1268:5 | a [element 2] | array_flow.rb:1269:9:1269:9 | a [element 2] | provenance | | | array_flow.rb:1268:5:1268:5 | a [element 4] | array_flow.rb:1269:9:1269:9 | a [element 4] | provenance | | -| array_flow.rb:1268:16:1268:28 | call to source | array_flow.rb:1268:5:1268:5 | a [element 2] | provenance | | -| array_flow.rb:1268:34:1268:46 | call to source | array_flow.rb:1268:5:1268:5 | a [element 4] | provenance | | +| array_flow.rb:1268:9:1268:47 | call to [] [element 2] | array_flow.rb:1268:5:1268:5 | a [element 2] | provenance | | +| array_flow.rb:1268:9:1268:47 | call to [] [element 4] | array_flow.rb:1268:5:1268:5 | a [element 4] | provenance | | +| array_flow.rb:1268:16:1268:28 | call to source | array_flow.rb:1268:9:1268:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1268:34:1268:46 | call to source | array_flow.rb:1268:9:1268:47 | call to [] [element 4] | provenance | | | array_flow.rb:1269:5:1269:5 | b | array_flow.rb:1275:10:1275:10 | b | provenance | | | array_flow.rb:1269:5:1269:5 | b [element] | array_flow.rb:1277:10:1277:10 | b [element] | provenance | | | array_flow.rb:1269:9:1269:9 | [post] a [element] | array_flow.rb:1270:10:1270:10 | a [element] | provenance | | @@ -1595,8 +1754,10 @@ edges | array_flow.rb:1277:10:1277:10 | b [element] | array_flow.rb:1277:10:1277:13 | ...[...] | provenance | | | array_flow.rb:1279:5:1279:5 | a [element 2] | array_flow.rb:1280:9:1280:9 | a [element 2] | provenance | | | array_flow.rb:1279:5:1279:5 | a [element 4] | array_flow.rb:1280:9:1280:9 | a [element 4] | provenance | | -| array_flow.rb:1279:16:1279:28 | call to source | array_flow.rb:1279:5:1279:5 | a [element 2] | provenance | | -| array_flow.rb:1279:34:1279:46 | call to source | array_flow.rb:1279:5:1279:5 | a [element 4] | provenance | | +| array_flow.rb:1279:9:1279:47 | call to [] [element 2] | array_flow.rb:1279:5:1279:5 | a [element 2] | provenance | | +| array_flow.rb:1279:9:1279:47 | call to [] [element 4] | array_flow.rb:1279:5:1279:5 | a [element 4] | provenance | | +| array_flow.rb:1279:16:1279:28 | call to source | array_flow.rb:1279:9:1279:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1279:34:1279:46 | call to source | array_flow.rb:1279:9:1279:47 | call to [] [element 4] | provenance | | | array_flow.rb:1280:5:1280:5 | b [element 0] | array_flow.rb:1281:10:1281:10 | b [element 0] | provenance | | | array_flow.rb:1280:5:1280:5 | b [element 2] | array_flow.rb:1283:10:1283:10 | b [element 2] | provenance | | | array_flow.rb:1280:9:1280:9 | a [element 2] | array_flow.rb:1280:9:1280:22 | call to slice! [element 0] | provenance | | @@ -1607,8 +1768,10 @@ edges | array_flow.rb:1283:10:1283:10 | b [element 2] | array_flow.rb:1283:10:1283:13 | ...[...] | provenance | | | array_flow.rb:1290:5:1290:5 | a [element 2] | array_flow.rb:1291:9:1291:9 | a [element 2] | provenance | | | array_flow.rb:1290:5:1290:5 | a [element 4] | array_flow.rb:1291:9:1291:9 | a [element 4] | provenance | | -| array_flow.rb:1290:16:1290:28 | call to source | array_flow.rb:1290:5:1290:5 | a [element 2] | provenance | | -| array_flow.rb:1290:34:1290:46 | call to source | array_flow.rb:1290:5:1290:5 | a [element 4] | provenance | | +| array_flow.rb:1290:9:1290:47 | call to [] [element 2] | array_flow.rb:1290:5:1290:5 | a [element 2] | provenance | | +| array_flow.rb:1290:9:1290:47 | call to [] [element 4] | array_flow.rb:1290:5:1290:5 | a [element 4] | provenance | | +| array_flow.rb:1290:16:1290:28 | call to source | array_flow.rb:1290:9:1290:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1290:34:1290:46 | call to source | array_flow.rb:1290:9:1290:47 | call to [] [element 4] | provenance | | | array_flow.rb:1291:5:1291:5 | b [element 0] | array_flow.rb:1292:10:1292:10 | b [element 0] | provenance | | | array_flow.rb:1291:9:1291:9 | [post] a [element 2] | array_flow.rb:1297:10:1297:10 | a [element 2] | provenance | | | array_flow.rb:1291:9:1291:9 | a [element 2] | array_flow.rb:1291:9:1291:22 | call to slice! [element 0] | provenance | | @@ -1618,8 +1781,10 @@ edges | array_flow.rb:1297:10:1297:10 | a [element 2] | array_flow.rb:1297:10:1297:13 | ...[...] | provenance | | | array_flow.rb:1301:5:1301:5 | a [element 2] | array_flow.rb:1302:9:1302:9 | a [element 2] | provenance | | | array_flow.rb:1301:5:1301:5 | a [element 4] | array_flow.rb:1302:9:1302:9 | a [element 4] | provenance | | -| array_flow.rb:1301:16:1301:28 | call to source | array_flow.rb:1301:5:1301:5 | a [element 2] | provenance | | -| array_flow.rb:1301:34:1301:46 | call to source | array_flow.rb:1301:5:1301:5 | a [element 4] | provenance | | +| array_flow.rb:1301:9:1301:47 | call to [] [element 2] | array_flow.rb:1301:5:1301:5 | a [element 2] | provenance | | +| array_flow.rb:1301:9:1301:47 | call to [] [element 4] | array_flow.rb:1301:5:1301:5 | a [element 4] | provenance | | +| array_flow.rb:1301:16:1301:28 | call to source | array_flow.rb:1301:9:1301:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1301:34:1301:46 | call to source | array_flow.rb:1301:9:1301:47 | call to [] [element 4] | provenance | | | array_flow.rb:1302:5:1302:5 | b [element 0] | array_flow.rb:1303:10:1303:10 | b [element 0] | provenance | | | array_flow.rb:1302:9:1302:9 | [post] a [element 2] | array_flow.rb:1308:10:1308:10 | a [element 2] | provenance | | | array_flow.rb:1302:9:1302:9 | a [element 2] | array_flow.rb:1302:9:1302:23 | call to slice! [element 0] | provenance | | @@ -1629,8 +1794,10 @@ edges | array_flow.rb:1308:10:1308:10 | a [element 2] | array_flow.rb:1308:10:1308:13 | ...[...] | provenance | | | array_flow.rb:1312:5:1312:5 | a [element 2] | array_flow.rb:1313:9:1313:9 | a [element 2] | provenance | | | array_flow.rb:1312:5:1312:5 | a [element 4] | array_flow.rb:1313:9:1313:9 | a [element 4] | provenance | | -| array_flow.rb:1312:16:1312:28 | call to source | array_flow.rb:1312:5:1312:5 | a [element 2] | provenance | | -| array_flow.rb:1312:34:1312:46 | call to source | array_flow.rb:1312:5:1312:5 | a [element 4] | provenance | | +| array_flow.rb:1312:9:1312:47 | call to [] [element 2] | array_flow.rb:1312:5:1312:5 | a [element 2] | provenance | | +| array_flow.rb:1312:9:1312:47 | call to [] [element 4] | array_flow.rb:1312:5:1312:5 | a [element 4] | provenance | | +| array_flow.rb:1312:16:1312:28 | call to source | array_flow.rb:1312:9:1312:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1312:34:1312:46 | call to source | array_flow.rb:1312:9:1312:47 | call to [] [element 4] | provenance | | | array_flow.rb:1313:5:1313:5 | b [element] | array_flow.rb:1314:10:1314:10 | b [element] | provenance | | | array_flow.rb:1313:5:1313:5 | b [element] | array_flow.rb:1315:10:1315:10 | b [element] | provenance | | | array_flow.rb:1313:5:1313:5 | b [element] | array_flow.rb:1316:10:1316:10 | b [element] | provenance | | @@ -1650,8 +1817,10 @@ edges | array_flow.rb:1319:10:1319:10 | a [element] | array_flow.rb:1319:10:1319:13 | ...[...] | provenance | | | array_flow.rb:1321:5:1321:5 | a [element 2] | array_flow.rb:1322:9:1322:9 | a [element 2] | provenance | | | array_flow.rb:1321:5:1321:5 | a [element 4] | array_flow.rb:1322:9:1322:9 | a [element 4] | provenance | | -| array_flow.rb:1321:16:1321:28 | call to source | array_flow.rb:1321:5:1321:5 | a [element 2] | provenance | | -| array_flow.rb:1321:34:1321:46 | call to source | array_flow.rb:1321:5:1321:5 | a [element 4] | provenance | | +| array_flow.rb:1321:9:1321:47 | call to [] [element 2] | array_flow.rb:1321:5:1321:5 | a [element 2] | provenance | | +| array_flow.rb:1321:9:1321:47 | call to [] [element 4] | array_flow.rb:1321:5:1321:5 | a [element 4] | provenance | | +| array_flow.rb:1321:16:1321:28 | call to source | array_flow.rb:1321:9:1321:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1321:34:1321:46 | call to source | array_flow.rb:1321:9:1321:47 | call to [] [element 4] | provenance | | | array_flow.rb:1322:5:1322:5 | b [element] | array_flow.rb:1323:10:1323:10 | b [element] | provenance | | | array_flow.rb:1322:5:1322:5 | b [element] | array_flow.rb:1324:10:1324:10 | b [element] | provenance | | | array_flow.rb:1322:5:1322:5 | b [element] | array_flow.rb:1325:10:1325:10 | b [element] | provenance | | @@ -1671,8 +1840,10 @@ edges | array_flow.rb:1328:10:1328:10 | a [element] | array_flow.rb:1328:10:1328:13 | ...[...] | provenance | | | array_flow.rb:1330:5:1330:5 | a [element 2] | array_flow.rb:1331:9:1331:9 | a [element 2] | provenance | | | array_flow.rb:1330:5:1330:5 | a [element 4] | array_flow.rb:1331:9:1331:9 | a [element 4] | provenance | | -| array_flow.rb:1330:16:1330:28 | call to source | array_flow.rb:1330:5:1330:5 | a [element 2] | provenance | | -| array_flow.rb:1330:34:1330:46 | call to source | array_flow.rb:1330:5:1330:5 | a [element 4] | provenance | | +| array_flow.rb:1330:9:1330:47 | call to [] [element 2] | array_flow.rb:1330:5:1330:5 | a [element 2] | provenance | | +| array_flow.rb:1330:9:1330:47 | call to [] [element 4] | array_flow.rb:1330:5:1330:5 | a [element 4] | provenance | | +| array_flow.rb:1330:16:1330:28 | call to source | array_flow.rb:1330:9:1330:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1330:34:1330:46 | call to source | array_flow.rb:1330:9:1330:47 | call to [] [element 4] | provenance | | | array_flow.rb:1331:5:1331:5 | b [element] | array_flow.rb:1332:10:1332:10 | b [element] | provenance | | | array_flow.rb:1331:5:1331:5 | b [element] | array_flow.rb:1333:10:1333:10 | b [element] | provenance | | | array_flow.rb:1331:5:1331:5 | b [element] | array_flow.rb:1334:10:1334:10 | b [element] | provenance | | @@ -1692,8 +1863,10 @@ edges | array_flow.rb:1337:10:1337:10 | a [element] | array_flow.rb:1337:10:1337:13 | ...[...] | provenance | | | array_flow.rb:1339:5:1339:5 | a [element 2] | array_flow.rb:1340:9:1340:9 | a [element 2] | provenance | | | array_flow.rb:1339:5:1339:5 | a [element 4] | array_flow.rb:1340:9:1340:9 | a [element 4] | provenance | | -| array_flow.rb:1339:16:1339:28 | call to source | array_flow.rb:1339:5:1339:5 | a [element 2] | provenance | | -| array_flow.rb:1339:34:1339:46 | call to source | array_flow.rb:1339:5:1339:5 | a [element 4] | provenance | | +| array_flow.rb:1339:9:1339:47 | call to [] [element 2] | array_flow.rb:1339:5:1339:5 | a [element 2] | provenance | | +| array_flow.rb:1339:9:1339:47 | call to [] [element 4] | array_flow.rb:1339:5:1339:5 | a [element 4] | provenance | | +| array_flow.rb:1339:16:1339:28 | call to source | array_flow.rb:1339:9:1339:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1339:34:1339:46 | call to source | array_flow.rb:1339:9:1339:47 | call to [] [element 4] | provenance | | | array_flow.rb:1340:5:1340:5 | b [element 2] | array_flow.rb:1343:10:1343:10 | b [element 2] | provenance | | | array_flow.rb:1340:9:1340:9 | [post] a [element 1] | array_flow.rb:1345:10:1345:10 | a [element 1] | provenance | | | array_flow.rb:1340:9:1340:9 | a [element 2] | array_flow.rb:1340:9:1340:21 | call to slice! [element 2] | provenance | | @@ -1703,8 +1876,10 @@ edges | array_flow.rb:1345:10:1345:10 | a [element 1] | array_flow.rb:1345:10:1345:13 | ...[...] | provenance | | | array_flow.rb:1348:5:1348:5 | a [element 2] | array_flow.rb:1349:9:1349:9 | a [element 2] | provenance | | | array_flow.rb:1348:5:1348:5 | a [element 4] | array_flow.rb:1349:9:1349:9 | a [element 4] | provenance | | -| array_flow.rb:1348:16:1348:28 | call to source | array_flow.rb:1348:5:1348:5 | a [element 2] | provenance | | -| array_flow.rb:1348:34:1348:46 | call to source | array_flow.rb:1348:5:1348:5 | a [element 4] | provenance | | +| array_flow.rb:1348:9:1348:47 | call to [] [element 2] | array_flow.rb:1348:5:1348:5 | a [element 2] | provenance | | +| array_flow.rb:1348:9:1348:47 | call to [] [element 4] | array_flow.rb:1348:5:1348:5 | a [element 4] | provenance | | +| array_flow.rb:1348:16:1348:28 | call to source | array_flow.rb:1348:9:1348:47 | call to [] [element 2] | provenance | | +| array_flow.rb:1348:34:1348:46 | call to source | array_flow.rb:1348:9:1348:47 | call to [] [element 4] | provenance | | | array_flow.rb:1349:5:1349:5 | b [element] | array_flow.rb:1350:10:1350:10 | b [element] | provenance | | | array_flow.rb:1349:5:1349:5 | b [element] | array_flow.rb:1351:10:1351:10 | b [element] | provenance | | | array_flow.rb:1349:5:1349:5 | b [element] | array_flow.rb:1352:10:1352:10 | b [element] | provenance | | @@ -1723,22 +1898,26 @@ edges | array_flow.rb:1354:10:1354:10 | a [element] | array_flow.rb:1354:10:1354:13 | ...[...] | provenance | | | array_flow.rb:1355:10:1355:10 | a [element] | array_flow.rb:1355:10:1355:13 | ...[...] | provenance | | | array_flow.rb:1359:5:1359:5 | a [element 2] | array_flow.rb:1360:9:1360:9 | a [element 2] | provenance | | -| array_flow.rb:1359:16:1359:26 | call to source | array_flow.rb:1359:5:1359:5 | a [element 2] | provenance | | +| array_flow.rb:1359:9:1359:27 | call to [] [element 2] | array_flow.rb:1359:5:1359:5 | a [element 2] | provenance | | +| array_flow.rb:1359:16:1359:26 | call to source | array_flow.rb:1359:9:1359:27 | call to [] [element 2] | provenance | | | array_flow.rb:1360:9:1360:9 | a [element 2] | array_flow.rb:1360:27:1360:27 | x | provenance | | | array_flow.rb:1360:27:1360:27 | x | array_flow.rb:1361:14:1361:14 | x | provenance | | | array_flow.rb:1367:5:1367:5 | a [element 2] | array_flow.rb:1368:9:1368:9 | a [element 2] | provenance | | -| array_flow.rb:1367:16:1367:26 | call to source | array_flow.rb:1367:5:1367:5 | a [element 2] | provenance | | +| array_flow.rb:1367:9:1367:27 | call to [] [element 2] | array_flow.rb:1367:5:1367:5 | a [element 2] | provenance | | +| array_flow.rb:1367:16:1367:26 | call to source | array_flow.rb:1367:9:1367:27 | call to [] [element 2] | provenance | | | array_flow.rb:1368:9:1368:9 | a [element 2] | array_flow.rb:1368:28:1368:28 | x | provenance | | | array_flow.rb:1368:28:1368:28 | x | array_flow.rb:1369:14:1369:14 | x | provenance | | | array_flow.rb:1375:5:1375:5 | a [element 2] | array_flow.rb:1376:9:1376:9 | a [element 2] | provenance | | -| array_flow.rb:1375:16:1375:26 | call to source | array_flow.rb:1375:5:1375:5 | a [element 2] | provenance | | +| array_flow.rb:1375:9:1375:27 | call to [] [element 2] | array_flow.rb:1375:5:1375:5 | a [element 2] | provenance | | +| array_flow.rb:1375:16:1375:26 | call to source | array_flow.rb:1375:9:1375:27 | call to [] [element 2] | provenance | | | array_flow.rb:1376:9:1376:9 | a [element 2] | array_flow.rb:1376:26:1376:26 | x | provenance | | | array_flow.rb:1376:9:1376:9 | a [element 2] | array_flow.rb:1376:29:1376:29 | y | provenance | | | array_flow.rb:1376:26:1376:26 | x | array_flow.rb:1377:14:1377:14 | x | provenance | | | array_flow.rb:1376:29:1376:29 | y | array_flow.rb:1378:14:1378:14 | y | provenance | | | array_flow.rb:1383:5:1383:5 | a [element 2] | array_flow.rb:1384:9:1384:9 | a [element 2] | provenance | | | array_flow.rb:1383:5:1383:5 | a [element 2] | array_flow.rb:1387:9:1387:9 | a [element 2] | provenance | | -| array_flow.rb:1383:16:1383:26 | call to source | array_flow.rb:1383:5:1383:5 | a [element 2] | provenance | | +| array_flow.rb:1383:9:1383:27 | call to [] [element 2] | array_flow.rb:1383:5:1383:5 | a [element 2] | provenance | | +| array_flow.rb:1383:16:1383:26 | call to source | array_flow.rb:1383:9:1383:27 | call to [] [element 2] | provenance | | | array_flow.rb:1384:5:1384:5 | b [element] | array_flow.rb:1385:10:1385:10 | b [element] | provenance | | | array_flow.rb:1384:5:1384:5 | b [element] | array_flow.rb:1386:10:1386:10 | b [element] | provenance | | | array_flow.rb:1384:9:1384:9 | a [element 2] | array_flow.rb:1384:9:1384:14 | call to sort [element] | provenance | | @@ -1756,7 +1935,8 @@ edges | array_flow.rb:1392:10:1392:10 | c [element] | array_flow.rb:1392:10:1392:13 | ...[...] | provenance | | | array_flow.rb:1393:10:1393:10 | c [element] | array_flow.rb:1393:10:1393:13 | ...[...] | provenance | | | array_flow.rb:1397:5:1397:5 | a [element 2] | array_flow.rb:1398:9:1398:9 | a [element 2] | provenance | | -| array_flow.rb:1397:16:1397:26 | call to source | array_flow.rb:1397:5:1397:5 | a [element 2] | provenance | | +| array_flow.rb:1397:9:1397:27 | call to [] [element 2] | array_flow.rb:1397:5:1397:5 | a [element 2] | provenance | | +| array_flow.rb:1397:16:1397:26 | call to source | array_flow.rb:1397:9:1397:27 | call to [] [element 2] | provenance | | | array_flow.rb:1398:5:1398:5 | b [element] | array_flow.rb:1399:10:1399:10 | b [element] | provenance | | | array_flow.rb:1398:5:1398:5 | b [element] | array_flow.rb:1400:10:1400:10 | b [element] | provenance | | | array_flow.rb:1398:9:1398:9 | [post] a [element] | array_flow.rb:1401:10:1401:10 | a [element] | provenance | | @@ -1769,7 +1949,8 @@ edges | array_flow.rb:1401:10:1401:10 | a [element] | array_flow.rb:1401:10:1401:13 | ...[...] | provenance | | | array_flow.rb:1402:10:1402:10 | a [element] | array_flow.rb:1402:10:1402:13 | ...[...] | provenance | | | array_flow.rb:1404:5:1404:5 | a [element 2] | array_flow.rb:1405:9:1405:9 | a [element 2] | provenance | | -| array_flow.rb:1404:16:1404:26 | call to source | array_flow.rb:1404:5:1404:5 | a [element 2] | provenance | | +| array_flow.rb:1404:9:1404:27 | call to [] [element 2] | array_flow.rb:1404:5:1404:5 | a [element 2] | provenance | | +| array_flow.rb:1404:16:1404:26 | call to source | array_flow.rb:1404:9:1404:27 | call to [] [element 2] | provenance | | | array_flow.rb:1405:5:1405:5 | b [element] | array_flow.rb:1410:10:1410:10 | b [element] | provenance | | | array_flow.rb:1405:5:1405:5 | b [element] | array_flow.rb:1411:10:1411:10 | b [element] | provenance | | | array_flow.rb:1405:9:1405:9 | [post] a [element] | array_flow.rb:1412:10:1412:10 | a [element] | provenance | | @@ -1786,7 +1967,8 @@ edges | array_flow.rb:1412:10:1412:10 | a [element] | array_flow.rb:1412:10:1412:13 | ...[...] | provenance | | | array_flow.rb:1413:10:1413:10 | a [element] | array_flow.rb:1413:10:1413:13 | ...[...] | provenance | | | array_flow.rb:1417:5:1417:5 | a [element 2] | array_flow.rb:1418:9:1418:9 | a [element 2] | provenance | | -| array_flow.rb:1417:16:1417:26 | call to source | array_flow.rb:1417:5:1417:5 | a [element 2] | provenance | | +| array_flow.rb:1417:9:1417:27 | call to [] [element 2] | array_flow.rb:1417:5:1417:5 | a [element 2] | provenance | | +| array_flow.rb:1417:16:1417:26 | call to source | array_flow.rb:1417:9:1417:27 | call to [] [element 2] | provenance | | | array_flow.rb:1418:5:1418:5 | b [element] | array_flow.rb:1422:10:1422:10 | b [element] | provenance | | | array_flow.rb:1418:5:1418:5 | b [element] | array_flow.rb:1423:10:1423:10 | b [element] | provenance | | | array_flow.rb:1418:9:1418:9 | a [element 2] | array_flow.rb:1418:9:1421:7 | call to sort_by [element] | provenance | | @@ -1796,7 +1978,8 @@ edges | array_flow.rb:1422:10:1422:10 | b [element] | array_flow.rb:1422:10:1422:13 | ...[...] | provenance | | | array_flow.rb:1423:10:1423:10 | b [element] | array_flow.rb:1423:10:1423:13 | ...[...] | provenance | | | array_flow.rb:1427:5:1427:5 | a [element 2] | array_flow.rb:1428:9:1428:9 | a [element 2] | provenance | | -| array_flow.rb:1427:16:1427:26 | call to source | array_flow.rb:1427:5:1427:5 | a [element 2] | provenance | | +| array_flow.rb:1427:9:1427:27 | call to [] [element 2] | array_flow.rb:1427:5:1427:5 | a [element 2] | provenance | | +| array_flow.rb:1427:16:1427:26 | call to source | array_flow.rb:1427:9:1427:27 | call to [] [element 2] | provenance | | | array_flow.rb:1428:5:1428:5 | b [element] | array_flow.rb:1434:10:1434:10 | b [element] | provenance | | | array_flow.rb:1428:5:1428:5 | b [element] | array_flow.rb:1435:10:1435:10 | b [element] | provenance | | | array_flow.rb:1428:9:1428:9 | [post] a [element] | array_flow.rb:1432:10:1432:10 | a [element] | provenance | | @@ -1811,7 +1994,8 @@ edges | array_flow.rb:1434:10:1434:10 | b [element] | array_flow.rb:1434:10:1434:13 | ...[...] | provenance | | | array_flow.rb:1435:10:1435:10 | b [element] | array_flow.rb:1435:10:1435:13 | ...[...] | provenance | | | array_flow.rb:1439:5:1439:5 | a [element 2] | array_flow.rb:1440:9:1440:9 | a [element 2] | provenance | | -| array_flow.rb:1439:16:1439:26 | call to source | array_flow.rb:1439:5:1439:5 | a [element 2] | provenance | | +| array_flow.rb:1439:9:1439:27 | call to [] [element 2] | array_flow.rb:1439:5:1439:5 | a [element 2] | provenance | | +| array_flow.rb:1439:16:1439:26 | call to source | array_flow.rb:1439:9:1439:27 | call to [] [element 2] | provenance | | | array_flow.rb:1440:9:1440:9 | a [element 2] | array_flow.rb:1440:19:1440:19 | x | provenance | | | array_flow.rb:1440:19:1440:19 | x | array_flow.rb:1441:14:1441:14 | x | provenance | | | array_flow.rb:1447:5:1447:5 | a [element 2] | array_flow.rb:1448:9:1448:9 | a [element 2] | provenance | | @@ -1820,8 +2004,10 @@ edges | array_flow.rb:1447:5:1447:5 | a [element 2] | array_flow.rb:1466:9:1466:9 | a [element 2] | provenance | | | array_flow.rb:1447:5:1447:5 | a [element 3] | array_flow.rb:1448:9:1448:9 | a [element 3] | provenance | | | array_flow.rb:1447:5:1447:5 | a [element 3] | array_flow.rb:1459:9:1459:9 | a [element 3] | provenance | | -| array_flow.rb:1447:16:1447:28 | call to source | array_flow.rb:1447:5:1447:5 | a [element 2] | provenance | | -| array_flow.rb:1447:31:1447:43 | call to source | array_flow.rb:1447:5:1447:5 | a [element 3] | provenance | | +| array_flow.rb:1447:9:1447:44 | call to [] [element 2] | array_flow.rb:1447:5:1447:5 | a [element 2] | provenance | | +| array_flow.rb:1447:9:1447:44 | call to [] [element 3] | array_flow.rb:1447:5:1447:5 | a [element 3] | provenance | | +| array_flow.rb:1447:16:1447:28 | call to source | array_flow.rb:1447:9:1447:44 | call to [] [element 2] | provenance | | +| array_flow.rb:1447:31:1447:43 | call to source | array_flow.rb:1447:9:1447:44 | call to [] [element 3] | provenance | | | array_flow.rb:1448:5:1448:5 | b [element 2] | array_flow.rb:1451:10:1451:10 | b [element 2] | provenance | | | array_flow.rb:1448:5:1448:5 | b [element 3] | array_flow.rb:1452:10:1452:10 | b [element 3] | provenance | | | array_flow.rb:1448:9:1448:9 | a [element 2] | array_flow.rb:1448:9:1448:17 | call to take [element 2] | provenance | | @@ -1859,7 +2045,8 @@ edges | array_flow.rb:1467:10:1467:10 | b [element 2] | array_flow.rb:1467:10:1467:13 | ...[...] | provenance | | | array_flow.rb:1467:10:1467:10 | b [element] | array_flow.rb:1467:10:1467:13 | ...[...] | provenance | | | array_flow.rb:1471:5:1471:5 | a [element 2] | array_flow.rb:1472:9:1472:9 | a [element 2] | provenance | | -| array_flow.rb:1471:16:1471:26 | call to source | array_flow.rb:1471:5:1471:5 | a [element 2] | provenance | | +| array_flow.rb:1471:9:1471:27 | call to [] [element 2] | array_flow.rb:1471:5:1471:5 | a [element 2] | provenance | | +| array_flow.rb:1471:16:1471:26 | call to source | array_flow.rb:1471:9:1471:27 | call to [] [element 2] | provenance | | | array_flow.rb:1472:5:1472:5 | b [element 2] | array_flow.rb:1478:10:1478:10 | b [element 2] | provenance | | | array_flow.rb:1472:9:1472:9 | a [element 2] | array_flow.rb:1472:9:1475:7 | call to take_while [element 2] | provenance | | | array_flow.rb:1472:9:1472:9 | a [element 2] | array_flow.rb:1472:26:1472:26 | x | provenance | | @@ -1867,13 +2054,15 @@ edges | array_flow.rb:1472:26:1472:26 | x | array_flow.rb:1473:14:1473:14 | x | provenance | | | array_flow.rb:1478:10:1478:10 | b [element 2] | array_flow.rb:1478:10:1478:13 | ...[...] | provenance | | | array_flow.rb:1484:5:1484:5 | a [element 3] | array_flow.rb:1485:9:1485:9 | a [element 3] | provenance | | -| array_flow.rb:1484:19:1484:29 | call to source | array_flow.rb:1484:5:1484:5 | a [element 3] | provenance | | +| array_flow.rb:1484:9:1484:30 | call to [] [element 3] | array_flow.rb:1484:5:1484:5 | a [element 3] | provenance | | +| array_flow.rb:1484:19:1484:29 | call to source | array_flow.rb:1484:9:1484:30 | call to [] [element 3] | provenance | | | array_flow.rb:1485:5:1485:5 | b [element 3] | array_flow.rb:1486:10:1486:10 | b [element 3] | provenance | | | array_flow.rb:1485:9:1485:9 | a [element 3] | array_flow.rb:1485:9:1485:14 | call to to_a [element 3] | provenance | | | array_flow.rb:1485:9:1485:14 | call to to_a [element 3] | array_flow.rb:1485:5:1485:5 | b [element 3] | provenance | | | array_flow.rb:1486:10:1486:10 | b [element 3] | array_flow.rb:1486:10:1486:13 | ...[...] | provenance | | | array_flow.rb:1490:5:1490:5 | a [element 2] | array_flow.rb:1491:9:1491:9 | a [element 2] | provenance | | -| array_flow.rb:1490:16:1490:26 | call to source | array_flow.rb:1490:5:1490:5 | a [element 2] | provenance | | +| array_flow.rb:1490:9:1490:27 | call to [] [element 2] | array_flow.rb:1490:5:1490:5 | a [element 2] | provenance | | +| array_flow.rb:1490:16:1490:26 | call to source | array_flow.rb:1490:9:1490:27 | call to [] [element 2] | provenance | | | array_flow.rb:1491:5:1491:5 | b [element 2] | array_flow.rb:1494:10:1494:10 | b [element 2] | provenance | | | array_flow.rb:1491:9:1491:9 | a [element 2] | array_flow.rb:1491:9:1491:16 | call to to_ary [element 2] | provenance | | | array_flow.rb:1491:9:1491:16 | call to to_ary [element 2] | array_flow.rb:1491:5:1491:5 | b [element 2] | provenance | | @@ -1881,9 +2070,15 @@ edges | array_flow.rb:1507:5:1507:5 | a [element 0, element 1] | array_flow.rb:1508:9:1508:9 | a [element 0, element 1] | provenance | | | array_flow.rb:1507:5:1507:5 | a [element 1, element 1] | array_flow.rb:1508:9:1508:9 | a [element 1, element 1] | provenance | | | array_flow.rb:1507:5:1507:5 | a [element 2, element 1] | array_flow.rb:1508:9:1508:9 | a [element 2, element 1] | provenance | | -| array_flow.rb:1507:14:1507:26 | call to source | array_flow.rb:1507:5:1507:5 | a [element 0, element 1] | provenance | | -| array_flow.rb:1507:34:1507:46 | call to source | array_flow.rb:1507:5:1507:5 | a [element 1, element 1] | provenance | | -| array_flow.rb:1507:54:1507:66 | call to source | array_flow.rb:1507:5:1507:5 | a [element 2, element 1] | provenance | | +| array_flow.rb:1507:9:1507:68 | call to [] [element 0, element 1] | array_flow.rb:1507:5:1507:5 | a [element 0, element 1] | provenance | | +| array_flow.rb:1507:9:1507:68 | call to [] [element 1, element 1] | array_flow.rb:1507:5:1507:5 | a [element 1, element 1] | provenance | | +| array_flow.rb:1507:9:1507:68 | call to [] [element 2, element 1] | array_flow.rb:1507:5:1507:5 | a [element 2, element 1] | provenance | | +| array_flow.rb:1507:10:1507:27 | call to [] [element 1] | array_flow.rb:1507:9:1507:68 | call to [] [element 0, element 1] | provenance | | +| array_flow.rb:1507:14:1507:26 | call to source | array_flow.rb:1507:10:1507:27 | call to [] [element 1] | provenance | | +| array_flow.rb:1507:30:1507:47 | call to [] [element 1] | array_flow.rb:1507:9:1507:68 | call to [] [element 1, element 1] | provenance | | +| array_flow.rb:1507:34:1507:46 | call to source | array_flow.rb:1507:30:1507:47 | call to [] [element 1] | provenance | | +| array_flow.rb:1507:50:1507:67 | call to [] [element 1] | array_flow.rb:1507:9:1507:68 | call to [] [element 2, element 1] | provenance | | +| array_flow.rb:1507:54:1507:66 | call to source | array_flow.rb:1507:50:1507:67 | call to [] [element 1] | provenance | | | array_flow.rb:1508:5:1508:5 | b [element 1, element 0] | array_flow.rb:1512:10:1512:10 | b [element 1, element 0] | provenance | | | array_flow.rb:1508:5:1508:5 | b [element 1, element 1] | array_flow.rb:1513:10:1513:10 | b [element 1, element 1] | provenance | | | array_flow.rb:1508:5:1508:5 | b [element 1, element 2] | array_flow.rb:1514:10:1514:10 | b [element 1, element 2] | provenance | | @@ -1900,11 +2095,14 @@ edges | array_flow.rb:1514:10:1514:10 | b [element 1, element 2] | array_flow.rb:1514:10:1514:13 | ...[...] [element 2] | provenance | | | array_flow.rb:1514:10:1514:13 | ...[...] [element 2] | array_flow.rb:1514:10:1514:16 | ...[...] | provenance | | | array_flow.rb:1518:5:1518:5 | a [element 2] | array_flow.rb:1521:9:1521:9 | a [element 2] | provenance | | -| array_flow.rb:1518:16:1518:28 | call to source | array_flow.rb:1518:5:1518:5 | a [element 2] | provenance | | +| array_flow.rb:1518:9:1518:29 | call to [] [element 2] | array_flow.rb:1518:5:1518:5 | a [element 2] | provenance | | +| array_flow.rb:1518:16:1518:28 | call to source | array_flow.rb:1518:9:1518:29 | call to [] [element 2] | provenance | | | array_flow.rb:1519:5:1519:5 | b [element 1] | array_flow.rb:1521:17:1521:17 | b [element 1] | provenance | | -| array_flow.rb:1519:13:1519:25 | call to source | array_flow.rb:1519:5:1519:5 | b [element 1] | provenance | | +| array_flow.rb:1519:9:1519:26 | call to [] [element 1] | array_flow.rb:1519:5:1519:5 | b [element 1] | provenance | | +| array_flow.rb:1519:13:1519:25 | call to source | array_flow.rb:1519:9:1519:26 | call to [] [element 1] | provenance | | | array_flow.rb:1520:5:1520:5 | c [element 1] | array_flow.rb:1521:20:1521:20 | c [element 1] | provenance | | -| array_flow.rb:1520:13:1520:25 | call to source | array_flow.rb:1520:5:1520:5 | c [element 1] | provenance | | +| array_flow.rb:1520:9:1520:26 | call to [] [element 1] | array_flow.rb:1520:5:1520:5 | c [element 1] | provenance | | +| array_flow.rb:1520:13:1520:25 | call to source | array_flow.rb:1520:9:1520:26 | call to [] [element 1] | provenance | | | array_flow.rb:1521:5:1521:5 | d [element] | array_flow.rb:1522:10:1522:10 | d [element] | provenance | | | array_flow.rb:1521:5:1521:5 | d [element] | array_flow.rb:1523:10:1523:10 | d [element] | provenance | | | array_flow.rb:1521:5:1521:5 | d [element] | array_flow.rb:1524:10:1524:10 | d [element] | provenance | | @@ -1919,8 +2117,10 @@ edges | array_flow.rb:1528:5:1528:5 | a [element 3] | array_flow.rb:1534:9:1534:9 | a [element 3] | provenance | | | array_flow.rb:1528:5:1528:5 | a [element 4] | array_flow.rb:1530:9:1530:9 | a [element 4] | provenance | | | array_flow.rb:1528:5:1528:5 | a [element 4] | array_flow.rb:1534:9:1534:9 | a [element 4] | provenance | | -| array_flow.rb:1528:19:1528:31 | call to source | array_flow.rb:1528:5:1528:5 | a [element 3] | provenance | | -| array_flow.rb:1528:34:1528:46 | call to source | array_flow.rb:1528:5:1528:5 | a [element 4] | provenance | | +| array_flow.rb:1528:9:1528:47 | call to [] [element 3] | array_flow.rb:1528:5:1528:5 | a [element 3] | provenance | | +| array_flow.rb:1528:9:1528:47 | call to [] [element 4] | array_flow.rb:1528:5:1528:5 | a [element 4] | provenance | | +| array_flow.rb:1528:19:1528:31 | call to source | array_flow.rb:1528:9:1528:47 | call to [] [element 3] | provenance | | +| array_flow.rb:1528:34:1528:46 | call to source | array_flow.rb:1528:9:1528:47 | call to [] [element 4] | provenance | | | array_flow.rb:1530:5:1530:5 | b [element] | array_flow.rb:1531:10:1531:10 | b [element] | provenance | | | array_flow.rb:1530:5:1530:5 | b [element] | array_flow.rb:1532:10:1532:10 | b [element] | provenance | | | array_flow.rb:1530:9:1530:9 | a [element 3] | array_flow.rb:1530:9:1530:14 | call to uniq [element] | provenance | | @@ -1938,8 +2138,10 @@ edges | array_flow.rb:1538:10:1538:10 | c [element] | array_flow.rb:1538:10:1538:13 | ...[...] | provenance | | | array_flow.rb:1542:5:1542:5 | a [element 2] | array_flow.rb:1543:9:1543:9 | a [element 2] | provenance | | | array_flow.rb:1542:5:1542:5 | a [element 3] | array_flow.rb:1543:9:1543:9 | a [element 3] | provenance | | -| array_flow.rb:1542:16:1542:28 | call to source | array_flow.rb:1542:5:1542:5 | a [element 2] | provenance | | -| array_flow.rb:1542:31:1542:43 | call to source | array_flow.rb:1542:5:1542:5 | a [element 3] | provenance | | +| array_flow.rb:1542:9:1542:44 | call to [] [element 2] | array_flow.rb:1542:5:1542:5 | a [element 2] | provenance | | +| array_flow.rb:1542:9:1542:44 | call to [] [element 3] | array_flow.rb:1542:5:1542:5 | a [element 3] | provenance | | +| array_flow.rb:1542:16:1542:28 | call to source | array_flow.rb:1542:9:1542:44 | call to [] [element 2] | provenance | | +| array_flow.rb:1542:31:1542:43 | call to source | array_flow.rb:1542:9:1542:44 | call to [] [element 3] | provenance | | | array_flow.rb:1543:5:1543:5 | b [element] | array_flow.rb:1544:10:1544:10 | b [element] | provenance | | | array_flow.rb:1543:5:1543:5 | b [element] | array_flow.rb:1545:10:1545:10 | b [element] | provenance | | | array_flow.rb:1543:9:1543:9 | [post] a [element] | array_flow.rb:1546:10:1546:10 | a [element] | provenance | | @@ -1955,8 +2157,10 @@ edges | array_flow.rb:1547:10:1547:10 | a [element] | array_flow.rb:1547:10:1547:13 | ...[...] | provenance | | | array_flow.rb:1549:5:1549:5 | a [element 2] | array_flow.rb:1550:9:1550:9 | a [element 2] | provenance | | | array_flow.rb:1549:5:1549:5 | a [element 3] | array_flow.rb:1550:9:1550:9 | a [element 3] | provenance | | -| array_flow.rb:1549:16:1549:28 | call to source | array_flow.rb:1549:5:1549:5 | a [element 2] | provenance | | -| array_flow.rb:1549:31:1549:43 | call to source | array_flow.rb:1549:5:1549:5 | a [element 3] | provenance | | +| array_flow.rb:1549:9:1549:44 | call to [] [element 2] | array_flow.rb:1549:5:1549:5 | a [element 2] | provenance | | +| array_flow.rb:1549:9:1549:44 | call to [] [element 3] | array_flow.rb:1549:5:1549:5 | a [element 3] | provenance | | +| array_flow.rb:1549:16:1549:28 | call to source | array_flow.rb:1549:9:1549:44 | call to [] [element 2] | provenance | | +| array_flow.rb:1549:31:1549:43 | call to source | array_flow.rb:1549:9:1549:44 | call to [] [element 3] | provenance | | | array_flow.rb:1550:5:1550:5 | b [element] | array_flow.rb:1554:10:1554:10 | b [element] | provenance | | | array_flow.rb:1550:5:1550:5 | b [element] | array_flow.rb:1555:10:1555:10 | b [element] | provenance | | | array_flow.rb:1550:9:1550:9 | [post] a [element] | array_flow.rb:1556:10:1556:10 | a [element] | provenance | | @@ -1974,7 +2178,8 @@ edges | array_flow.rb:1556:10:1556:10 | a [element] | array_flow.rb:1556:10:1556:13 | ...[...] | provenance | | | array_flow.rb:1557:10:1557:10 | a [element] | array_flow.rb:1557:10:1557:13 | ...[...] | provenance | | | array_flow.rb:1561:5:1561:5 | a [element 2] | array_flow.rb:1562:5:1562:5 | a [element 2] | provenance | | -| array_flow.rb:1561:16:1561:28 | call to source | array_flow.rb:1561:5:1561:5 | a [element 2] | provenance | | +| array_flow.rb:1561:9:1561:29 | call to [] [element 2] | array_flow.rb:1561:5:1561:5 | a [element 2] | provenance | | +| array_flow.rb:1561:16:1561:28 | call to source | array_flow.rb:1561:9:1561:29 | call to [] [element 2] | provenance | | | array_flow.rb:1562:5:1562:5 | [post] a [element 2] | array_flow.rb:1565:10:1565:10 | a [element 2] | provenance | | | array_flow.rb:1562:5:1562:5 | [post] a [element 5] | array_flow.rb:1568:10:1568:10 | a [element 5] | provenance | | | array_flow.rb:1562:5:1562:5 | a [element 2] | array_flow.rb:1562:5:1562:5 | [post] a [element 5] | provenance | | @@ -1988,8 +2193,10 @@ edges | array_flow.rb:1572:5:1572:5 | a [element 3] | array_flow.rb:1580:9:1580:9 | a [element 3] | provenance | | | array_flow.rb:1572:5:1572:5 | a [element 3] | array_flow.rb:1584:9:1584:9 | a [element 3] | provenance | | | array_flow.rb:1572:5:1572:5 | a [element 3] | array_flow.rb:1588:9:1588:9 | a [element 3] | provenance | | -| array_flow.rb:1572:13:1572:25 | call to source | array_flow.rb:1572:5:1572:5 | a [element 1] | provenance | | -| array_flow.rb:1572:31:1572:43 | call to source | array_flow.rb:1572:5:1572:5 | a [element 3] | provenance | | +| array_flow.rb:1572:9:1572:44 | call to [] [element 1] | array_flow.rb:1572:5:1572:5 | a [element 1] | provenance | | +| array_flow.rb:1572:9:1572:44 | call to [] [element 3] | array_flow.rb:1572:5:1572:5 | a [element 3] | provenance | | +| array_flow.rb:1572:13:1572:25 | call to source | array_flow.rb:1572:9:1572:44 | call to [] [element 1] | provenance | | +| array_flow.rb:1572:31:1572:43 | call to source | array_flow.rb:1572:9:1572:44 | call to [] [element 3] | provenance | | | array_flow.rb:1574:5:1574:5 | b [element 1] | array_flow.rb:1576:10:1576:10 | b [element 1] | provenance | | | array_flow.rb:1574:5:1574:5 | b [element 3] | array_flow.rb:1578:10:1578:10 | b [element 3] | provenance | | | array_flow.rb:1574:9:1574:9 | a [element 1] | array_flow.rb:1574:9:1574:31 | call to values_at [element 1] | provenance | | @@ -2029,13 +2236,16 @@ edges | array_flow.rb:1592:10:1592:10 | b [element] | array_flow.rb:1592:10:1592:13 | ...[...] | provenance | | | array_flow.rb:1596:5:1596:5 | a [element 2] | array_flow.rb:1599:9:1599:9 | a [element 2] | provenance | | | array_flow.rb:1596:5:1596:5 | a [element 2] | array_flow.rb:1604:5:1604:5 | a [element 2] | provenance | | -| array_flow.rb:1596:16:1596:28 | call to source | array_flow.rb:1596:5:1596:5 | a [element 2] | provenance | | +| array_flow.rb:1596:9:1596:29 | call to [] [element 2] | array_flow.rb:1596:5:1596:5 | a [element 2] | provenance | | +| array_flow.rb:1596:16:1596:28 | call to source | array_flow.rb:1596:9:1596:29 | call to [] [element 2] | provenance | | | array_flow.rb:1597:5:1597:5 | b [element 1] | array_flow.rb:1599:15:1599:15 | b [element 1] | provenance | | | array_flow.rb:1597:5:1597:5 | b [element 1] | array_flow.rb:1604:11:1604:11 | b [element 1] | provenance | | -| array_flow.rb:1597:13:1597:25 | call to source | array_flow.rb:1597:5:1597:5 | b [element 1] | provenance | | +| array_flow.rb:1597:9:1597:29 | call to [] [element 1] | array_flow.rb:1597:5:1597:5 | b [element 1] | provenance | | +| array_flow.rb:1597:13:1597:25 | call to source | array_flow.rb:1597:9:1597:29 | call to [] [element 1] | provenance | | | array_flow.rb:1598:5:1598:5 | c [element 0] | array_flow.rb:1599:18:1599:18 | c [element 0] | provenance | | | array_flow.rb:1598:5:1598:5 | c [element 0] | array_flow.rb:1604:14:1604:14 | c [element 0] | provenance | | -| array_flow.rb:1598:10:1598:22 | call to source | array_flow.rb:1598:5:1598:5 | c [element 0] | provenance | | +| array_flow.rb:1598:9:1598:29 | call to [] [element 0] | array_flow.rb:1598:5:1598:5 | c [element 0] | provenance | | +| array_flow.rb:1598:10:1598:22 | call to source | array_flow.rb:1598:9:1598:29 | call to [] [element 0] | provenance | | | array_flow.rb:1599:5:1599:5 | d [element 0, element 2] | array_flow.rb:1601:10:1601:10 | d [element 0, element 2] | provenance | | | array_flow.rb:1599:5:1599:5 | d [element 1, element 1] | array_flow.rb:1602:10:1602:10 | d [element 1, element 1] | provenance | | | array_flow.rb:1599:5:1599:5 | d [element 2, element 0] | array_flow.rb:1603:10:1603:10 | d [element 2, element 0] | provenance | | @@ -2061,9 +2271,11 @@ edges | array_flow.rb:1606:14:1606:14 | x [element 1] | array_flow.rb:1606:14:1606:17 | ...[...] | provenance | | | array_flow.rb:1607:14:1607:14 | x [element 2] | array_flow.rb:1607:14:1607:17 | ...[...] | provenance | | | array_flow.rb:1612:5:1612:5 | a [element 2] | array_flow.rb:1614:9:1614:9 | a [element 2] | provenance | | -| array_flow.rb:1612:16:1612:28 | call to source | array_flow.rb:1612:5:1612:5 | a [element 2] | provenance | | +| array_flow.rb:1612:9:1612:29 | call to [] [element 2] | array_flow.rb:1612:5:1612:5 | a [element 2] | provenance | | +| array_flow.rb:1612:16:1612:28 | call to source | array_flow.rb:1612:9:1612:29 | call to [] [element 2] | provenance | | | array_flow.rb:1613:5:1613:5 | b [element 1] | array_flow.rb:1614:13:1614:13 | b [element 1] | provenance | | -| array_flow.rb:1613:13:1613:25 | call to source | array_flow.rb:1613:5:1613:5 | b [element 1] | provenance | | +| array_flow.rb:1613:9:1613:26 | call to [] [element 1] | array_flow.rb:1613:5:1613:5 | b [element 1] | provenance | | +| array_flow.rb:1613:13:1613:25 | call to source | array_flow.rb:1613:9:1613:26 | call to [] [element 1] | provenance | | | array_flow.rb:1614:5:1614:5 | c [element] | array_flow.rb:1615:10:1615:10 | c [element] | provenance | | | array_flow.rb:1614:5:1614:5 | c [element] | array_flow.rb:1616:10:1616:10 | c [element] | provenance | | | array_flow.rb:1614:5:1614:5 | c [element] | array_flow.rb:1617:10:1617:10 | c [element] | provenance | | @@ -2120,6 +2332,23 @@ edges | array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1668:14:1668:41 | ...[...] [element 1] | provenance | | | array_flow.rb:1670:14:1670:15 | a2 [element 1] | array_flow.rb:1670:14:1670:18 | ...[...] | provenance | | | array_flow.rb:1672:14:1672:15 | a2 [element 1] | array_flow.rb:1672:14:1672:18 | ...[...] | provenance | | +| array_flow.rb:1677:5:1677:5 | a [element 2] | array_flow.rb:1678:9:1678:9 | a [element 2] | provenance | | +| array_flow.rb:1677:9:1677:29 | call to [] [element 2] | array_flow.rb:1677:5:1677:5 | a [element 2] | provenance | | +| array_flow.rb:1677:16:1677:28 | call to source | array_flow.rb:1677:9:1677:29 | call to [] [element 2] | provenance | | +| array_flow.rb:1678:5:1678:5 | b [element] | array_flow.rb:1681:10:1681:10 | b [element] | provenance | | +| array_flow.rb:1678:9:1678:9 | a [element 2] | array_flow.rb:1678:9:1680:7 | call to map [element] | provenance | | +| array_flow.rb:1678:9:1680:7 | call to map [element] | array_flow.rb:1678:5:1678:5 | b [element] | provenance | | +| array_flow.rb:1681:10:1681:10 | b [element] | array_flow.rb:1681:10:1681:13 | ...[...] | provenance | | +| array_flow.rb:1685:5:1685:5 | a [element 2] | array_flow.rb:1686:18:1686:18 | a [element 2] | provenance | | +| array_flow.rb:1685:5:1685:5 | a [element 3] | array_flow.rb:1686:18:1686:18 | a [element 3] | provenance | | +| array_flow.rb:1685:9:1685:44 | call to [] [element 2] | array_flow.rb:1685:5:1685:5 | a [element 2] | provenance | | +| array_flow.rb:1685:9:1685:44 | call to [] [element 3] | array_flow.rb:1685:5:1685:5 | a [element 3] | provenance | | +| array_flow.rb:1685:16:1685:28 | call to source | array_flow.rb:1685:9:1685:44 | call to [] [element 2] | provenance | | +| array_flow.rb:1685:31:1685:43 | call to source | array_flow.rb:1685:9:1685:44 | call to [] [element 3] | provenance | | +| array_flow.rb:1686:11:1686:11 | z | array_flow.rb:1689:10:1689:10 | z | provenance | | +| array_flow.rb:1686:14:1686:14 | w | array_flow.rb:1690:10:1690:10 | w | provenance | | +| array_flow.rb:1686:18:1686:18 | a [element 2] | array_flow.rb:1686:11:1686:11 | z | provenance | | +| array_flow.rb:1686:18:1686:18 | a [element 3] | array_flow.rb:1686:14:1686:14 | w | provenance | | nodes | 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] | @@ -2129,6 +2358,7 @@ nodes | array_flow.rb:5:10:5:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:9:5:9:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:9:9:9:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:13 | ...[...] | semmle.label | ...[...] | @@ -2156,6 +2386,7 @@ nodes | array_flow.rb:29:10:29:10 | c [element] | semmle.label | c [element] | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:33:5:33:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:33:9:33:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:34:28 | call to try_convert [element 0] | semmle.label | call to try_convert [element 0] | @@ -2163,8 +2394,10 @@ nodes | array_flow.rb:35:10:35:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:40:5:40:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:40:9:40:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:41:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:42:9 | a [element 0] | semmle.label | a [element 0] | @@ -2175,6 +2408,7 @@ nodes | array_flow.rb:44:10:44:10 | c [element] | semmle.label | c [element] | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:48:5:48:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:48:9:48:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:49:9 | a [element 0] | semmle.label | a [element 0] | @@ -2184,8 +2418,10 @@ nodes | array_flow.rb:51:10:51:10 | b [element] | semmle.label | b [element] | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:55:5:55:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:55:9:55:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:56:24 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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] | semmle.label | c [element] | @@ -2199,6 +2435,7 @@ nodes | array_flow.rb:59:10:59:10 | c [element] | semmle.label | c [element] | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:63:5:63:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:63:9:63:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:65:9 | a [element 0] | semmle.label | a [element 0] | @@ -2208,6 +2445,7 @@ nodes | array_flow.rb:67:10:67:10 | c [element] | semmle.label | c [element] | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:71:5:71:5 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:71:9:71:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | | array_flow.rb:71:10:71:20 | call to source | semmle.label | call to source | | 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] | @@ -2227,11 +2465,13 @@ nodes | array_flow.rb:76:10:76:10 | b [element] | semmle.label | b [element] | | array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:80:5:80:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:80:9:80:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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: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:88:5:88:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:88:9:88:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:9:89:9 | a [element 1] | semmle.label | a [element 1] | @@ -2241,6 +2481,7 @@ nodes | array_flow.rb:92:10:92:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:96:5:96:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:96:9:96:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:9:97:9 | a [element 1] | semmle.label | a [element 1] | @@ -2250,6 +2491,7 @@ nodes | array_flow.rb:101:10:101:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:103:5:103:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:103:9:103:39 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:9:104:9 | a [element 1] | semmle.label | a [element 1] | @@ -2258,6 +2500,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:109:9:109:42 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:109:9:109:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:110:5:110:5 | b [element] | semmle.label | b [element] | @@ -2285,6 +2529,7 @@ nodes | 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:129:5:129:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:129:15:129:32 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:13 | ...[...] | semmle.label | ...[...] | @@ -2301,6 +2546,7 @@ nodes | 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:145:5:145:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:145:15:145:32 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:13 | ...[...] | semmle.label | ...[...] | @@ -2309,16 +2555,19 @@ nodes | array_flow.rb:148:10:148:10 | a [element] | semmle.label | a [element] | | array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:152:5:152:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:152:9:152:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:16:153:16 | 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:9:159:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:16:160:16 | 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:9:166:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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] | semmle.label | b [element] | @@ -2339,8 +2588,10 @@ nodes | array_flow.rb:171:10:171:10 | b [element] | semmle.label | b [element] | | array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:177:5:177:5 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:177:9:177:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:9:178:17 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, 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:11:179:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | @@ -2351,12 +2602,14 @@ nodes | array_flow.rb:180:11:180:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | | array_flow.rb:180:11:180:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:184:5:184:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:184:9:184:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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: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: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:9:192:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:193:9 | a [element 2] | semmle.label | a [element 2] | @@ -2365,17 +2618,21 @@ nodes | array_flow.rb:194:14:194:14 | x | semmle.label | x | | array_flow.rb:196:10:196:10 | b | semmle.label | b | | array_flow.rb:200:5:200:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:200:9:200:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:29:201:29 | 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:9:208:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:17:209:17 | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:215:9:215:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:215:9:215:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:216:9:216:9 | a [element 2] | semmle.label | a [element 2] | @@ -2385,6 +2642,7 @@ nodes | array_flow.rb:217:14:217:14 | x | semmle.label | x | | array_flow.rb:218:14:218:14 | y | semmle.label | y | | array_flow.rb:231:5:231:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:231:9:231:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:232:9 | a [element 2] | semmle.label | a [element 2] | @@ -2395,6 +2653,7 @@ nodes | array_flow.rb:236:10:236:10 | b [element] | semmle.label | b [element] | | array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:240:5:240:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:240:9:240:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:241:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -2408,12 +2667,14 @@ nodes | array_flow.rb:246:10:246:10 | b [element] | semmle.label | b [element] | | array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:250:5:250:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:250:9:250:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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: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:30:251:30 | x | semmle.label | x | | array_flow.rb:252:14:252:14 | x | semmle.label | x | +| array_flow.rb:253:9:253:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:13 | ...[...] | semmle.label | ...[...] | @@ -2426,6 +2687,7 @@ nodes | array_flow.rb:260:10:260:10 | b [element] | semmle.label | b [element] | | array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:264:5:264:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:264:9:264:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:265:9 | a [element 2] | semmle.label | a [element 2] | @@ -2436,6 +2698,7 @@ nodes | array_flow.rb:269:10:269:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:273:5:273:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:273:9:273:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:274:9 | a [element 2] | semmle.label | a [element 2] | @@ -2443,6 +2706,7 @@ nodes | array_flow.rb:275:10:275:10 | b [element] | semmle.label | b [element] | | array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:279:5:279:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:279:9:279:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:280:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -2453,8 +2717,10 @@ nodes | array_flow.rb:282:10:282:10 | b [element] | semmle.label | b [element] | | array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:286:5:286:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:286:9:286:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:287:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:14:288:14 | b [element 2] | semmle.label | b [element 2] | @@ -2464,16 +2730,19 @@ nodes | array_flow.rb:290:10:290:10 | a [element] | semmle.label | a [element] | | array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:294:5:294:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:294:9:294:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:17:295:17 | 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:9:301:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:20:302:20 | 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:9:308:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:309:9 | a [element 2] | semmle.label | a [element 2] | @@ -2481,6 +2750,7 @@ nodes | array_flow.rb:312:10:312:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:316:5:316:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:316:9:316:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:317:9 | a [element 2] | semmle.label | a [element 2] | @@ -2489,6 +2759,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:325:9:325:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:325:9:325:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:326:5:326:5 | b | semmle.label | b | @@ -2501,6 +2773,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:330:9:330:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:330:9:330:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:331:5:331:5 | b | semmle.label | b | @@ -2514,6 +2788,7 @@ nodes | array_flow.rb:334:10:334:10 | a [element] | semmle.label | a [element] | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:338:5:338:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:338:9:338:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:339:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -2530,6 +2805,7 @@ nodes | array_flow.rb:345:10:345:10 | a [element] | semmle.label | a [element] | | array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:349:5:349:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:349:9:349:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:350:9 | a [element 2] | semmle.label | a [element 2] | @@ -2538,7 +2814,10 @@ nodes | 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 3, element 1] | semmle.label | a [element 3, element 1] | +| array_flow.rb:355:9:355:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:355:9:355:47 | call to [] [element 3, element 1] | semmle.label | call to [] [element 3, element 1] | | array_flow.rb:355:16:355:27 | call to source | semmle.label | call to source | +| array_flow.rb:355:30:355:46 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:17 | call to dig | semmle.label | call to dig | @@ -2547,6 +2826,7 @@ nodes | array_flow.rb:360:10:360:10 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | | array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | | array_flow.rb:364:5:364:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:364:9:364:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:365:9 | a [element 2] | semmle.label | a [element 2] | @@ -2557,6 +2837,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:372:9:372:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:372:9:372:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:373:5:373:5 | b [element] | semmle.label | b [element] | @@ -2594,6 +2876,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:387:9:387:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:387:9:387:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:388:5:388:5 | b [element] | semmle.label | b [element] | @@ -2605,6 +2889,7 @@ nodes | array_flow.rb:391:10:391:10 | b [element] | semmle.label | b [element] | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:395:5:395:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:395:9:395:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:396:9 | a [element 2] | semmle.label | a [element 2] | @@ -2614,16 +2899,16 @@ nodes | array_flow.rb:399:10:399:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:403:5:403:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:403:9:403:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:406:7 | [post] { ... } [captured x] | semmle.label | [post] { ... } [captured x] | -| array_flow.rb:404:9:406:7 | __synth__0__1 | semmle.label | __synth__0__1 | | 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: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:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:412:5:412:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:412:9:412:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:24:413:24 | x [element] | semmle.label | x [element] | @@ -2631,6 +2916,7 @@ nodes | array_flow.rb:414:15:414:15 | x [element] | semmle.label | x [element] | | array_flow.rb:414:15:414:18 | ...[...] | semmle.label | ...[...] | | array_flow.rb:419:5:419:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:419:9:419:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:420:9 | a [element 2] | semmle.label | a [element 2] | @@ -2640,6 +2926,7 @@ nodes | array_flow.rb:423:10:423:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:427:5:427:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:427:9:427:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:428:9 | a [element 2] | semmle.label | a [element 2] | @@ -2647,12 +2934,14 @@ nodes | array_flow.rb:431:10:431:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:435:5:435:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:435:9:435:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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: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:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:442:5:442:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:442:9:442:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:443:9 | a [element 3] | semmle.label | a [element 3] | @@ -2662,6 +2951,7 @@ nodes | array_flow.rb:447:10:447:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:451:5:451:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:451:9:451:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:452:9 | a [element 3] | semmle.label | a [element 3] | @@ -2673,6 +2963,7 @@ nodes | array_flow.rb:454:14:454:14 | a | semmle.label | a | | array_flow.rb:456:10:456:10 | b | semmle.label | b | | array_flow.rb:460:5:460:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:460:9:460:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:461:9 | a [element 3] | semmle.label | a [element 3] | @@ -2681,6 +2972,8 @@ nodes | 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 4] | semmle.label | a [element 4] | +| array_flow.rb:466:9:466:45 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:466:9:466:45 | call to [] [element 4] | semmle.label | call to [] [element 4] | | 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:467:5:467:5 | b | semmle.label | b | @@ -2711,6 +3004,7 @@ nodes | array_flow.rb:477:20:477:31 | call to source | semmle.label | call to source | | array_flow.rb:478:10:478:10 | b | semmle.label | b | | array_flow.rb:482:5:482:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:482:9:482:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:12:483:23 | call to source | semmle.label | call to source | @@ -2730,6 +3024,7 @@ nodes | array_flow.rb:494:10:494:10 | a [element] | semmle.label | a [element] | | array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:498:5:498:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:498:9:498:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:499:9 | a [element 3] | semmle.label | a [element 3] | @@ -2739,6 +3034,7 @@ nodes | array_flow.rb:502:10:502:10 | b [element] | semmle.label | b [element] | | array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:506:5:506:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:506:9:506:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:507:9 | a [element 3] | semmle.label | a [element 3] | @@ -2753,6 +3049,7 @@ nodes | 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:525:5:525:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:525:9:525:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:526:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -2765,6 +3062,7 @@ nodes | 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:535:5:535:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:535:9:535:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:536:9 | a [element 3] | semmle.label | a [element 3] | @@ -2774,6 +3072,7 @@ nodes | 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:543:5:543:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:543:9:543:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:544:9 | a [element 3] | semmle.label | a [element 3] | @@ -2783,12 +3082,15 @@ nodes | 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:551:5:551:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:551:9:551:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:22:552:22 | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:558:9:558:42 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:558:9:558:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:559:5:559:5 | [post] a [element] | semmle.label | [post] a [element] | @@ -2823,12 +3125,14 @@ nodes | 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:570:5:570:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:570:9:570:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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: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:24:571:24 | x | semmle.label | x | | array_flow.rb:572:14:572:14 | x | semmle.label | x | +| array_flow.rb:573:9:573:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:13 | ...[...] | semmle.label | ...[...] | @@ -2841,6 +3145,8 @@ nodes | 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:584:5:584:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:584:9:584:31 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, element 1] | +| array_flow.rb:584:16:584:30 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:9:585:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | @@ -2848,6 +3154,8 @@ nodes | 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:590:5:590:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:590:9:590:31 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, element 1] | +| array_flow.rb:590:16:590:30 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | @@ -2870,6 +3178,7 @@ nodes | 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:600:5:600:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:600:9:600:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:601:9 | a [element 3] | semmle.label | a [element 3] | @@ -2885,6 +3194,7 @@ nodes | array_flow.rb:607:10:607:10 | b [element] | semmle.label | b [element] | | array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:611:5:611:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:611:9:611:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:612:9 | a [element 3] | semmle.label | a [element 3] | @@ -2900,17 +3210,21 @@ nodes | 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:622:5:622:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:622:9:622:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:24:623:24 | 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:9:631:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:17:632:17 | 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 2] | semmle.label | a [element 2] | +| array_flow.rb:638:9:638:39 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:638:9:638:39 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:639:5:639:5 | b | semmle.label | b | @@ -2932,6 +3246,7 @@ nodes | 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:655:5:655:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:655:9:655:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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 2] | semmle.label | b [element 2] | @@ -2958,6 +3273,7 @@ nodes | 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:669:5:669:5 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:669:9:669:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:670:9 | [post] c [element] | semmle.label | [post] c [element] | @@ -2970,15 +3286,19 @@ nodes | 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:683:5:683:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:683:9:683:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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: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:24:684:43 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:684:31:684:42 | call to source | semmle.label | call to source | +| array_flow.rb:684:46:684:59 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:689:5:689:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:689:9:689:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:690:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -2991,6 +3311,7 @@ nodes | 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:699:5:699:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:699:9:699:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:12:700:23 | call to source | semmle.label | call to source | @@ -3006,6 +3327,7 @@ nodes | 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:708:5:708:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:708:9:708:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:709:9 | a [element 2] | semmle.label | a [element 2] | @@ -3016,6 +3338,7 @@ nodes | 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:717:5:717:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:717:9:717:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:718:9 | a [element 2] | semmle.label | a [element 2] | @@ -3026,6 +3349,7 @@ nodes | 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:726:5:726:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:726:9:726:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:729:9 | a [element 2] | semmle.label | a [element 2] | @@ -3054,6 +3378,7 @@ nodes | 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:754:5:754:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:754:9:754:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:757:9 | a [element 2] | semmle.label | a [element 2] | @@ -3069,6 +3394,7 @@ nodes | 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:772:5:772:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:772:9:772:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:775:9 | a [element 2] | semmle.label | a [element 2] | @@ -3097,6 +3423,7 @@ nodes | 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:800:5:800:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:800:9:800:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:803:9 | a [element 2] | semmle.label | a [element 2] | @@ -3112,6 +3439,7 @@ nodes | 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:818:5:818:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:818:9:818:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:820:9 | a [element 2] | semmle.label | a [element 2] | @@ -3132,6 +3460,7 @@ nodes | 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:834:5:834:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:834:9:834:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:835:9 | a [element 2] | semmle.label | a [element 2] | @@ -3143,16 +3472,19 @@ nodes | 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:844:5:844:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:844:9:844:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:17:845:17 | 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:9:853:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:16:854:16 | x | semmle.label | x | | array_flow.rb:855:14:855:14 | x | semmle.label | x | | array_flow.rb:866:5:866:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:866:9:866:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:867:9 | a [element 2] | semmle.label | a [element 2] | @@ -3166,6 +3498,7 @@ nodes | array_flow.rb:872:10:872:13 | ...[...] [element] | semmle.label | ...[...] [element] | | 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:9:876:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:878:9 | a [element 2] | semmle.label | a [element 2] | @@ -3199,6 +3532,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:905:9:905:42 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:905:9:905:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:906:5:906:5 | b | semmle.label | b | @@ -3212,6 +3547,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:913:9:913:42 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:913:9:913:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:914:5:914:5 | b [element] | semmle.label | b [element] | @@ -3227,6 +3564,7 @@ nodes | 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:924:5:924:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:924:9:924:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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 5] | semmle.label | [post] a [element 5] | @@ -3237,10 +3575,13 @@ nodes | 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:935:5:935:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:935:9:935:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:936:28 | call to [] [element 1] | semmle.label | call to [] [element 1] | | 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:9:937:28 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:938:9 | a [element 2] | semmle.label | a [element 2] | @@ -3254,6 +3595,7 @@ nodes | array_flow.rb:940:10:940:13 | ...[...] [element] | semmle.label | ...[...] [element] | | 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:9:944:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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] | semmle.label | b [element] | @@ -3274,8 +3616,10 @@ nodes | 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:955:5:955:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:955:9:955:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:956:17 | call to [] [element 2, element 0] | semmle.label | call to [] [element 2, 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:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | @@ -3285,6 +3629,8 @@ nodes | 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 2] | semmle.label | a [element 2] | +| array_flow.rb:962:9:962:39 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:962:9:962:39 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:963:9:963:9 | a [element 0] | semmle.label | a [element 0] | @@ -3298,6 +3644,7 @@ nodes | 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:976:5:976:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:976:9:976:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:977:9 | a [element 2] | semmle.label | a [element 2] | @@ -3307,6 +3654,7 @@ nodes | 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:985:5:985:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:985:9:985:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:986:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -3319,6 +3667,7 @@ nodes | 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:995:5:995:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:995:9:995:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:996:9 | a [element 2] | semmle.label | a [element 2] | @@ -3331,6 +3680,7 @@ nodes | 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:1005:5:1005:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1005:9:1005:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:1006:9 | a [element 2] | semmle.label | a [element 2] | @@ -3345,6 +3695,7 @@ nodes | 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:33 | call to replace [element 0] | semmle.label | call to replace [element 0] | +| array_flow.rb:1017:19:1017:32 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:13 | ...[...] | semmle.label | ...[...] | @@ -3352,6 +3703,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:1023:9:1023:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1023:9:1023:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:1024:5:1024:5 | b [element] | semmle.label | b [element] | @@ -3370,6 +3723,8 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:1034:9:1034:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1034:9:1034:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:1035:5:1035:5 | b [element] | semmle.label | b [element] | @@ -3392,6 +3747,7 @@ nodes | 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:1045:5:1045:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1045:9:1045:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:1046:9 | a [element 2] | semmle.label | a [element 2] | @@ -3401,6 +3757,7 @@ nodes | 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:1053:5:1053:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1053:9:1053:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:18:1054:18 | x | semmle.label | x | @@ -3408,6 +3765,9 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:1063:9:1063:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1063:9:1063:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1063:9:1063:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:43:1063:55 | call to source | semmle.label | call to source | @@ -3480,6 +3840,9 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:1095:9:1095:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1095:9:1095:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1095:9:1095:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:43:1095:55 | call to source | semmle.label | call to source | @@ -3518,6 +3881,9 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:1106:9:1106:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1106:9:1106:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1106:9:1106:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:43:1106:55 | call to source | semmle.label | call to source | @@ -3556,6 +3922,9 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:1117:9:1117:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1117:9:1117:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1117:9:1117:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:43:1117:55 | call to source | semmle.label | call to source | @@ -3586,6 +3955,9 @@ nodes | 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 3] | semmle.label | a [element 3] | +| array_flow.rb:1128:9:1128:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1128:9:1128:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1128:9:1128:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:43:1128:55 | call to source | semmle.label | call to source | @@ -3612,6 +3984,7 @@ nodes | 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:1141:5:1141:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1141:9:1141:30 | call to [] [element 3] | semmle.label | call to [] [element 3] | | 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:9:1142:9 | a [element 3] | semmle.label | a [element 3] | @@ -3621,6 +3994,7 @@ nodes | 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:1149:5:1149:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1149:9:1149:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:1150:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -3634,6 +4008,8 @@ nodes | 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 2] | semmle.label | a [element 2] | +| array_flow.rb:1159:9:1159:41 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1159:9:1159:41 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:1160:5:1160:5 | b | semmle.label | b | @@ -3646,6 +4022,8 @@ nodes | 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 2] | semmle.label | a [element 2] | +| array_flow.rb:1166:9:1166:41 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1166:9:1166:41 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:1167:5:1167:5 | b [element 0] | semmle.label | b [element 0] | @@ -3659,6 +4037,8 @@ nodes | 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 2] | semmle.label | a [element 2] | +| array_flow.rb:1174:9:1174:41 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1174:9:1174:41 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:1175:5:1175:5 | b [element] | semmle.label | b [element] | @@ -3679,6 +4059,7 @@ nodes | 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:1184:5:1184:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1184:9:1184:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:1185:9 | a [element 2] | semmle.label | a [element 2] | @@ -3692,6 +4073,7 @@ nodes | array_flow.rb:1191:10:1191:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1195:5:1195:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1195:9:1195:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:9:1196:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -3712,6 +4094,8 @@ nodes | 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 4] | semmle.label | a [element 4] | +| array_flow.rb:1206:9:1206:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1206:9:1206:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | 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:1208:5:1208:5 | b | semmle.label | b | @@ -3789,6 +4173,8 @@ nodes | array_flow.rb:1256:10:1256:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1260:5:1260:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1260:5:1260:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1260:9:1260:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1260:9:1260:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1260:16:1260:28 | call to source | semmle.label | call to source | | array_flow.rb:1260:34:1260:46 | call to source | semmle.label | call to source | | array_flow.rb:1261:5:1261:5 | b | semmle.label | b | @@ -3801,6 +4187,8 @@ nodes | array_flow.rb:1266:10:1266:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1268:5:1268:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1268:5:1268:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1268:9:1268:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1268:9:1268:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1268:16:1268:28 | call to source | semmle.label | call to source | | array_flow.rb:1268:34:1268:46 | call to source | semmle.label | call to source | | array_flow.rb:1269:5:1269:5 | b | semmle.label | b | @@ -3823,6 +4211,8 @@ nodes | array_flow.rb:1277:10:1277:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1279:5:1279:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1279:5:1279:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1279:9:1279:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1279:9:1279:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1279:16:1279:28 | call to source | semmle.label | call to source | | array_flow.rb:1279:34:1279:46 | call to source | semmle.label | call to source | | array_flow.rb:1280:5:1280:5 | b [element 0] | semmle.label | b [element 0] | @@ -3837,6 +4227,8 @@ nodes | array_flow.rb:1283:10:1283:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1290:5:1290:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1290:5:1290:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1290:9:1290:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1290:9:1290:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1290:16:1290:28 | call to source | semmle.label | call to source | | array_flow.rb:1290:34:1290:46 | call to source | semmle.label | call to source | | array_flow.rb:1291:5:1291:5 | b [element 0] | semmle.label | b [element 0] | @@ -3850,6 +4242,8 @@ nodes | array_flow.rb:1297:10:1297:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1301:5:1301:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1301:5:1301:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1301:9:1301:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1301:9:1301:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1301:16:1301:28 | call to source | semmle.label | call to source | | array_flow.rb:1301:34:1301:46 | call to source | semmle.label | call to source | | array_flow.rb:1302:5:1302:5 | b [element 0] | semmle.label | b [element 0] | @@ -3863,6 +4257,8 @@ nodes | array_flow.rb:1308:10:1308:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1312:5:1312:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1312:5:1312:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1312:9:1312:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1312:9:1312:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1312:16:1312:28 | call to source | semmle.label | call to source | | array_flow.rb:1312:34:1312:46 | call to source | semmle.label | call to source | | array_flow.rb:1313:5:1313:5 | b [element] | semmle.label | b [element] | @@ -3884,6 +4280,8 @@ nodes | array_flow.rb:1319:10:1319:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1321:5:1321:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1321:5:1321:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1321:9:1321:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1321:9:1321:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1321:16:1321:28 | call to source | semmle.label | call to source | | array_flow.rb:1321:34:1321:46 | call to source | semmle.label | call to source | | array_flow.rb:1322:5:1322:5 | b [element] | semmle.label | b [element] | @@ -3905,6 +4303,8 @@ nodes | array_flow.rb:1328:10:1328:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1330:5:1330:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1330:5:1330:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1330:9:1330:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1330:9:1330:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1330:16:1330:28 | call to source | semmle.label | call to source | | array_flow.rb:1330:34:1330:46 | call to source | semmle.label | call to source | | array_flow.rb:1331:5:1331:5 | b [element] | semmle.label | b [element] | @@ -3926,6 +4326,8 @@ nodes | array_flow.rb:1337:10:1337:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1339:5:1339:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1339:5:1339:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1339:9:1339:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1339:9:1339:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1339:16:1339:28 | call to source | semmle.label | call to source | | array_flow.rb:1339:34:1339:46 | call to source | semmle.label | call to source | | array_flow.rb:1340:5:1340:5 | b [element 2] | semmle.label | b [element 2] | @@ -3939,6 +4341,8 @@ nodes | array_flow.rb:1345:10:1345:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1348:5:1348:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1348:5:1348:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1348:9:1348:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1348:9:1348:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1348:16:1348:28 | call to source | semmle.label | call to source | | array_flow.rb:1348:34:1348:46 | call to source | semmle.label | call to source | | array_flow.rb:1349:5:1349:5 | b [element] | semmle.label | b [element] | @@ -3959,16 +4363,19 @@ nodes | array_flow.rb:1355:10:1355:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1355:10:1355:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1359:5:1359:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1359:9:1359:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1359:16:1359:26 | call to source | semmle.label | call to source | | array_flow.rb:1360:9:1360:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1360:27:1360:27 | x | semmle.label | x | | array_flow.rb:1361:14:1361:14 | x | semmle.label | x | | array_flow.rb:1367:5:1367:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1367:9:1367:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1367:16:1367:26 | call to source | semmle.label | call to source | | array_flow.rb:1368:9:1368:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1368:28:1368:28 | x | semmle.label | x | | array_flow.rb:1369:14:1369:14 | x | semmle.label | x | | array_flow.rb:1375:5:1375:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1375:9:1375:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1375:16:1375:26 | call to source | semmle.label | call to source | | array_flow.rb:1376:9:1376:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1376:26:1376:26 | x | semmle.label | x | @@ -3976,6 +4383,7 @@ nodes | array_flow.rb:1377:14:1377:14 | x | semmle.label | x | | array_flow.rb:1378:14:1378:14 | y | semmle.label | y | | array_flow.rb:1383:5:1383:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1383:9:1383:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1383:16:1383:26 | call to source | semmle.label | call to source | | array_flow.rb:1384:5:1384:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1384:9:1384:9 | a [element 2] | semmle.label | a [element 2] | @@ -3996,6 +4404,7 @@ nodes | array_flow.rb:1393:10:1393:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1393:10:1393:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1397:5:1397:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1397:9:1397:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1397:16:1397:26 | call to source | semmle.label | call to source | | array_flow.rb:1398:5:1398:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1398:9:1398:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -4010,6 +4419,7 @@ nodes | array_flow.rb:1402:10:1402:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1402:10:1402:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1404:5:1404:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1404:9:1404:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1404:16:1404:26 | call to source | semmle.label | call to source | | array_flow.rb:1405:5:1405:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1405:9:1405:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -4028,6 +4438,7 @@ nodes | array_flow.rb:1413:10:1413:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1413:10:1413:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1417:5:1417:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1417:9:1417:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1417:16:1417:26 | call to source | semmle.label | call to source | | array_flow.rb:1418:5:1418:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1418:9:1418:9 | a [element 2] | semmle.label | a [element 2] | @@ -4039,6 +4450,7 @@ nodes | array_flow.rb:1423:10:1423:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1427:5:1427:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1427:9:1427:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1427:16:1427:26 | call to source | semmle.label | call to source | | array_flow.rb:1428:5:1428:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1428:9:1428:9 | [post] a [element] | semmle.label | [post] a [element] | @@ -4055,12 +4467,15 @@ nodes | array_flow.rb:1435:10:1435:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1435:10:1435:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1439:5:1439:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1439:9:1439:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1439:16:1439:26 | call to source | semmle.label | call to source | | array_flow.rb:1440:9:1440:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1440:19:1440:19 | x | semmle.label | x | | array_flow.rb:1441:14:1441:14 | x | semmle.label | x | | array_flow.rb:1447:5:1447:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1447:5:1447:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1447:9:1447:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1447:9:1447:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | | array_flow.rb:1447:16:1447:28 | call to source | semmle.label | call to source | | array_flow.rb:1447:31:1447:43 | call to source | semmle.label | call to source | | array_flow.rb:1448:5:1448:5 | b [element 2] | semmle.label | b [element 2] | @@ -4105,6 +4520,7 @@ nodes | array_flow.rb:1467:10:1467:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1467:10:1467:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1471:5:1471:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1471:9:1471:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1471:16:1471:26 | call to source | semmle.label | call to source | | array_flow.rb:1472:5:1472:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1472:9:1472:9 | a [element 2] | semmle.label | a [element 2] | @@ -4114,6 +4530,7 @@ nodes | array_flow.rb:1478:10:1478:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1478:10:1478:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1484:5:1484:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1484:9:1484:30 | call to [] [element 3] | semmle.label | call to [] [element 3] | | array_flow.rb:1484:19:1484:29 | call to source | semmle.label | call to source | | array_flow.rb:1485:5:1485:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1485:9:1485:9 | a [element 3] | semmle.label | a [element 3] | @@ -4121,6 +4538,7 @@ nodes | array_flow.rb:1486:10:1486:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1486:10:1486:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1490:5:1490:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1490:9:1490:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1490:16:1490:26 | call to source | semmle.label | call to source | | array_flow.rb:1491:5:1491:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1491:9:1491:9 | a [element 2] | semmle.label | a [element 2] | @@ -4130,8 +4548,14 @@ nodes | array_flow.rb:1507:5:1507:5 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | | array_flow.rb:1507:5:1507:5 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | | array_flow.rb:1507:5:1507:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:1507:9:1507:68 | call to [] [element 0, element 1] | semmle.label | call to [] [element 0, element 1] | +| array_flow.rb:1507:9:1507:68 | call to [] [element 1, element 1] | semmle.label | call to [] [element 1, element 1] | +| array_flow.rb:1507:9:1507:68 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, element 1] | +| array_flow.rb:1507:10:1507:27 | call to [] [element 1] | semmle.label | call to [] [element 1] | | array_flow.rb:1507:14:1507:26 | call to source | semmle.label | call to source | +| array_flow.rb:1507:30:1507:47 | call to [] [element 1] | semmle.label | call to [] [element 1] | | array_flow.rb:1507:34:1507:46 | call to source | semmle.label | call to source | +| array_flow.rb:1507:50:1507:67 | call to [] [element 1] | semmle.label | call to [] [element 1] | | array_flow.rb:1507:54:1507:66 | call to source | semmle.label | call to source | | array_flow.rb:1508:5:1508:5 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | | array_flow.rb:1508:5:1508:5 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | @@ -4152,10 +4576,13 @@ nodes | array_flow.rb:1514:10:1514:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | | array_flow.rb:1514:10:1514:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1518:5:1518:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1518:9:1518:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1518:16:1518:28 | call to source | semmle.label | call to source | | array_flow.rb:1519:5:1519:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1519:9:1519:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | | array_flow.rb:1519:13:1519:25 | call to source | semmle.label | call to source | | array_flow.rb:1520:5:1520:5 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:1520:9:1520:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | | array_flow.rb:1520:13:1520:25 | call to source | semmle.label | call to source | | array_flow.rb:1521:5:1521:5 | d [element] | semmle.label | d [element] | | array_flow.rb:1521:9:1521:9 | a [element 2] | semmle.label | a [element 2] | @@ -4170,6 +4597,8 @@ nodes | array_flow.rb:1524:10:1524:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1528:5:1528:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1528:5:1528:5 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1528:9:1528:47 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1528:9:1528:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | | array_flow.rb:1528:19:1528:31 | call to source | semmle.label | call to source | | array_flow.rb:1528:34:1528:46 | call to source | semmle.label | call to source | | array_flow.rb:1530:5:1530:5 | b [element] | semmle.label | b [element] | @@ -4190,6 +4619,8 @@ nodes | array_flow.rb:1538:10:1538:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1542:5:1542:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1542:5:1542:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1542:9:1542:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1542:9:1542:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | | array_flow.rb:1542:16:1542:28 | call to source | semmle.label | call to source | | array_flow.rb:1542:31:1542:43 | call to source | semmle.label | call to source | | array_flow.rb:1543:5:1543:5 | b [element] | semmle.label | b [element] | @@ -4207,6 +4638,8 @@ nodes | array_flow.rb:1547:10:1547:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1549:5:1549:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1549:5:1549:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1549:9:1549:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1549:9:1549:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | | array_flow.rb:1549:16:1549:28 | call to source | semmle.label | call to source | | array_flow.rb:1549:31:1549:43 | call to source | semmle.label | call to source | | array_flow.rb:1550:5:1550:5 | b [element] | semmle.label | b [element] | @@ -4225,6 +4658,7 @@ nodes | array_flow.rb:1557:10:1557:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1557:10:1557:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1561:5:1561:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1561:9:1561:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1561:16:1561:28 | call to source | semmle.label | call to source | | array_flow.rb:1562:5:1562:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:1562:5:1562:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | @@ -4236,6 +4670,8 @@ nodes | array_flow.rb:1568:10:1568:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1572:5:1572:5 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1572:5:1572:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1572:9:1572:44 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1572:9:1572:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | | array_flow.rb:1572:13:1572:25 | call to source | semmle.label | call to source | | array_flow.rb:1572:31:1572:43 | call to source | semmle.label | call to source | | array_flow.rb:1574:5:1574:5 | b [element 1] | semmle.label | b [element 1] | @@ -4279,10 +4715,13 @@ nodes | array_flow.rb:1592:10:1592:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1592:10:1592:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1596:5:1596:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1596:9:1596:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1596:16:1596:28 | call to source | semmle.label | call to source | | array_flow.rb:1597:5:1597:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1597:9:1597:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | | array_flow.rb:1597:13:1597:25 | call to source | semmle.label | call to source | | array_flow.rb:1598:5:1598:5 | c [element 0] | semmle.label | c [element 0] | +| array_flow.rb:1598:9:1598:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | | array_flow.rb:1598:10:1598:22 | call to source | semmle.label | call to source | | array_flow.rb:1599:5:1599:5 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | | array_flow.rb:1599:5:1599:5 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | @@ -4315,8 +4754,10 @@ nodes | array_flow.rb:1607:14:1607:14 | x [element 2] | semmle.label | x [element 2] | | array_flow.rb:1607:14:1607:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1612:5:1612:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1612:9:1612:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | | array_flow.rb:1612:16:1612:28 | call to source | semmle.label | call to source | | array_flow.rb:1613:5:1613:5 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1613:9:1613:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | | array_flow.rb:1613:13:1613:25 | call to source | semmle.label | call to source | | array_flow.rb:1614:5:1614:5 | c [element] | semmle.label | c [element] | | array_flow.rb:1614:9:1614:9 | a [element 2] | semmle.label | a [element 2] | @@ -4374,6 +4815,26 @@ nodes | array_flow.rb:1670:14:1670:18 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1672:14:1672:15 | a2 [element 1] | semmle.label | a2 [element 1] | | array_flow.rb:1672:14:1672:18 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1677:5:1677:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1677:9:1677:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1677:16:1677:28 | call to source | semmle.label | call to source | +| array_flow.rb:1678:5:1678:5 | b [element] | semmle.label | b [element] | +| array_flow.rb:1678:9:1678:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1678:9:1680:7 | call to map [element] | semmle.label | call to map [element] | +| array_flow.rb:1681:10:1681:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1681:10:1681:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1685:5:1685:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1685:5:1685:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1685:9:1685:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1685:9:1685:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1685:16:1685:28 | call to source | semmle.label | call to source | +| array_flow.rb:1685:31:1685:43 | call to source | semmle.label | call to source | +| array_flow.rb:1686:11:1686:11 | z | semmle.label | z | +| array_flow.rb:1686:14:1686:14 | w | semmle.label | w | +| array_flow.rb:1686:18:1686:18 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1686:18:1686:18 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1689:10:1689:10 | z | semmle.label | z | +| array_flow.rb:1690:10:1690:10 | w | semmle.label | w | subpaths arrayLiteral | array_flow.rb:9:9:9:25 | call to [] | @@ -4564,6 +5025,8 @@ arrayLiteral | array_flow.rb:1621:10:1621:12 | call to [] | | array_flow.rb:1647:9:1647:32 | ...[...] | | array_flow.rb:1668:14:1668:41 | ...[...] | +| array_flow.rb:1677:9:1677:29 | call to [] | +| array_flow.rb:1685:9:1685:44 | call to [] | #select | array_flow.rb:3:10:3:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source | array_flow.rb:3:10:3:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source | call to source | | array_flow.rb:5:10:5:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source | array_flow.rb:5:10:5:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source | call to source | @@ -5264,3 +5727,6 @@ arrayLiteral | array_flow.rb:1651:10:1651:13 | ...[...] | array_flow.rb:1647:18:1647:28 | call to source | array_flow.rb:1651:10:1651:13 | ...[...] | $@ | array_flow.rb:1647:18:1647:28 | call to source | call to source | | array_flow.rb:1670:14:1670:18 | ...[...] | array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1670:14:1670:18 | ...[...] | $@ | array_flow.rb:1668:25:1668:37 | call to source | call to source | | array_flow.rb:1672:14:1672:18 | ...[...] | array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1672:14:1672:18 | ...[...] | $@ | array_flow.rb:1668:25:1668:37 | call to source | call to source | +| array_flow.rb:1681:10:1681:13 | ...[...] | array_flow.rb:1677:16:1677:28 | call to source | array_flow.rb:1681:10:1681:13 | ...[...] | $@ | array_flow.rb:1677:16:1677:28 | call to source | call to source | +| array_flow.rb:1689:10:1689:10 | z | array_flow.rb:1685:16:1685:28 | call to source | array_flow.rb:1689:10:1689:10 | z | $@ | array_flow.rb:1685:16:1685:28 | call to source | call to source | +| array_flow.rb:1690:10:1690:10 | w | array_flow.rb:1685:31:1685:43 | call to source | array_flow.rb:1690:10:1690:10 | w | $@ | array_flow.rb:1685:31:1685:43 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb b/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb index bc137a38334..cb07ce96ca6 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb @@ -1672,3 +1672,20 @@ class M139 sink(a2[i]) # $ hasValueFlow=139.2 end end + +def m139 + a = [0, 1, source(139.1)] + b = a.map do |x| + x + end + sink b[2] # $ hasValueFlow=139.1 +end + +def m140 + a = [0, 1, source(140.1), source(140.2)] + x, y, z, w = a + sink x + sink y + sink z # $ hasValueFlow=140.1 + sink w # $ hasValueFlow=140.2 +end diff --git a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected index 7f40375e963..9fa0bcb272b 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected @@ -162,8 +162,10 @@ edges | semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:117:16:117:16 | h [element :a] | provenance | | | semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | provenance | | | semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | provenance | | -| semantics.rb:116:14:116:14 | a | semantics.rb:116:5:116:5 | h [element :a] | provenance | | -| semantics.rb:116:14:116:14 | a | semantics.rb:116:5:116:5 | h [element :a] | provenance | | +| semantics.rb:116:9:116:22 | call to [] [element :a] | semantics.rb:116:5:116:5 | h [element :a] | provenance | | +| semantics.rb:116:9:116:22 | call to [] [element :a] | semantics.rb:116:5:116:5 | h [element :a] | provenance | | +| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] [element :a] | provenance | | +| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] [element :a] | provenance | | | semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | | | semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | | | semantics.rb:117:16:117:16 | h [element :a] | semantics.rb:117:14:117:16 | ** ... [element :a] | provenance | | @@ -212,10 +214,14 @@ edges | semantics.rb:135:5:135:7 | arr [element 0] | semantics.rb:136:15:136:17 | arr [element 0] | provenance | | | semantics.rb:135:5:135:7 | arr [element 1] | semantics.rb:136:15:136:17 | arr [element 1] | provenance | | | semantics.rb:135:5:135:7 | arr [element 1] | semantics.rb:136:15:136:17 | arr [element 1] | provenance | | -| semantics.rb:135:12:135:12 | a | semantics.rb:135:5:135:7 | arr [element 0] | provenance | | -| semantics.rb:135:12:135:12 | a | semantics.rb:135:5:135:7 | arr [element 0] | provenance | | -| semantics.rb:135:15:135:15 | b | semantics.rb:135:5:135:7 | arr [element 1] | provenance | | -| semantics.rb:135:15:135:15 | b | semantics.rb:135:5:135:7 | arr [element 1] | provenance | | +| semantics.rb:135:11:135:16 | call to [] [element 0] | semantics.rb:135:5:135:7 | arr [element 0] | provenance | | +| semantics.rb:135:11:135:16 | call to [] [element 0] | semantics.rb:135:5:135:7 | arr [element 0] | provenance | | +| semantics.rb:135:11:135:16 | call to [] [element 1] | semantics.rb:135:5:135:7 | arr [element 1] | provenance | | +| semantics.rb:135:11:135:16 | call to [] [element 1] | semantics.rb:135:5:135:7 | arr [element 1] | provenance | | +| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] [element 0] | provenance | | +| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] [element 0] | provenance | | +| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] [element 1] | provenance | | +| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] [element 1] | provenance | | | semantics.rb:136:14:136:17 | * ... [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | | | semantics.rb:136:14:136:17 | * ... [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | | | semantics.rb:136:14:136:17 | * ... [element 1] | semantics.rb:136:10:136:18 | call to s18 | provenance | | @@ -1275,6 +1281,8 @@ nodes | semantics.rb:115:9:115:18 | call to source | semmle.label | call to source | | semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] | | semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:116:9:116:22 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| semantics.rb:116:9:116:22 | call to [] [element :a] | semmle.label | call to [] [element :a] | | semantics.rb:116:14:116:14 | a | semmle.label | a | | semantics.rb:116:14:116:14 | a | semmle.label | a | | semantics.rb:117:10:117:17 | call to s16 | semmle.label | call to s16 | @@ -1332,6 +1340,10 @@ nodes | semantics.rb:135:5:135:7 | arr [element 0] | semmle.label | arr [element 0] | | semantics.rb:135:5:135:7 | arr [element 1] | semmle.label | arr [element 1] | | semantics.rb:135:5:135:7 | arr [element 1] | semmle.label | arr [element 1] | +| semantics.rb:135:11:135:16 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| semantics.rb:135:11:135:16 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| semantics.rb:135:11:135:16 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| semantics.rb:135:11:135:16 | call to [] [element 1] | semmle.label | call to [] [element 1] | | semantics.rb:135:12:135:12 | a | semmle.label | a | | semantics.rb:135:12:135:12 | a | semmle.label | a | | semantics.rb:135:15:135:15 | b | semmle.label | b | diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index 5f019f306d3..fb836e8488c 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -116,6 +116,12 @@ edges | captured_variables.rb:194:1:194:1 | c [@x] | captured_variables.rb:185:5:189:7 | self in baz [@x] | provenance | | | captured_variables.rb:197:9:197:17 | call to taint | captured_variables.rb:199:10:199:10 | x | provenance | | | captured_variables.rb:206:13:206:21 | call to taint | captured_variables.rb:208:14:208:14 | x | provenance | | +| captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:222:11:224:5 | -> { ... } [captured x] | provenance | | +| captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:226:5:226:7 | fn1 [captured x] | provenance | | +| captured_variables.rb:222:5:222:7 | fn1 [captured x] | captured_variables.rb:226:5:226:7 | fn1 [captured x] | provenance | | +| captured_variables.rb:222:11:224:5 | -> { ... } [captured x] | captured_variables.rb:222:5:222:7 | fn1 [captured x] | provenance | | +| captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | captured_variables.rb:227:10:227:10 | y | provenance | | +| captured_variables.rb:226:5:226:7 | fn1 [captured x] | captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | provenance | | | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:18:11:18 | x | provenance | | | instance_variables.rb:11:18:11:18 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | provenance | | | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:16:14:21 | self [@field] | provenance | | @@ -374,6 +380,12 @@ nodes | captured_variables.rb:199:10:199:10 | x | semmle.label | x | | captured_variables.rb:206:13:206:21 | call to taint | semmle.label | call to taint | | captured_variables.rb:208:14:208:14 | x | semmle.label | x | +| captured_variables.rb:219:9:219:17 | call to taint | semmle.label | call to taint | +| captured_variables.rb:222:5:222:7 | fn1 [captured x] | semmle.label | fn1 [captured x] | +| captured_variables.rb:222:11:224:5 | -> { ... } [captured x] | semmle.label | -> { ... } [captured x] | +| captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | semmle.label | [post] fn1 [captured y] | +| captured_variables.rb:226:5:226:7 | fn1 [captured x] | semmle.label | fn1 [captured x] | +| captured_variables.rb:227:10:227:10 | y | semmle.label | y | | 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:18:11:18 | x | semmle.label | x | @@ -583,6 +595,7 @@ subpaths | captured_variables.rb:187:18:187:19 | @x | captured_variables.rb:178:14:178:22 | call to taint | captured_variables.rb:187:18:187:19 | @x | $@ | captured_variables.rb:178:14:178:22 | call to taint | call to taint | | captured_variables.rb:199:10:199:10 | x | captured_variables.rb:197:9:197:17 | call to taint | captured_variables.rb:199:10:199:10 | x | $@ | captured_variables.rb:197:9:197:17 | call to taint | call to taint | | captured_variables.rb:208:14:208:14 | x | captured_variables.rb:206:13:206:21 | call to taint | captured_variables.rb:208:14:208:14 | x | $@ | captured_variables.rb:206:13:206:21 | call to taint | call to taint | +| captured_variables.rb:227:10:227:10 | y | captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:227:10:227:10 | y | $@ | captured_variables.rb:219:9:219:17 | call to taint | call to taint | | instance_variables.rb:20:10:20:13 | @foo | instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:20:10:20:13 | @foo | $@ | instance_variables.rb:19:12:19:21 | call to taint | call to taint | | instance_variables.rb:36:10:36:33 | call to get_field | instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:33 | call to get_field | $@ | instance_variables.rb:36:14:36:22 | call to taint | call to taint | | instance_variables.rb:39:6:39:33 | call to get_field | instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:33 | call to get_field | $@ | instance_variables.rb:39:14:39:22 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb b/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb index 63e2188fcee..79d1fc83b76 100644 --- a/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb +++ b/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb @@ -214,3 +214,17 @@ class CaptureOverwrite fn.call() end + +def multi_capture + x = taint(18) + y = 123 + + fn1 = -> { + y = x + } + + fn1.call() + sink(y) # $ hasValueFlow=18 +end + +multi_capture 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 df37ffac47a..d2da8837a56 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 @@ -5,11 +5,16 @@ edges | hash_flow.rb:10:5:10:8 | hash [element :c] | hash_flow.rb:24:10:24:13 | hash [element :c] | provenance | | | hash_flow.rb:10:5:10:8 | hash [element e] | hash_flow.rb:26:10:26:13 | hash [element e] | provenance | | | hash_flow.rb:10:5:10:8 | hash [element g] | hash_flow.rb:28:10:28:13 | hash [element g] | provenance | | -| hash_flow.rb:11:15:11:24 | call to taint | hash_flow.rb:10:5:10:8 | hash [element :a] | provenance | | -| hash_flow.rb:13:12:13:21 | call to taint | hash_flow.rb:10:5:10:8 | hash [element :c] | provenance | | -| hash_flow.rb:15:14:15:23 | call to taint | hash_flow.rb:10:5:10:8 | hash [element e] | provenance | | -| hash_flow.rb:17:16:17:25 | call to taint | hash_flow.rb:10:5:10:8 | hash [element g] | provenance | | -| hash_flow.rb:19:14:19:23 | call to taint | hash_flow.rb:10:5:10:8 | hash [element 0] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] [element 0] | hash_flow.rb:10:5:10:8 | hash [element 0] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] [element :a] | hash_flow.rb:10:5:10:8 | hash [element :a] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] [element :c] | hash_flow.rb:10:5:10:8 | hash [element :c] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] [element e] | hash_flow.rb:10:5:10:8 | hash [element e] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] [element g] | hash_flow.rb:10:5:10:8 | hash [element g] | provenance | | +| hash_flow.rb:11:15:11:24 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:13:12:13:21 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element :c] | provenance | | +| hash_flow.rb:15:14:15:23 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element e] | provenance | | +| hash_flow.rb:17:16:17:25 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element g] | provenance | | +| hash_flow.rb:19:14:19:23 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element 0] | provenance | | | hash_flow.rb:22:10:22:13 | hash [element :a] | hash_flow.rb:22:10:22:17 | ...[...] | provenance | | | hash_flow.rb:24:10:24:13 | hash [element :c] | hash_flow.rb:24:10:24:17 | ...[...] | provenance | | | hash_flow.rb:26:10:26:13 | hash [element e] | hash_flow.rb:26:10:26:18 | ...[...] | provenance | | @@ -47,7 +52,8 @@ edges | hash_flow.rb:55:21:55:30 | call to taint | hash_flow.rb:55:13:55:37 | ...[...] [element :a] | provenance | | | hash_flow.rb:56:10:56:14 | hash1 [element :a] | hash_flow.rb:56:10:56:18 | ...[...] | provenance | | | hash_flow.rb:59:5:59:5 | x [element :a] | hash_flow.rb:60:18:60:18 | x [element :a] | provenance | | -| hash_flow.rb:59:13:59:22 | call to taint | hash_flow.rb:59:5:59:5 | x [element :a] | provenance | | +| hash_flow.rb:59:9:59:29 | call to [] [element :a] | hash_flow.rb:59:5:59:5 | x [element :a] | provenance | | +| hash_flow.rb:59:13:59:22 | call to taint | hash_flow.rb:59:9:59:29 | call to [] [element :a] | provenance | | | hash_flow.rb:60:5:60:9 | hash2 [element :a] | hash_flow.rb:61:10:61:14 | hash2 [element :a] | provenance | | | hash_flow.rb:60:13:60:19 | ...[...] [element :a] | hash_flow.rb:60:5:60:9 | hash2 [element :a] | provenance | | | hash_flow.rb:60:18:60:18 | x [element :a] | hash_flow.rb:60:13:60:19 | ...[...] [element :a] | provenance | | @@ -55,7 +61,9 @@ edges | hash_flow.rb:64:5:64:9 | hash3 [element] | hash_flow.rb:65:10:65:14 | hash3 [element] | provenance | | | hash_flow.rb:64:5:64:9 | hash3 [element] | hash_flow.rb:66:10:66:14 | hash3 [element] | provenance | | | hash_flow.rb:64:13:64:45 | ...[...] [element] | hash_flow.rb:64:5:64:9 | hash3 [element] | provenance | | -| hash_flow.rb:64:24:64:33 | call to taint | hash_flow.rb:64:13:64:45 | ...[...] [element] | provenance | | +| hash_flow.rb:64:18:64:44 | call to [] [element 0, element 1] | hash_flow.rb:64:13:64:45 | ...[...] [element] | provenance | | +| hash_flow.rb:64:19:64:34 | call to [] [element 1] | hash_flow.rb:64:18:64:44 | call to [] [element 0, element 1] | provenance | | +| hash_flow.rb:64:24:64:33 | call to taint | hash_flow.rb:64:19:64:34 | call to [] [element 1] | provenance | | | hash_flow.rb:65:10:65:14 | hash3 [element] | hash_flow.rb:65:10:65:18 | ...[...] | provenance | | | hash_flow.rb:66:10:66:14 | hash3 [element] | hash_flow.rb:66:10:66:18 | ...[...] | provenance | | | hash_flow.rb:68:5:68:9 | hash4 [element :a] | hash_flow.rb:69:10:69:14 | hash4 [element :a] | provenance | | @@ -68,14 +76,16 @@ edges | hash_flow.rb:73:10:73:14 | hash5 [element a] | hash_flow.rb:73:10:73:19 | ...[...] | provenance | | | hash_flow.rb:76:5:76:9 | hash6 [element a] | hash_flow.rb:77:10:77:14 | hash6 [element a] | provenance | | | hash_flow.rb:76:13:76:47 | ...[...] [element a] | hash_flow.rb:76:5:76:9 | hash6 [element a] | provenance | | -| hash_flow.rb:76:26:76:35 | call to taint | hash_flow.rb:76:13:76:47 | ...[...] [element a] | provenance | | +| hash_flow.rb:76:18:76:46 | call to [] [element a] | hash_flow.rb:76:13:76:47 | ...[...] [element a] | provenance | | +| hash_flow.rb:76:26:76:35 | call to taint | hash_flow.rb:76:18:76:46 | call to [] [element a] | provenance | | | hash_flow.rb:77:10:77:14 | hash6 [element a] | hash_flow.rb:77:10:77:19 | ...[...] | provenance | | | hash_flow.rb:84:5:84:9 | hash1 [element :a] | hash_flow.rb:85:10:85:14 | hash1 [element :a] | provenance | | | hash_flow.rb:84:13:84:42 | call to [] [element :a] | hash_flow.rb:84:5:84:9 | hash1 [element :a] | provenance | | | hash_flow.rb:84:26:84:35 | call to taint | hash_flow.rb:84:13:84:42 | call to [] [element :a] | provenance | | | hash_flow.rb:85:10:85:14 | hash1 [element :a] | hash_flow.rb:85:10:85:18 | ...[...] | provenance | | | hash_flow.rb:92:5:92:8 | hash [element :a] | hash_flow.rb:96:30:96:33 | hash [element :a] | provenance | | -| hash_flow.rb:93:15:93:24 | call to taint | hash_flow.rb:92:5:92:8 | hash [element :a] | provenance | | +| hash_flow.rb:92:12:95:5 | call to [] [element :a] | hash_flow.rb:92:5:92:8 | hash [element :a] | provenance | | +| hash_flow.rb:93:15:93:24 | call to taint | hash_flow.rb:92:12:95:5 | call to [] [element :a] | provenance | | | hash_flow.rb:96:5:96:9 | hash2 [element :a] | hash_flow.rb:97:10:97:14 | hash2 [element :a] | provenance | | | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | hash_flow.rb:96:5:96:9 | hash2 [element :a] | provenance | | | hash_flow.rb:96:30:96:33 | hash [element :a] | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | provenance | | @@ -98,14 +108,16 @@ edges | hash_flow.rb:120:10:120:13 | hash [element] | hash_flow.rb:120:10:120:17 | ...[...] | provenance | | | hash_flow.rb:127:5:127:8 | hash [element :a] | hash_flow.rb:131:5:131:8 | hash [element :a] | provenance | | | hash_flow.rb:127:5:127:8 | hash [element :a] | hash_flow.rb:134:5:134:8 | hash [element :a] | provenance | | -| hash_flow.rb:128:15:128:24 | call to taint | hash_flow.rb:127:5:127:8 | hash [element :a] | provenance | | +| hash_flow.rb:127:12:130:5 | call to [] [element :a] | hash_flow.rb:127:5:127:8 | hash [element :a] | provenance | | +| hash_flow.rb:128:15:128:24 | call to taint | hash_flow.rb:127:12:130:5 | call to [] [element :a] | provenance | | | hash_flow.rb:131:5:131:8 | hash [element :a] | hash_flow.rb:131:18:131:29 | key_or_value | provenance | | | hash_flow.rb:131:18:131:29 | key_or_value | hash_flow.rb:132:14:132:25 | key_or_value | provenance | | | hash_flow.rb:134:5:134:8 | hash [element :a] | hash_flow.rb:134:22:134:26 | value | provenance | | | hash_flow.rb:134:22:134:26 | value | hash_flow.rb:136:14:136:18 | value | provenance | | | hash_flow.rb:143:5:143:8 | hash [element :a] | hash_flow.rb:147:9:147:12 | hash [element :a] | provenance | | | hash_flow.rb:143:5:143:8 | hash [element :a] | hash_flow.rb:151:9:151:12 | hash [element :a] | provenance | | -| hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:143:5:143:8 | hash [element :a] | provenance | | +| hash_flow.rb:143:12:146:5 | call to [] [element :a] | hash_flow.rb:143:5:143:8 | hash [element :a] | provenance | | +| hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:143:12:146:5 | call to [] [element :a] | provenance | | | hash_flow.rb:147:5:147:5 | b [element 1] | hash_flow.rb:149:10:149:10 | b [element 1] | provenance | | | hash_flow.rb:147:5:147:5 | b [element 1] | hash_flow.rb:150:10:150:10 | b [element 1] | provenance | | | hash_flow.rb:147:9:147:12 | hash [element :a] | hash_flow.rb:147:9:147:22 | call to assoc [element 1] | provenance | | @@ -117,18 +129,21 @@ edges | hash_flow.rb:151:9:151:21 | call to assoc [element 1] | hash_flow.rb:151:5:151:5 | c [element 1] | provenance | | | hash_flow.rb:152:10:152:10 | c [element 1] | hash_flow.rb:152:10:152:13 | ...[...] | provenance | | | hash_flow.rb:169:5:169:8 | hash [element :a] | hash_flow.rb:173:9:173:12 | hash [element :a] | provenance | | -| hash_flow.rb:170:15:170:25 | call to taint | hash_flow.rb:169:5:169:8 | hash [element :a] | provenance | | +| hash_flow.rb:169:12:172:5 | call to [] [element :a] | hash_flow.rb:169:5:169:8 | hash [element :a] | provenance | | +| hash_flow.rb:170:15:170:25 | call to taint | hash_flow.rb:169:12:172:5 | call to [] [element :a] | provenance | | | hash_flow.rb:173:5:173:5 | a [element :a] | hash_flow.rb:174:10:174:10 | a [element :a] | provenance | | | hash_flow.rb:173:9:173:12 | hash [element :a] | hash_flow.rb:173:9:173:20 | call to compact [element :a] | provenance | | | hash_flow.rb:173:9:173:20 | call to compact [element :a] | hash_flow.rb:173:5:173:5 | a [element :a] | provenance | | | hash_flow.rb:174:10:174:10 | a [element :a] | hash_flow.rb:174:10:174:14 | ...[...] | provenance | | | hash_flow.rb:181:5:181:8 | hash [element :a] | hash_flow.rb:185:9:185:12 | hash [element :a] | provenance | | -| hash_flow.rb:182:15:182:25 | call to taint | hash_flow.rb:181:5:181:8 | hash [element :a] | provenance | | +| hash_flow.rb:181:12:184:5 | call to [] [element :a] | hash_flow.rb:181:5:181:8 | hash [element :a] | provenance | | +| hash_flow.rb:182:15:182:25 | call to taint | hash_flow.rb:181:12:184:5 | call to [] [element :a] | provenance | | | hash_flow.rb:185:5:185:5 | a | hash_flow.rb:186:10:186:10 | a | provenance | | | hash_flow.rb:185:9:185:12 | hash [element :a] | hash_flow.rb:185:9:185:23 | call to delete | provenance | | | hash_flow.rb:185:9:185:23 | call to delete | hash_flow.rb:185:5:185:5 | a | provenance | | | hash_flow.rb:193:5:193:8 | hash [element :a] | hash_flow.rb:197:9:197:12 | hash [element :a] | provenance | | -| hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:193:5:193:8 | hash [element :a] | provenance | | +| hash_flow.rb:193:12:196:5 | call to [] [element :a] | hash_flow.rb:193:5:193:8 | hash [element :a] | provenance | | +| hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:193:12:196:5 | call to [] [element :a] | provenance | | | hash_flow.rb:197:5:197:5 | a [element :a] | hash_flow.rb:201:10:201:10 | a [element :a] | provenance | | | hash_flow.rb:197:9:197:12 | [post] hash [element :a] | hash_flow.rb:202:10:202:13 | hash [element :a] | provenance | | | hash_flow.rb:197:9:197:12 | hash [element :a] | hash_flow.rb:197:9:197:12 | [post] hash [element :a] | provenance | | @@ -140,12 +155,16 @@ edges | hash_flow.rb:202:10:202:13 | hash [element :a] | hash_flow.rb:202:10:202:17 | ...[...] | provenance | | | hash_flow.rb:209:5:209:8 | hash [element :a] | hash_flow.rb:217:10:217:13 | hash [element :a] | provenance | | | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | provenance | | -| hash_flow.rb:210:15:210:25 | call to taint | hash_flow.rb:209:5:209:8 | hash [element :a] | provenance | | -| hash_flow.rb:213:19:213:29 | call to taint | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | provenance | | +| hash_flow.rb:209:12:216:5 | call to [] [element :a] | hash_flow.rb:209:5:209:8 | hash [element :a] | provenance | | +| hash_flow.rb:209:12:216:5 | call to [] [element :c, element :d] | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | provenance | | +| hash_flow.rb:210:15:210:25 | call to taint | hash_flow.rb:209:12:216:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:212:15:215:9 | call to [] [element :d] | hash_flow.rb:209:12:216:5 | call to [] [element :c, element :d] | provenance | | +| hash_flow.rb:213:19:213:29 | call to taint | hash_flow.rb:212:15:215:9 | call to [] [element :d] | provenance | | | hash_flow.rb:217:10:217:13 | hash [element :a] | hash_flow.rb:217:10:217:21 | call to dig | provenance | | | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | hash_flow.rb:219:10:219:24 | call to dig | provenance | | | hash_flow.rb:226:5:226:8 | hash [element :a] | hash_flow.rb:230:9:230:12 | hash [element :a] | provenance | | -| hash_flow.rb:227:15:227:25 | call to taint | hash_flow.rb:226:5:226:8 | hash [element :a] | provenance | | +| hash_flow.rb:226:12:229:5 | call to [] [element :a] | hash_flow.rb:226:5:226:8 | hash [element :a] | provenance | | +| hash_flow.rb:227:15:227:25 | call to taint | hash_flow.rb:226:12:229:5 | call to [] [element :a] | provenance | | | hash_flow.rb:230:5:230:5 | x [element :a] | hash_flow.rb:234:10:234:10 | x [element :a] | provenance | | | hash_flow.rb:230:9:230:12 | hash [element :a] | hash_flow.rb:230:9:233:7 | call to each [element :a] | provenance | | | hash_flow.rb:230:9:230:12 | hash [element :a] | hash_flow.rb:230:28:230:32 | value | provenance | | @@ -153,13 +172,15 @@ edges | hash_flow.rb:230:28:230:32 | value | hash_flow.rb:232:14:232:18 | value | provenance | | | hash_flow.rb:234:10:234:10 | x [element :a] | hash_flow.rb:234:10:234:14 | ...[...] | provenance | | | hash_flow.rb:241:5:241:8 | hash [element :a] | hash_flow.rb:245:9:245:12 | hash [element :a] | provenance | | -| hash_flow.rb:242:15:242:25 | call to taint | hash_flow.rb:241:5:241:8 | hash [element :a] | provenance | | +| hash_flow.rb:241:12:244:5 | call to [] [element :a] | hash_flow.rb:241:5:241:8 | hash [element :a] | provenance | | +| hash_flow.rb:242:15:242:25 | call to taint | hash_flow.rb:241:12:244:5 | call to [] [element :a] | provenance | | | hash_flow.rb:245:5:245:5 | x [element :a] | hash_flow.rb:248:10:248:10 | x [element :a] | provenance | | | hash_flow.rb:245:9:245:12 | hash [element :a] | hash_flow.rb:245:9:247:7 | call to each_key [element :a] | provenance | | | hash_flow.rb:245:9:247:7 | call to each_key [element :a] | hash_flow.rb:245:5:245:5 | x [element :a] | provenance | | | hash_flow.rb:248:10:248:10 | x [element :a] | hash_flow.rb:248:10:248:14 | ...[...] | provenance | | | hash_flow.rb:255:5:255:8 | hash [element :a] | hash_flow.rb:259:9:259:12 | hash [element :a] | provenance | | -| hash_flow.rb:256:15:256:25 | call to taint | hash_flow.rb:255:5:255:8 | hash [element :a] | provenance | | +| hash_flow.rb:255:12:258:5 | call to [] [element :a] | hash_flow.rb:255:5:255:8 | hash [element :a] | provenance | | +| hash_flow.rb:256:15:256:25 | call to taint | hash_flow.rb:255:12:258:5 | call to [] [element :a] | provenance | | | hash_flow.rb:259:5:259:5 | x [element :a] | hash_flow.rb:263:10:263:10 | x [element :a] | provenance | | | hash_flow.rb:259:9:259:12 | hash [element :a] | hash_flow.rb:259:9:262:7 | call to each_pair [element :a] | provenance | | | hash_flow.rb:259:9:259:12 | hash [element :a] | hash_flow.rb:259:33:259:37 | value | provenance | | @@ -167,7 +188,8 @@ edges | hash_flow.rb:259:33:259:37 | value | hash_flow.rb:261:14:261:18 | value | provenance | | | hash_flow.rb:263:10:263:10 | x [element :a] | hash_flow.rb:263:10:263:14 | ...[...] | provenance | | | hash_flow.rb:270:5:270:8 | hash [element :a] | hash_flow.rb:274:9:274:12 | hash [element :a] | provenance | | -| hash_flow.rb:271:15:271:25 | call to taint | hash_flow.rb:270:5:270:8 | hash [element :a] | provenance | | +| hash_flow.rb:270:12:273:5 | call to [] [element :a] | hash_flow.rb:270:5:270:8 | hash [element :a] | provenance | | +| hash_flow.rb:271:15:271:25 | call to taint | hash_flow.rb:270:12:273:5 | call to [] [element :a] | provenance | | | hash_flow.rb:274:5:274:5 | x [element :a] | hash_flow.rb:277:10:277:10 | x [element :a] | provenance | | | hash_flow.rb:274:9:274:12 | hash [element :a] | hash_flow.rb:274:9:276:7 | call to each_value [element :a] | provenance | | | hash_flow.rb:274:9:274:12 | hash [element :a] | hash_flow.rb:274:29:274:33 | value | provenance | | @@ -175,7 +197,8 @@ edges | hash_flow.rb:274:29:274:33 | value | hash_flow.rb:275:14:275:18 | value | provenance | | | hash_flow.rb:277:10:277:10 | x [element :a] | hash_flow.rb:277:10:277:14 | ...[...] | provenance | | | hash_flow.rb:284:5:284:8 | hash [element :c] | hash_flow.rb:290:9:290:12 | hash [element :c] | provenance | | -| hash_flow.rb:287:15:287:25 | call to taint | hash_flow.rb:284:5:284:8 | hash [element :c] | provenance | | +| hash_flow.rb:284:12:289:5 | call to [] [element :c] | hash_flow.rb:284:5:284:8 | hash [element :c] | provenance | | +| hash_flow.rb:287:15:287:25 | call to taint | hash_flow.rb:284:12:289:5 | call to [] [element :c] | provenance | | | hash_flow.rb:290:5:290:5 | x [element :c] | hash_flow.rb:293:10:293:10 | x [element :c] | provenance | | | hash_flow.rb:290:9:290:12 | hash [element :c] | hash_flow.rb:290:9:290:28 | call to except [element :c] | provenance | | | hash_flow.rb:290:9:290:28 | call to except [element :c] | hash_flow.rb:290:5:290:5 | x [element :c] | provenance | | @@ -186,8 +209,10 @@ edges | hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:315:9:315:12 | hash [element :a] | provenance | | | hash_flow.rb:300:5:300:8 | hash [element :c] | hash_flow.rb:305:9:305:12 | hash [element :c] | provenance | | | hash_flow.rb:300:5:300:8 | hash [element :c] | hash_flow.rb:315:9:315:12 | hash [element :c] | provenance | | -| hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:300:5:300:8 | hash [element :a] | provenance | | -| hash_flow.rb:303:15:303:25 | call to taint | hash_flow.rb:300:5:300:8 | hash [element :c] | provenance | | +| hash_flow.rb:300:12:304:5 | call to [] [element :a] | hash_flow.rb:300:5:300:8 | hash [element :a] | provenance | | +| hash_flow.rb:300:12:304:5 | call to [] [element :c] | hash_flow.rb:300:5:300:8 | hash [element :c] | provenance | | +| hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:300:12:304:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:303:15:303:25 | call to taint | hash_flow.rb:300:12:304:5 | call to [] [element :c] | provenance | | | hash_flow.rb:305:5:305:5 | b | hash_flow.rb:308:10:308:10 | b | provenance | | | hash_flow.rb:305:9:305:12 | hash [element :a] | hash_flow.rb:305:9:307:7 | call to fetch | provenance | | | hash_flow.rb:305:9:305:12 | hash [element :c] | hash_flow.rb:305:9:307:7 | call to fetch | provenance | | @@ -214,8 +239,10 @@ edges | hash_flow.rb:322:5:322:8 | hash [element :a] | hash_flow.rb:334:9:334:12 | hash [element :a] | provenance | | | hash_flow.rb:322:5:322:8 | hash [element :c] | hash_flow.rb:327:9:327:12 | hash [element :c] | provenance | | | hash_flow.rb:322:5:322:8 | hash [element :c] | hash_flow.rb:334:9:334:12 | hash [element :c] | provenance | | -| hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:322:5:322:8 | hash [element :a] | provenance | | -| hash_flow.rb:325:15:325:25 | call to taint | hash_flow.rb:322:5:322:8 | hash [element :c] | provenance | | +| hash_flow.rb:322:12:326:5 | call to [] [element :a] | hash_flow.rb:322:5:322:8 | hash [element :a] | provenance | | +| hash_flow.rb:322:12:326:5 | call to [] [element :c] | hash_flow.rb:322:5:322:8 | hash [element :c] | provenance | | +| hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:322:12:326:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:325:15:325:25 | call to taint | hash_flow.rb:322:12:326:5 | call to [] [element :c] | provenance | | | hash_flow.rb:327:5:327:5 | b [element] | hash_flow.rb:331:10:331:10 | b [element] | provenance | | | hash_flow.rb:327:9:327:12 | hash [element :a] | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | provenance | | | hash_flow.rb:327:9:327:12 | hash [element :c] | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | provenance | | @@ -235,8 +262,10 @@ edges | hash_flow.rb:335:10:335:10 | b [element] | hash_flow.rb:335:10:335:13 | ...[...] | provenance | | | hash_flow.rb:341:5:341:8 | hash [element :a] | hash_flow.rb:346:9:346:12 | hash [element :a] | provenance | | | hash_flow.rb:341:5:341:8 | hash [element :c] | hash_flow.rb:346:9:346:12 | hash [element :c] | provenance | | -| hash_flow.rb:342:15:342:25 | call to taint | hash_flow.rb:341:5:341:8 | hash [element :a] | provenance | | -| hash_flow.rb:344:15:344:25 | call to taint | hash_flow.rb:341:5:341:8 | hash [element :c] | provenance | | +| hash_flow.rb:341:12:345:5 | call to [] [element :a] | hash_flow.rb:341:5:341:8 | hash [element :a] | provenance | | +| hash_flow.rb:341:12:345:5 | call to [] [element :c] | hash_flow.rb:341:5:341:8 | hash [element :c] | provenance | | +| hash_flow.rb:342:15:342:25 | call to taint | hash_flow.rb:341:12:345:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:344:15:344:25 | call to taint | hash_flow.rb:341:12:345:5 | call to [] [element :c] | provenance | | | hash_flow.rb:346:5:346:5 | b [element :a] | hash_flow.rb:351:11:351:11 | b [element :a] | provenance | | | hash_flow.rb:346:9:346:12 | hash [element :a] | hash_flow.rb:346:9:350:7 | call to filter [element :a] | provenance | | | hash_flow.rb:346:9:346:12 | hash [element :a] | hash_flow.rb:346:30:346:34 | value | provenance | | @@ -247,8 +276,10 @@ edges | hash_flow.rb:351:11:351:15 | ...[...] | hash_flow.rb:351:10:351:16 | ( ... ) | provenance | | | hash_flow.rb:357:5:357:8 | hash [element :a] | hash_flow.rb:362:5:362:8 | hash [element :a] | provenance | | | hash_flow.rb:357:5:357:8 | hash [element :c] | hash_flow.rb:362:5:362:8 | hash [element :c] | provenance | | -| hash_flow.rb:358:15:358:25 | call to taint | hash_flow.rb:357:5:357:8 | hash [element :a] | provenance | | -| hash_flow.rb:360:15:360:25 | call to taint | hash_flow.rb:357:5:357:8 | hash [element :c] | provenance | | +| hash_flow.rb:357:12:361:5 | call to [] [element :a] | hash_flow.rb:357:5:357:8 | hash [element :a] | provenance | | +| hash_flow.rb:357:12:361:5 | call to [] [element :c] | hash_flow.rb:357:5:357:8 | hash [element :c] | provenance | | +| hash_flow.rb:358:15:358:25 | call to taint | hash_flow.rb:357:12:361:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:360:15:360:25 | call to taint | hash_flow.rb:357:12:361:5 | call to [] [element :c] | provenance | | | hash_flow.rb:362:5:362:8 | [post] hash [element :a] | hash_flow.rb:367:11:367:14 | hash [element :a] | provenance | | | hash_flow.rb:362:5:362:8 | hash [element :a] | hash_flow.rb:362:5:362:8 | [post] hash [element :a] | provenance | | | hash_flow.rb:362:5:362:8 | hash [element :a] | hash_flow.rb:362:27:362:31 | value | provenance | | @@ -258,8 +289,10 @@ edges | hash_flow.rb:367:11:367:18 | ...[...] | hash_flow.rb:367:10:367:19 | ( ... ) | provenance | | | hash_flow.rb:373:5:373:8 | hash [element :a] | hash_flow.rb:378:9:378:12 | hash [element :a] | provenance | | | hash_flow.rb:373:5:373:8 | hash [element :c] | hash_flow.rb:378:9:378:12 | hash [element :c] | provenance | | -| hash_flow.rb:374:15:374:25 | call to taint | hash_flow.rb:373:5:373:8 | hash [element :a] | provenance | | -| hash_flow.rb:376:15:376:25 | call to taint | hash_flow.rb:373:5:373:8 | hash [element :c] | provenance | | +| hash_flow.rb:373:12:377:5 | call to [] [element :a] | hash_flow.rb:373:5:373:8 | hash [element :a] | provenance | | +| hash_flow.rb:373:12:377:5 | call to [] [element :c] | hash_flow.rb:373:5:373:8 | hash [element :c] | provenance | | +| hash_flow.rb:374:15:374:25 | call to taint | hash_flow.rb:373:12:377:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:376:15:376:25 | call to taint | hash_flow.rb:373:12:377:5 | call to [] [element :c] | provenance | | | hash_flow.rb:378:5:378:5 | b [element] | hash_flow.rb:379:11:379:11 | b [element] | provenance | | | hash_flow.rb:378:9:378:12 | hash [element :a] | hash_flow.rb:378:9:378:20 | call to flatten [element] | provenance | | | hash_flow.rb:378:9:378:12 | hash [element :c] | hash_flow.rb:378:9:378:20 | call to flatten [element] | provenance | | @@ -268,8 +301,10 @@ edges | hash_flow.rb:379:11:379:14 | ...[...] | hash_flow.rb:379:10:379:15 | ( ... ) | provenance | | | hash_flow.rb:385:5:385:8 | hash [element :a] | hash_flow.rb:390:9:390:12 | hash [element :a] | provenance | | | hash_flow.rb:385:5:385:8 | hash [element :c] | hash_flow.rb:390:9:390:12 | hash [element :c] | provenance | | -| hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:385:5:385:8 | hash [element :a] | provenance | | -| hash_flow.rb:388:15:388:25 | call to taint | hash_flow.rb:385:5:385:8 | hash [element :c] | provenance | | +| hash_flow.rb:385:12:389:5 | call to [] [element :a] | hash_flow.rb:385:5:385:8 | hash [element :a] | provenance | | +| hash_flow.rb:385:12:389:5 | call to [] [element :c] | hash_flow.rb:385:5:385:8 | hash [element :c] | provenance | | +| hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:385:12:389:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:388:15:388:25 | call to taint | hash_flow.rb:385:12:389:5 | call to [] [element :c] | provenance | | | hash_flow.rb:390:5:390:5 | b [element :a] | hash_flow.rb:396:11:396:11 | b [element :a] | provenance | | | hash_flow.rb:390:9:390:12 | [post] hash [element :a] | hash_flow.rb:395:11:395:14 | hash [element :a] | provenance | | | hash_flow.rb:390:9:390:12 | hash [element :a] | hash_flow.rb:390:9:390:12 | [post] hash [element :a] | provenance | | @@ -284,12 +319,16 @@ edges | hash_flow.rb:396:11:396:15 | ...[...] | hash_flow.rb:396:10:396:16 | ( ... ) | provenance | | | hash_flow.rb:402:5:402:9 | hash1 [element :a] | hash_flow.rb:412:12:412:16 | hash1 [element :a] | provenance | | | hash_flow.rb:402:5:402:9 | hash1 [element :c] | hash_flow.rb:412:12:412:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:402:5:402:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:402:5:402:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:402:13:406:5 | call to [] [element :a] | hash_flow.rb:402:5:402:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:402:13:406:5 | call to [] [element :c] | hash_flow.rb:402:5:402:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:402:13:406:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:402:13:406:5 | call to [] [element :c] | provenance | | | hash_flow.rb:407:5:407:9 | hash2 [element :d] | hash_flow.rb:412:24:412:28 | hash2 [element :d] | provenance | | | hash_flow.rb:407:5:407:9 | hash2 [element :f] | hash_flow.rb:412:24:412:28 | hash2 [element :f] | provenance | | -| hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:407:5:407:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:407:5:407:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:407:13:411:5 | call to [] [element :d] | hash_flow.rb:407:5:407:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:407:13:411:5 | call to [] [element :f] | hash_flow.rb:407:5:407:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:407:13:411:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:407:13:411:5 | call to [] [element :f] | provenance | | | hash_flow.rb:412:5:412:8 | hash [element :a] | hash_flow.rb:417:11:417:14 | hash [element :a] | provenance | | | hash_flow.rb:412:5:412:8 | hash [element :c] | hash_flow.rb:419:11:419:14 | hash [element :c] | provenance | | | hash_flow.rb:412:5:412:8 | hash [element :d] | hash_flow.rb:420:11:420:14 | hash [element :d] | provenance | | @@ -322,12 +361,16 @@ edges | hash_flow.rb:422:11:422:18 | ...[...] | hash_flow.rb:422:10:422:19 | ( ... ) | provenance | | | hash_flow.rb:428:5:428:9 | hash1 [element :a] | hash_flow.rb:438:12:438:16 | hash1 [element :a] | provenance | | | hash_flow.rb:428:5:428:9 | hash1 [element :c] | hash_flow.rb:438:12:438:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:428:5:428:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:428:5:428:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:428:13:432:5 | call to [] [element :a] | hash_flow.rb:428:5:428:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:428:13:432:5 | call to [] [element :c] | hash_flow.rb:428:5:428:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:428:13:432:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:428:13:432:5 | call to [] [element :c] | provenance | | | hash_flow.rb:433:5:433:9 | hash2 [element :d] | hash_flow.rb:438:25:438:29 | hash2 [element :d] | provenance | | | hash_flow.rb:433:5:433:9 | hash2 [element :f] | hash_flow.rb:438:25:438:29 | hash2 [element :f] | provenance | | -| hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:433:5:433:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:433:5:433:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:433:13:437:5 | call to [] [element :d] | hash_flow.rb:433:5:433:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:433:13:437:5 | call to [] [element :f] | hash_flow.rb:433:5:433:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:433:13:437:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:433:13:437:5 | call to [] [element :f] | provenance | | | hash_flow.rb:438:5:438:8 | hash [element :a] | hash_flow.rb:443:11:443:14 | hash [element :a] | provenance | | | hash_flow.rb:438:5:438:8 | hash [element :c] | hash_flow.rb:445:11:445:14 | hash [element :c] | provenance | | | hash_flow.rb:438:5:438:8 | hash [element :d] | hash_flow.rb:446:11:446:14 | hash [element :d] | provenance | | @@ -375,13 +418,15 @@ edges | hash_flow.rb:455:11:455:15 | hash1 [element :f] | hash_flow.rb:455:11:455:19 | ...[...] | provenance | | | hash_flow.rb:455:11:455:19 | ...[...] | hash_flow.rb:455:10:455:20 | ( ... ) | provenance | | | hash_flow.rb:461:5:461:8 | hash [element :a] | hash_flow.rb:465:9:465:12 | hash [element :a] | provenance | | -| hash_flow.rb:462:15:462:25 | call to taint | hash_flow.rb:461:5:461:8 | hash [element :a] | provenance | | +| hash_flow.rb:461:12:464:5 | call to [] [element :a] | hash_flow.rb:461:5:461:8 | hash [element :a] | provenance | | +| hash_flow.rb:462:15:462:25 | call to taint | hash_flow.rb:461:12:464:5 | call to [] [element :a] | provenance | | | hash_flow.rb:465:5:465:5 | b [element 1] | hash_flow.rb:467:10:467:10 | b [element 1] | provenance | | | hash_flow.rb:465:9:465:12 | hash [element :a] | hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | provenance | | | hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | hash_flow.rb:465:5:465:5 | b [element 1] | provenance | | | hash_flow.rb:467:10:467:10 | b [element 1] | hash_flow.rb:467:10:467:13 | ...[...] | provenance | | | hash_flow.rb:473:5:473:8 | hash [element :a] | hash_flow.rb:477:9:477:12 | hash [element :a] | provenance | | -| hash_flow.rb:474:15:474:25 | call to taint | hash_flow.rb:473:5:473:8 | hash [element :a] | provenance | | +| hash_flow.rb:473:12:476:5 | call to [] [element :a] | hash_flow.rb:473:5:473:8 | hash [element :a] | provenance | | +| hash_flow.rb:474:15:474:25 | call to taint | hash_flow.rb:473:12:476:5 | call to [] [element :a] | provenance | | | hash_flow.rb:477:5:477:5 | b [element :a] | hash_flow.rb:482:10:482:10 | b [element :a] | provenance | | | hash_flow.rb:477:9:477:12 | hash [element :a] | hash_flow.rb:477:9:481:7 | call to reject [element :a] | provenance | | | hash_flow.rb:477:9:477:12 | hash [element :a] | hash_flow.rb:477:29:477:33 | value | provenance | | @@ -389,7 +434,8 @@ edges | hash_flow.rb:477:29:477:33 | value | hash_flow.rb:479:14:479:18 | value | provenance | | | hash_flow.rb:482:10:482:10 | b [element :a] | hash_flow.rb:482:10:482:14 | ...[...] | provenance | | | hash_flow.rb:488:5:488:8 | hash [element :a] | hash_flow.rb:492:9:492:12 | hash [element :a] | provenance | | -| hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:488:5:488:8 | hash [element :a] | provenance | | +| hash_flow.rb:488:12:491:5 | call to [] [element :a] | hash_flow.rb:488:5:488:8 | hash [element :a] | provenance | | +| hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:488:12:491:5 | call to [] [element :a] | provenance | | | hash_flow.rb:492:5:492:5 | b [element :a] | hash_flow.rb:497:10:497:10 | b [element :a] | provenance | | | hash_flow.rb:492:9:492:12 | [post] hash [element :a] | hash_flow.rb:498:10:498:13 | hash [element :a] | provenance | | | hash_flow.rb:492:9:492:12 | hash [element :a] | hash_flow.rb:492:9:492:12 | [post] hash [element :a] | provenance | | @@ -401,8 +447,10 @@ edges | hash_flow.rb:498:10:498:13 | hash [element :a] | hash_flow.rb:498:10:498:17 | ...[...] | provenance | | | hash_flow.rb:504:5:504:8 | hash [element :a] | hash_flow.rb:512:19:512:22 | hash [element :a] | provenance | | | hash_flow.rb:504:5:504:8 | hash [element :c] | hash_flow.rb:512:19:512:22 | hash [element :c] | provenance | | -| hash_flow.rb:505:15:505:25 | call to taint | hash_flow.rb:504:5:504:8 | hash [element :a] | provenance | | -| hash_flow.rb:507:15:507:25 | call to taint | hash_flow.rb:504:5:504:8 | hash [element :c] | provenance | | +| hash_flow.rb:504:12:508:5 | call to [] [element :a] | hash_flow.rb:504:5:504:8 | hash [element :a] | provenance | | +| hash_flow.rb:504:12:508:5 | call to [] [element :c] | hash_flow.rb:504:5:504:8 | hash [element :c] | provenance | | +| hash_flow.rb:505:15:505:25 | call to taint | hash_flow.rb:504:12:508:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:507:15:507:25 | call to taint | hash_flow.rb:504:12:508:5 | call to [] [element :c] | provenance | | | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | hash_flow.rb:513:11:513:15 | hash2 [element :a] | provenance | | | hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] | hash_flow.rb:515:11:515:15 | hash2 [element :c] | provenance | | | hash_flow.rb:512:19:512:22 | hash [element :a] | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | provenance | | @@ -413,8 +461,10 @@ edges | hash_flow.rb:515:11:515:19 | ...[...] | hash_flow.rb:515:10:515:20 | ( ... ) | provenance | | | hash_flow.rb:519:5:519:8 | hash [element :a] | hash_flow.rb:524:9:524:12 | hash [element :a] | provenance | | | hash_flow.rb:519:5:519:8 | hash [element :c] | hash_flow.rb:524:9:524:12 | hash [element :c] | provenance | | -| hash_flow.rb:520:15:520:25 | call to taint | hash_flow.rb:519:5:519:8 | hash [element :a] | provenance | | -| hash_flow.rb:522:15:522:25 | call to taint | hash_flow.rb:519:5:519:8 | hash [element :c] | provenance | | +| hash_flow.rb:519:12:523:5 | call to [] [element :a] | hash_flow.rb:519:5:519:8 | hash [element :a] | provenance | | +| hash_flow.rb:519:12:523:5 | call to [] [element :c] | hash_flow.rb:519:5:519:8 | hash [element :c] | provenance | | +| hash_flow.rb:520:15:520:25 | call to taint | hash_flow.rb:519:12:523:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:522:15:522:25 | call to taint | hash_flow.rb:519:12:523:5 | call to [] [element :c] | provenance | | | hash_flow.rb:524:5:524:5 | b [element :a] | hash_flow.rb:529:11:529:11 | b [element :a] | provenance | | | hash_flow.rb:524:9:524:12 | hash [element :a] | hash_flow.rb:524:9:528:7 | call to select [element :a] | provenance | | | hash_flow.rb:524:9:524:12 | hash [element :a] | hash_flow.rb:524:30:524:34 | value | provenance | | @@ -425,8 +475,10 @@ edges | hash_flow.rb:529:11:529:15 | ...[...] | hash_flow.rb:529:10:529:16 | ( ... ) | provenance | | | hash_flow.rb:535:5:535:8 | hash [element :a] | hash_flow.rb:540:5:540:8 | hash [element :a] | provenance | | | hash_flow.rb:535:5:535:8 | hash [element :c] | hash_flow.rb:540:5:540:8 | hash [element :c] | provenance | | -| hash_flow.rb:536:15:536:25 | call to taint | hash_flow.rb:535:5:535:8 | hash [element :a] | provenance | | -| hash_flow.rb:538:15:538:25 | call to taint | hash_flow.rb:535:5:535:8 | hash [element :c] | provenance | | +| hash_flow.rb:535:12:539:5 | call to [] [element :a] | hash_flow.rb:535:5:535:8 | hash [element :a] | provenance | | +| hash_flow.rb:535:12:539:5 | call to [] [element :c] | hash_flow.rb:535:5:535:8 | hash [element :c] | provenance | | +| hash_flow.rb:536:15:536:25 | call to taint | hash_flow.rb:535:12:539:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:538:15:538:25 | call to taint | hash_flow.rb:535:12:539:5 | call to [] [element :c] | provenance | | | hash_flow.rb:540:5:540:8 | [post] hash [element :a] | hash_flow.rb:545:11:545:14 | hash [element :a] | provenance | | | hash_flow.rb:540:5:540:8 | hash [element :a] | hash_flow.rb:540:5:540:8 | [post] hash [element :a] | provenance | | | hash_flow.rb:540:5:540:8 | hash [element :a] | hash_flow.rb:540:27:540:31 | value | provenance | | @@ -436,8 +488,10 @@ edges | hash_flow.rb:545:11:545:18 | ...[...] | hash_flow.rb:545:10:545:19 | ( ... ) | provenance | | | hash_flow.rb:551:5:551:8 | hash [element :a] | hash_flow.rb:556:9:556:12 | hash [element :a] | provenance | | | hash_flow.rb:551:5:551:8 | hash [element :c] | hash_flow.rb:556:9:556:12 | hash [element :c] | provenance | | -| hash_flow.rb:552:15:552:25 | call to taint | hash_flow.rb:551:5:551:8 | hash [element :a] | provenance | | -| hash_flow.rb:554:15:554:25 | call to taint | hash_flow.rb:551:5:551:8 | hash [element :c] | provenance | | +| hash_flow.rb:551:12:555:5 | call to [] [element :a] | hash_flow.rb:551:5:551:8 | hash [element :a] | provenance | | +| hash_flow.rb:551:12:555:5 | call to [] [element :c] | hash_flow.rb:551:5:551:8 | hash [element :c] | provenance | | +| hash_flow.rb:552:15:552:25 | call to taint | hash_flow.rb:551:12:555:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:554:15:554:25 | call to taint | hash_flow.rb:551:12:555:5 | call to [] [element :c] | provenance | | | hash_flow.rb:556:5:556:5 | b [element 1] | hash_flow.rb:559:11:559:11 | b [element 1] | provenance | | | hash_flow.rb:556:9:556:12 | [post] hash [element :a] | hash_flow.rb:557:11:557:14 | hash [element :a] | provenance | | | hash_flow.rb:556:9:556:12 | hash [element :a] | hash_flow.rb:556:9:556:12 | [post] hash [element :a] | provenance | | @@ -451,8 +505,10 @@ edges | hash_flow.rb:565:5:565:8 | hash [element :a] | hash_flow.rb:570:9:570:12 | hash [element :a] | provenance | | | hash_flow.rb:565:5:565:8 | hash [element :a] | hash_flow.rb:575:9:575:12 | hash [element :a] | provenance | | | hash_flow.rb:565:5:565:8 | hash [element :c] | hash_flow.rb:575:9:575:12 | hash [element :c] | provenance | | -| hash_flow.rb:566:15:566:25 | call to taint | hash_flow.rb:565:5:565:8 | hash [element :a] | provenance | | -| hash_flow.rb:568:15:568:25 | call to taint | hash_flow.rb:565:5:565:8 | hash [element :c] | provenance | | +| hash_flow.rb:565:12:569:5 | call to [] [element :a] | hash_flow.rb:565:5:565:8 | hash [element :a] | provenance | | +| hash_flow.rb:565:12:569:5 | call to [] [element :c] | hash_flow.rb:565:5:565:8 | hash [element :c] | provenance | | +| hash_flow.rb:566:15:566:25 | call to taint | hash_flow.rb:565:12:569:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:568:15:568:25 | call to taint | hash_flow.rb:565:12:569:5 | call to [] [element :c] | provenance | | | hash_flow.rb:570:5:570:5 | b [element :a] | hash_flow.rb:571:11:571:11 | b [element :a] | provenance | | | hash_flow.rb:570:9:570:12 | hash [element :a] | hash_flow.rb:570:9:570:26 | call to slice [element :a] | provenance | | | hash_flow.rb:570:9:570:26 | call to slice [element :a] | hash_flow.rb:570:5:570:5 | b [element :a] | provenance | | @@ -470,8 +526,10 @@ edges | hash_flow.rb:578:11:578:15 | ...[...] | hash_flow.rb:578:10:578:16 | ( ... ) | provenance | | | hash_flow.rb:584:5:584:8 | hash [element :a] | hash_flow.rb:589:9:589:12 | hash [element :a] | provenance | | | hash_flow.rb:584:5:584:8 | hash [element :c] | hash_flow.rb:589:9:589:12 | hash [element :c] | provenance | | -| hash_flow.rb:585:15:585:25 | call to taint | hash_flow.rb:584:5:584:8 | hash [element :a] | provenance | | -| hash_flow.rb:587:15:587:25 | call to taint | hash_flow.rb:584:5:584:8 | hash [element :c] | provenance | | +| hash_flow.rb:584:12:588:5 | call to [] [element :a] | hash_flow.rb:584:5:584:8 | hash [element :a] | provenance | | +| hash_flow.rb:584:12:588:5 | call to [] [element :c] | hash_flow.rb:584:5:584:8 | hash [element :c] | provenance | | +| hash_flow.rb:585:15:585:25 | call to taint | hash_flow.rb:584:12:588:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:587:15:587:25 | call to taint | hash_flow.rb:584:12:588:5 | call to [] [element :c] | provenance | | | hash_flow.rb:589:5:589:5 | a [element, element 1] | hash_flow.rb:591:11:591:11 | a [element, element 1] | provenance | | | hash_flow.rb:589:9:589:12 | hash [element :a] | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | provenance | | | hash_flow.rb:589:9:589:12 | hash [element :c] | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | provenance | | @@ -483,8 +541,10 @@ edges | hash_flow.rb:597:5:597:8 | hash [element :a] | hash_flow.rb:607:9:607:12 | hash [element :a] | provenance | | | hash_flow.rb:597:5:597:8 | hash [element :c] | hash_flow.rb:602:9:602:12 | hash [element :c] | provenance | | | hash_flow.rb:597:5:597:8 | hash [element :c] | hash_flow.rb:607:9:607:12 | hash [element :c] | provenance | | -| hash_flow.rb:598:15:598:25 | call to taint | hash_flow.rb:597:5:597:8 | hash [element :a] | provenance | | -| hash_flow.rb:600:15:600:25 | call to taint | hash_flow.rb:597:5:597:8 | hash [element :c] | provenance | | +| hash_flow.rb:597:12:601:5 | call to [] [element :a] | hash_flow.rb:597:5:597:8 | hash [element :a] | provenance | | +| hash_flow.rb:597:12:601:5 | call to [] [element :c] | hash_flow.rb:597:5:597:8 | hash [element :c] | provenance | | +| hash_flow.rb:598:15:598:25 | call to taint | hash_flow.rb:597:12:601:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:600:15:600:25 | call to taint | hash_flow.rb:597:12:601:5 | call to [] [element :c] | provenance | | | hash_flow.rb:602:5:602:5 | a [element :a] | hash_flow.rb:603:11:603:11 | a [element :a] | provenance | | | hash_flow.rb:602:5:602:5 | a [element :c] | hash_flow.rb:605:11:605:11 | a [element :c] | provenance | | | hash_flow.rb:602:9:602:12 | hash [element :a] | hash_flow.rb:602:9:602:17 | call to to_h [element :a] | provenance | | @@ -500,13 +560,16 @@ edges | hash_flow.rb:607:9:607:12 | hash [element :c] | hash_flow.rb:607:28:607:32 | value | provenance | | | hash_flow.rb:607:9:611:7 | call to to_h [element] | hash_flow.rb:607:5:607:5 | b [element] | provenance | | | hash_flow.rb:607:28:607:32 | value | hash_flow.rb:609:14:609:18 | value | provenance | | -| hash_flow.rb:610:14:610:24 | call to taint | hash_flow.rb:607:9:611:7 | call to to_h [element] | provenance | | +| hash_flow.rb:610:9:610:25 | call to [] [element 1] | hash_flow.rb:607:9:611:7 | call to to_h [element] | provenance | | +| hash_flow.rb:610:14:610:24 | call to taint | hash_flow.rb:610:9:610:25 | call to [] [element 1] | provenance | | | hash_flow.rb:612:11:612:11 | b [element] | hash_flow.rb:612:11:612:15 | ...[...] | provenance | | | hash_flow.rb:612:11:612:15 | ...[...] | hash_flow.rb:612:10:612:16 | ( ... ) | provenance | | | hash_flow.rb:618:5:618:8 | hash [element :a] | hash_flow.rb:623:9:623:12 | hash [element :a] | provenance | | | hash_flow.rb:618:5:618:8 | hash [element :c] | hash_flow.rb:623:9:623:12 | hash [element :c] | provenance | | -| hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:618:5:618:8 | hash [element :a] | provenance | | -| hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:618:5:618:8 | hash [element :c] | provenance | | +| hash_flow.rb:618:12:622:5 | call to [] [element :a] | hash_flow.rb:618:5:618:8 | hash [element :a] | provenance | | +| hash_flow.rb:618:12:622:5 | call to [] [element :c] | hash_flow.rb:618:5:618:8 | hash [element :c] | provenance | | +| hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:618:12:622:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:618:12:622:5 | call to [] [element :c] | provenance | | | hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:624:11:624:11 | a [element] | provenance | | | hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:625:11:625:11 | a [element] | provenance | | | hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:626:11:626:11 | a [element] | provenance | | @@ -521,8 +584,10 @@ edges | hash_flow.rb:626:11:626:16 | ...[...] | hash_flow.rb:626:10:626:17 | ( ... ) | provenance | | | hash_flow.rb:632:5:632:8 | hash [element :a] | hash_flow.rb:639:5:639:8 | hash [element :a] | provenance | | | hash_flow.rb:632:5:632:8 | hash [element :c] | hash_flow.rb:639:5:639:8 | hash [element :c] | provenance | | -| hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:632:5:632:8 | hash [element :a] | provenance | | -| hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:632:5:632:8 | hash [element :c] | provenance | | +| hash_flow.rb:632:12:636:5 | call to [] [element :a] | hash_flow.rb:632:5:632:8 | hash [element :a] | provenance | | +| hash_flow.rb:632:12:636:5 | call to [] [element :c] | hash_flow.rb:632:5:632:8 | hash [element :c] | provenance | | +| hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:632:12:636:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:632:12:636:5 | call to [] [element :c] | provenance | | | hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:639:5:639:8 | hash [element] | provenance | | | hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:640:11:640:14 | hash [element] | provenance | | | hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:641:11:641:14 | hash [element] | provenance | | @@ -543,8 +608,10 @@ edges | hash_flow.rb:648:5:648:8 | hash [element :a] | hash_flow.rb:653:9:653:12 | hash [element :a] | provenance | | | hash_flow.rb:648:5:648:8 | hash [element :a] | hash_flow.rb:657:11:657:14 | hash [element :a] | provenance | | | hash_flow.rb:648:5:648:8 | hash [element :c] | hash_flow.rb:653:9:653:12 | hash [element :c] | provenance | | -| hash_flow.rb:649:15:649:25 | call to taint | hash_flow.rb:648:5:648:8 | hash [element :a] | provenance | | -| hash_flow.rb:651:15:651:25 | call to taint | hash_flow.rb:648:5:648:8 | hash [element :c] | provenance | | +| hash_flow.rb:648:12:652:5 | call to [] [element :a] | hash_flow.rb:648:5:648:8 | hash [element :a] | provenance | | +| hash_flow.rb:648:12:652:5 | call to [] [element :c] | hash_flow.rb:648:5:648:8 | hash [element :c] | provenance | | +| hash_flow.rb:649:15:649:25 | call to taint | hash_flow.rb:648:12:652:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:651:15:651:25 | call to taint | hash_flow.rb:648:12:652:5 | call to [] [element :c] | provenance | | | hash_flow.rb:653:5:653:5 | b [element] | hash_flow.rb:658:11:658:11 | b [element] | provenance | | | hash_flow.rb:653:9:653:12 | hash [element :a] | hash_flow.rb:653:35:653:39 | value | provenance | | | hash_flow.rb:653:9:653:12 | hash [element :c] | hash_flow.rb:653:35:653:39 | value | provenance | | @@ -557,8 +624,10 @@ edges | hash_flow.rb:658:11:658:15 | ...[...] | hash_flow.rb:658:10:658:16 | ( ... ) | provenance | | | hash_flow.rb:664:5:664:8 | hash [element :a] | hash_flow.rb:669:5:669:8 | hash [element :a] | provenance | | | hash_flow.rb:664:5:664:8 | hash [element :c] | hash_flow.rb:669:5:669:8 | hash [element :c] | provenance | | -| hash_flow.rb:665:15:665:25 | call to taint | hash_flow.rb:664:5:664:8 | hash [element :a] | provenance | | -| hash_flow.rb:667:15:667:25 | call to taint | hash_flow.rb:664:5:664:8 | hash [element :c] | provenance | | +| hash_flow.rb:664:12:668:5 | call to [] [element :a] | hash_flow.rb:664:5:664:8 | hash [element :a] | provenance | | +| hash_flow.rb:664:12:668:5 | call to [] [element :c] | hash_flow.rb:664:5:664:8 | hash [element :c] | provenance | | +| hash_flow.rb:665:15:665:25 | call to taint | hash_flow.rb:664:12:668:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:667:15:667:25 | call to taint | hash_flow.rb:664:12:668:5 | call to [] [element :c] | provenance | | | hash_flow.rb:669:5:669:8 | [post] hash [element] | hash_flow.rb:673:11:673:14 | hash [element] | provenance | | | hash_flow.rb:669:5:669:8 | hash [element :a] | hash_flow.rb:669:32:669:36 | value | provenance | | | hash_flow.rb:669:5:669:8 | hash [element :c] | hash_flow.rb:669:32:669:36 | value | provenance | | @@ -568,12 +637,16 @@ edges | hash_flow.rb:673:11:673:18 | ...[...] | hash_flow.rb:673:10:673:19 | ( ... ) | provenance | | | hash_flow.rb:679:5:679:9 | hash1 [element :a] | hash_flow.rb:689:12:689:16 | hash1 [element :a] | provenance | | | hash_flow.rb:679:5:679:9 | hash1 [element :c] | hash_flow.rb:689:12:689:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:679:5:679:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:679:5:679:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:679:13:683:5 | call to [] [element :a] | hash_flow.rb:679:5:679:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:679:13:683:5 | call to [] [element :c] | hash_flow.rb:679:5:679:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:679:13:683:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:679:13:683:5 | call to [] [element :c] | provenance | | | hash_flow.rb:684:5:684:9 | hash2 [element :d] | hash_flow.rb:689:25:689:29 | hash2 [element :d] | provenance | | | hash_flow.rb:684:5:684:9 | hash2 [element :f] | hash_flow.rb:689:25:689:29 | hash2 [element :f] | provenance | | -| hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:684:5:684:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:684:5:684:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:684:13:688:5 | call to [] [element :d] | hash_flow.rb:684:5:684:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:684:13:688:5 | call to [] [element :f] | hash_flow.rb:684:5:684:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:684:13:688:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:684:13:688:5 | call to [] [element :f] | provenance | | | hash_flow.rb:689:5:689:8 | hash [element :a] | hash_flow.rb:694:11:694:14 | hash [element :a] | provenance | | | hash_flow.rb:689:5:689:8 | hash [element :c] | hash_flow.rb:696:11:696:14 | hash [element :c] | provenance | | | hash_flow.rb:689:5:689:8 | hash [element :d] | hash_flow.rb:697:11:697:14 | hash [element :d] | provenance | | @@ -622,8 +695,10 @@ edges | hash_flow.rb:706:11:706:19 | ...[...] | hash_flow.rb:706:10:706:20 | ( ... ) | provenance | | | hash_flow.rb:712:5:712:8 | hash [element :a] | hash_flow.rb:717:9:717:12 | hash [element :a] | provenance | | | hash_flow.rb:712:5:712:8 | hash [element :c] | hash_flow.rb:717:9:717:12 | hash [element :c] | provenance | | -| hash_flow.rb:713:15:713:25 | call to taint | hash_flow.rb:712:5:712:8 | hash [element :a] | provenance | | -| hash_flow.rb:715:15:715:25 | call to taint | hash_flow.rb:712:5:712:8 | hash [element :c] | provenance | | +| hash_flow.rb:712:12:716:5 | call to [] [element :a] | hash_flow.rb:712:5:712:8 | hash [element :a] | provenance | | +| hash_flow.rb:712:12:716:5 | call to [] [element :c] | hash_flow.rb:712:5:712:8 | hash [element :c] | provenance | | +| hash_flow.rb:713:15:713:25 | call to taint | hash_flow.rb:712:12:716:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:715:15:715:25 | call to taint | hash_flow.rb:712:12:716:5 | call to [] [element :c] | provenance | | | hash_flow.rb:717:5:717:5 | a [element] | hash_flow.rb:718:11:718:11 | a [element] | provenance | | | hash_flow.rb:717:9:717:12 | hash [element :a] | hash_flow.rb:717:9:717:19 | call to values [element] | provenance | | | hash_flow.rb:717:9:717:12 | hash [element :c] | hash_flow.rb:717:9:717:19 | call to values [element] | provenance | | @@ -633,8 +708,10 @@ edges | hash_flow.rb:724:5:724:8 | hash [element :a] | hash_flow.rb:729:9:729:12 | hash [element :a] | provenance | | | hash_flow.rb:724:5:724:8 | hash [element :a] | hash_flow.rb:731:9:731:12 | hash [element :a] | provenance | | | hash_flow.rb:724:5:724:8 | hash [element :c] | hash_flow.rb:731:9:731:12 | hash [element :c] | provenance | | -| hash_flow.rb:725:15:725:25 | call to taint | hash_flow.rb:724:5:724:8 | hash [element :a] | provenance | | -| hash_flow.rb:727:15:727:25 | call to taint | hash_flow.rb:724:5:724:8 | hash [element :c] | provenance | | +| hash_flow.rb:724:12:728:5 | call to [] [element :a] | hash_flow.rb:724:5:724:8 | hash [element :a] | provenance | | +| hash_flow.rb:724:12:728:5 | call to [] [element :c] | hash_flow.rb:724:5:724:8 | hash [element :c] | provenance | | +| hash_flow.rb:725:15:725:25 | call to taint | hash_flow.rb:724:12:728:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:727:15:727:25 | call to taint | hash_flow.rb:724:12:728:5 | call to [] [element :c] | provenance | | | hash_flow.rb:729:5:729:5 | b [element 0] | hash_flow.rb:730:10:730:10 | b [element 0] | provenance | | | hash_flow.rb:729:9:729:12 | hash [element :a] | hash_flow.rb:729:9:729:26 | call to values_at [element 0] | provenance | | | hash_flow.rb:729:9:729:26 | call to values_at [element 0] | hash_flow.rb:729:5:729:5 | b [element 0] | provenance | | @@ -646,24 +723,33 @@ edges | hash_flow.rb:732:10:732:10 | b [element] | hash_flow.rb:732:10:732:13 | ...[...] | provenance | | | hash_flow.rb:738:5:738:9 | hash1 [element :a] | hash_flow.rb:748:16:748:20 | hash1 [element :a] | provenance | | | hash_flow.rb:738:5:738:9 | hash1 [element :c] | hash_flow.rb:748:16:748:20 | hash1 [element :c] | provenance | | -| hash_flow.rb:739:15:739:25 | call to taint | hash_flow.rb:738:5:738:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:741:15:741:25 | call to taint | hash_flow.rb:738:5:738:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:738:13:742:5 | call to [] [element :a] | hash_flow.rb:738:5:738:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:738:13:742:5 | call to [] [element :c] | hash_flow.rb:738:5:738:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:739:15:739:25 | call to taint | hash_flow.rb:738:13:742:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:741:15:741:25 | call to taint | hash_flow.rb:738:13:742:5 | call to [] [element :c] | provenance | | | hash_flow.rb:743:5:743:9 | hash2 [element :d] | hash_flow.rb:748:44:748:48 | hash2 [element :d] | provenance | | | hash_flow.rb:743:5:743:9 | hash2 [element :f] | hash_flow.rb:748:44:748:48 | hash2 [element :f] | provenance | | -| hash_flow.rb:744:15:744:25 | call to taint | hash_flow.rb:743:5:743:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:746:15:746:25 | call to taint | hash_flow.rb:743:5:743:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:743:13:747:5 | call to [] [element :d] | hash_flow.rb:743:5:743:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:743:13:747:5 | call to [] [element :f] | hash_flow.rb:743:5:743:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:744:15:744:25 | call to taint | hash_flow.rb:743:13:747:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:746:15:746:25 | call to taint | hash_flow.rb:743:13:747:5 | call to [] [element :f] | provenance | | | hash_flow.rb:748:5:748:8 | hash [element :a] | hash_flow.rb:749:10:749:13 | hash [element :a] | provenance | | | hash_flow.rb:748:5:748:8 | hash [element :c] | hash_flow.rb:751:10:751:13 | hash [element :c] | provenance | | | hash_flow.rb:748:5:748:8 | hash [element :d] | hash_flow.rb:752:10:752:13 | hash [element :d] | provenance | | | hash_flow.rb:748:5:748:8 | hash [element :f] | hash_flow.rb:754:10:754:13 | hash [element :f] | provenance | | | hash_flow.rb:748:5:748:8 | hash [element :g] | hash_flow.rb:755:10:755:13 | hash [element :g] | provenance | | -| hash_flow.rb:748:14:748:20 | ** ... [element :a] | hash_flow.rb:748:5:748:8 | hash [element :a] | provenance | | -| hash_flow.rb:748:14:748:20 | ** ... [element :c] | hash_flow.rb:748:5:748:8 | hash [element :c] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] [element :a] | hash_flow.rb:748:5:748:8 | hash [element :a] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] [element :c] | hash_flow.rb:748:5:748:8 | hash [element :c] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] [element :d] | hash_flow.rb:748:5:748:8 | hash [element :d] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] [element :f] | hash_flow.rb:748:5:748:8 | hash [element :f] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] [element :g] | hash_flow.rb:748:5:748:8 | hash [element :g] | provenance | | +| hash_flow.rb:748:14:748:20 | ** ... [element :a] | hash_flow.rb:748:12:748:59 | call to [] [element :a] | provenance | | +| hash_flow.rb:748:14:748:20 | ** ... [element :c] | hash_flow.rb:748:12:748:59 | call to [] [element :c] | provenance | | | hash_flow.rb:748:16:748:20 | hash1 [element :a] | hash_flow.rb:748:14:748:20 | ** ... [element :a] | provenance | | | hash_flow.rb:748:16:748:20 | hash1 [element :c] | hash_flow.rb:748:14:748:20 | ** ... [element :c] | provenance | | -| hash_flow.rb:748:29:748:39 | call to taint | hash_flow.rb:748:5:748:8 | hash [element :g] | provenance | | -| hash_flow.rb:748:42:748:48 | ** ... [element :d] | hash_flow.rb:748:5:748:8 | hash [element :d] | provenance | | -| hash_flow.rb:748:42:748:48 | ** ... [element :f] | hash_flow.rb:748:5:748:8 | hash [element :f] | provenance | | +| hash_flow.rb:748:29:748:39 | call to taint | hash_flow.rb:748:12:748:59 | call to [] [element :g] | provenance | | +| hash_flow.rb:748:42:748:48 | ** ... [element :d] | hash_flow.rb:748:12:748:59 | call to [] [element :d] | provenance | | +| hash_flow.rb:748:42:748:48 | ** ... [element :f] | hash_flow.rb:748:12:748:59 | call to [] [element :f] | provenance | | | hash_flow.rb:748:44:748:48 | hash2 [element :d] | hash_flow.rb:748:42:748:48 | ** ... [element :d] | provenance | | | hash_flow.rb:748:44:748:48 | hash2 [element :f] | hash_flow.rb:748:42:748:48 | ** ... [element :f] | provenance | | | hash_flow.rb:749:10:749:13 | hash [element :a] | hash_flow.rb:749:10:749:17 | ...[...] | provenance | | @@ -675,9 +761,12 @@ edges | hash_flow.rb:762:5:762:8 | hash [element :c] | hash_flow.rb:771:10:771:13 | hash [element :c] | provenance | | | hash_flow.rb:762:5:762:8 | hash [element :c] | hash_flow.rb:774:9:774:12 | hash [element :c] | provenance | | | hash_flow.rb:762:5:762:8 | hash [element :d] | hash_flow.rb:772:10:772:13 | hash [element :d] | provenance | | -| hash_flow.rb:763:15:763:25 | call to taint | hash_flow.rb:762:5:762:8 | hash [element :a] | provenance | | -| hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:762:5:762:8 | hash [element :c] | provenance | | -| hash_flow.rb:766:15:766:25 | call to taint | hash_flow.rb:762:5:762:8 | hash [element :d] | provenance | | +| hash_flow.rb:762:12:767:5 | call to [] [element :a] | hash_flow.rb:762:5:762:8 | hash [element :a] | provenance | | +| hash_flow.rb:762:12:767:5 | call to [] [element :c] | hash_flow.rb:762:5:762:8 | hash [element :c] | provenance | | +| hash_flow.rb:762:12:767:5 | call to [] [element :d] | hash_flow.rb:762:5:762:8 | hash [element :d] | provenance | | +| hash_flow.rb:763:15:763:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] [element :c] | provenance | | +| hash_flow.rb:766:15:766:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] [element :d] | provenance | | | hash_flow.rb:769:10:769:13 | hash [element :a] | hash_flow.rb:769:10:769:17 | ...[...] | provenance | | | hash_flow.rb:771:10:771:13 | hash [element :c] | hash_flow.rb:771:10:771:17 | ...[...] | provenance | | | hash_flow.rb:772:10:772:13 | hash [element :d] | hash_flow.rb:772:10:772:17 | ...[...] | provenance | | @@ -690,12 +779,16 @@ edges | hash_flow.rb:783:10:783:13 | hash [element :c] | hash_flow.rb:783:10:783:17 | ...[...] | provenance | | | hash_flow.rb:790:5:790:9 | hash1 [element :a] | hash_flow.rb:800:12:800:16 | hash1 [element :a] | provenance | | | hash_flow.rb:790:5:790:9 | hash1 [element :c] | hash_flow.rb:800:12:800:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:790:5:790:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:790:5:790:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:790:13:794:5 | call to [] [element :a] | hash_flow.rb:790:5:790:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:790:13:794:5 | call to [] [element :c] | hash_flow.rb:790:5:790:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:790:13:794:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:790:13:794:5 | call to [] [element :c] | provenance | | | hash_flow.rb:795:5:795:9 | hash2 [element :d] | hash_flow.rb:800:29:800:33 | hash2 [element :d] | provenance | | | hash_flow.rb:795:5:795:9 | hash2 [element :f] | hash_flow.rb:800:29:800:33 | hash2 [element :f] | provenance | | -| hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:795:5:795:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:795:5:795:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:795:13:799:5 | call to [] [element :d] | hash_flow.rb:795:5:795:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:795:13:799:5 | call to [] [element :f] | hash_flow.rb:795:5:795:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:795:13:799:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:795:13:799:5 | call to [] [element :f] | provenance | | | hash_flow.rb:800:5:800:8 | hash [element :a] | hash_flow.rb:805:11:805:14 | hash [element :a] | provenance | | | hash_flow.rb:800:5:800:8 | hash [element :c] | hash_flow.rb:807:11:807:14 | hash [element :c] | provenance | | | hash_flow.rb:800:5:800:8 | hash [element :d] | hash_flow.rb:808:11:808:14 | hash [element :d] | provenance | | @@ -728,12 +821,16 @@ edges | hash_flow.rb:810:11:810:18 | ...[...] | hash_flow.rb:810:10:810:19 | ( ... ) | provenance | | | hash_flow.rb:816:5:816:9 | hash1 [element :a] | hash_flow.rb:826:12:826:16 | hash1 [element :a] | provenance | | | hash_flow.rb:816:5:816:9 | hash1 [element :c] | hash_flow.rb:826:12:826:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:816:5:816:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:816:5:816:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:816:13:820:5 | call to [] [element :a] | hash_flow.rb:816:5:816:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:816:13:820:5 | call to [] [element :c] | hash_flow.rb:816:5:816:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:816:13:820:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:816:13:820:5 | call to [] [element :c] | provenance | | | hash_flow.rb:821:5:821:9 | hash2 [element :d] | hash_flow.rb:826:30:826:34 | hash2 [element :d] | provenance | | | hash_flow.rb:821:5:821:9 | hash2 [element :f] | hash_flow.rb:826:30:826:34 | hash2 [element :f] | provenance | | -| hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:821:5:821:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:821:5:821:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:821:13:825:5 | call to [] [element :d] | hash_flow.rb:821:5:821:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:821:13:825:5 | call to [] [element :f] | hash_flow.rb:821:5:821:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:821:13:825:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:821:13:825:5 | call to [] [element :f] | provenance | | | hash_flow.rb:826:5:826:8 | hash [element :a] | hash_flow.rb:831:11:831:14 | hash [element :a] | provenance | | | hash_flow.rb:826:5:826:8 | hash [element :c] | hash_flow.rb:833:11:833:14 | hash [element :c] | provenance | | | hash_flow.rb:826:5:826:8 | hash [element :d] | hash_flow.rb:834:11:834:14 | hash [element :d] | provenance | | @@ -784,14 +881,18 @@ edges | hash_flow.rb:849:5:849:9 | hash1 [element :a] | hash_flow.rb:869:13:869:17 | hash1 [element :a] | provenance | | | hash_flow.rb:849:5:849:9 | hash1 [element :c] | hash_flow.rb:860:13:860:17 | hash1 [element :c] | provenance | | | hash_flow.rb:849:5:849:9 | hash1 [element :c] | hash_flow.rb:869:13:869:17 | hash1 [element :c] | provenance | | -| hash_flow.rb:850:12:850:22 | call to taint | hash_flow.rb:849:5:849:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:852:12:852:22 | call to taint | hash_flow.rb:849:5:849:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:849:13:853:5 | call to [] [element :a] | hash_flow.rb:849:5:849:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:849:13:853:5 | call to [] [element :c] | hash_flow.rb:849:5:849:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:850:12:850:22 | call to taint | hash_flow.rb:849:13:853:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:852:12:852:22 | call to taint | hash_flow.rb:849:13:853:5 | call to [] [element :c] | provenance | | | hash_flow.rb:854:5:854:9 | hash2 [element :d] | hash_flow.rb:860:33:860:37 | hash2 [element :d] | provenance | | | hash_flow.rb:854:5:854:9 | hash2 [element :d] | hash_flow.rb:869:33:869:37 | hash2 [element :d] | provenance | | | hash_flow.rb:854:5:854:9 | hash2 [element :f] | hash_flow.rb:860:33:860:37 | hash2 [element :f] | provenance | | | hash_flow.rb:854:5:854:9 | hash2 [element :f] | hash_flow.rb:869:33:869:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:855:12:855:22 | call to taint | hash_flow.rb:854:5:854:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:857:12:857:22 | call to taint | hash_flow.rb:854:5:854:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:854:13:858:5 | call to [] [element :d] | hash_flow.rb:854:5:854:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:854:13:858:5 | call to [] [element :f] | hash_flow.rb:854:5:854:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:855:12:855:22 | call to taint | hash_flow.rb:854:13:858:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:857:12:857:22 | call to taint | hash_flow.rb:854:13:858:5 | call to [] [element :f] | provenance | | | hash_flow.rb:860:5:860:9 | hash3 [element :a] | hash_flow.rb:861:11:861:15 | hash3 [element :a] | provenance | | | hash_flow.rb:860:5:860:9 | hash3 [element :c] | hash_flow.rb:863:11:863:15 | hash3 [element :c] | provenance | | | hash_flow.rb:860:5:860:9 | hash3 [element :d] | hash_flow.rb:864:11:864:15 | hash3 [element :d] | provenance | | @@ -834,12 +935,16 @@ edges | hash_flow.rb:875:11:875:19 | ...[...] | hash_flow.rb:875:10:875:20 | ( ... ) | provenance | | | hash_flow.rb:881:5:881:9 | hash1 [element :a] | hash_flow.rb:892:12:892:16 | hash1 [element :a] | provenance | | | hash_flow.rb:881:5:881:9 | hash1 [element :c] | hash_flow.rb:892:12:892:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:882:12:882:22 | call to taint | hash_flow.rb:881:5:881:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:884:12:884:22 | call to taint | hash_flow.rb:881:5:881:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:881:13:885:5 | call to [] [element :a] | hash_flow.rb:881:5:881:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:881:13:885:5 | call to [] [element :c] | hash_flow.rb:881:5:881:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:882:12:882:22 | call to taint | hash_flow.rb:881:13:885:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:884:12:884:22 | call to taint | hash_flow.rb:881:13:885:5 | call to [] [element :c] | provenance | | | hash_flow.rb:886:5:886:9 | hash2 [element :d] | hash_flow.rb:892:33:892:37 | hash2 [element :d] | provenance | | | hash_flow.rb:886:5:886:9 | hash2 [element :f] | hash_flow.rb:892:33:892:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:887:12:887:22 | call to taint | hash_flow.rb:886:5:886:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:889:12:889:22 | call to taint | hash_flow.rb:886:5:886:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:886:13:890:5 | call to [] [element :d] | hash_flow.rb:886:5:886:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:886:13:890:5 | call to [] [element :f] | hash_flow.rb:886:5:886:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:887:12:887:22 | call to taint | hash_flow.rb:886:13:890:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:889:12:889:22 | call to taint | hash_flow.rb:886:13:890:5 | call to [] [element :f] | provenance | | | hash_flow.rb:892:5:892:8 | hash [element :a] | hash_flow.rb:893:11:893:14 | hash [element :a] | provenance | | | hash_flow.rb:892:5:892:8 | hash [element :c] | hash_flow.rb:895:11:895:14 | hash [element :c] | provenance | | | hash_flow.rb:892:5:892:8 | hash [element :d] | hash_flow.rb:896:11:896:14 | hash [element :d] | provenance | | @@ -878,12 +983,16 @@ edges | hash_flow.rb:905:11:905:19 | ...[...] | hash_flow.rb:905:10:905:20 | ( ... ) | provenance | | | hash_flow.rb:911:5:911:9 | hash1 [element :a] | hash_flow.rb:922:12:922:16 | hash1 [element :a] | provenance | | | hash_flow.rb:911:5:911:9 | hash1 [element :c] | hash_flow.rb:922:12:922:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:912:12:912:22 | call to taint | hash_flow.rb:911:5:911:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:914:12:914:22 | call to taint | hash_flow.rb:911:5:911:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:911:13:915:5 | call to [] [element :a] | hash_flow.rb:911:5:911:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:911:13:915:5 | call to [] [element :c] | hash_flow.rb:911:5:911:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:912:12:912:22 | call to taint | hash_flow.rb:911:13:915:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:914:12:914:22 | call to taint | hash_flow.rb:911:13:915:5 | call to [] [element :c] | provenance | | | hash_flow.rb:916:5:916:9 | hash2 [element :d] | hash_flow.rb:922:33:922:37 | hash2 [element :d] | provenance | | | hash_flow.rb:916:5:916:9 | hash2 [element :f] | hash_flow.rb:922:33:922:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:917:12:917:22 | call to taint | hash_flow.rb:916:5:916:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:919:12:919:22 | call to taint | hash_flow.rb:916:5:916:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:916:13:920:5 | call to [] [element :d] | hash_flow.rb:916:5:916:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:916:13:920:5 | call to [] [element :f] | hash_flow.rb:916:5:916:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:917:12:917:22 | call to taint | hash_flow.rb:916:13:920:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:919:12:919:22 | call to taint | hash_flow.rb:916:13:920:5 | call to [] [element :f] | provenance | | | hash_flow.rb:922:5:922:8 | hash [element :a] | hash_flow.rb:923:11:923:14 | hash [element :a] | provenance | | | hash_flow.rb:922:5:922:8 | hash [element :c] | hash_flow.rb:925:11:925:14 | hash [element :c] | provenance | | | hash_flow.rb:922:5:922:8 | hash [element :d] | hash_flow.rb:926:11:926:14 | hash [element :d] | provenance | | @@ -922,12 +1031,16 @@ edges | hash_flow.rb:935:11:935:19 | ...[...] | hash_flow.rb:935:10:935:20 | ( ... ) | provenance | | | hash_flow.rb:941:5:941:9 | hash1 [element :a] | hash_flow.rb:952:12:952:16 | hash1 [element :a] | provenance | | | hash_flow.rb:941:5:941:9 | hash1 [element :c] | hash_flow.rb:952:12:952:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:942:12:942:22 | call to taint | hash_flow.rb:941:5:941:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:941:5:941:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:941:13:945:5 | call to [] [element :a] | hash_flow.rb:941:5:941:9 | hash1 [element :a] | provenance | | +| hash_flow.rb:941:13:945:5 | call to [] [element :c] | hash_flow.rb:941:5:941:9 | hash1 [element :c] | provenance | | +| hash_flow.rb:942:12:942:22 | call to taint | hash_flow.rb:941:13:945:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:941:13:945:5 | call to [] [element :c] | provenance | | | hash_flow.rb:946:5:946:9 | hash2 [element :d] | hash_flow.rb:952:33:952:37 | hash2 [element :d] | provenance | | | hash_flow.rb:946:5:946:9 | hash2 [element :f] | hash_flow.rb:952:33:952:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:946:5:946:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:946:5:946:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:946:13:950:5 | call to [] [element :d] | hash_flow.rb:946:5:946:9 | hash2 [element :d] | provenance | | +| hash_flow.rb:946:13:950:5 | call to [] [element :f] | hash_flow.rb:946:5:946:9 | hash2 [element :f] | provenance | | +| hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:946:13:950:5 | call to [] [element :d] | provenance | | +| hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:946:13:950:5 | call to [] [element :f] | provenance | | | hash_flow.rb:952:5:952:8 | hash [element :a] | hash_flow.rb:953:11:953:14 | hash [element :a] | provenance | | | hash_flow.rb:952:5:952:8 | hash [element :c] | hash_flow.rb:955:11:955:14 | hash [element :c] | provenance | | | hash_flow.rb:952:5:952:8 | hash [element :d] | hash_flow.rb:956:11:956:14 | hash [element :d] | provenance | | @@ -982,6 +1095,11 @@ nodes | hash_flow.rb:10:5:10:8 | hash [element :c] | semmle.label | hash [element :c] | | hash_flow.rb:10:5:10:8 | hash [element e] | semmle.label | hash [element e] | | hash_flow.rb:10:5:10:8 | hash [element g] | semmle.label | hash [element g] | +| hash_flow.rb:10:12:21:5 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| hash_flow.rb:10:12:21:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:10:12:21:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:10:12:21:5 | call to [] [element e] | semmle.label | call to [] [element e] | +| hash_flow.rb:10:12:21:5 | call to [] [element g] | semmle.label | call to [] [element g] | | hash_flow.rb:11:15:11:24 | call to taint | semmle.label | call to taint | | hash_flow.rb:13:12:13:21 | call to taint | semmle.label | call to taint | | hash_flow.rb:15:14:15:23 | call to taint | semmle.label | call to taint | @@ -1033,6 +1151,7 @@ nodes | hash_flow.rb:56:10:56:14 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:56:10:56:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:59:5:59:5 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:59:9:59:29 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:59:13:59:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:60:5:60:9 | hash2 [element :a] | semmle.label | hash2 [element :a] | | hash_flow.rb:60:13:60:19 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | @@ -1041,6 +1160,8 @@ nodes | hash_flow.rb:61:10:61:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:64:5:64:9 | hash3 [element] | semmle.label | hash3 [element] | | hash_flow.rb:64:13:64:45 | ...[...] [element] | semmle.label | ...[...] [element] | +| hash_flow.rb:64:18:64:44 | call to [] [element 0, element 1] | semmle.label | call to [] [element 0, element 1] | +| hash_flow.rb:64:19:64:34 | call to [] [element 1] | semmle.label | call to [] [element 1] | | hash_flow.rb:64:24:64:33 | call to taint | semmle.label | call to taint | | hash_flow.rb:65:10:65:14 | hash3 [element] | semmle.label | hash3 [element] | | hash_flow.rb:65:10:65:18 | ...[...] | semmle.label | ...[...] | @@ -1058,6 +1179,7 @@ nodes | hash_flow.rb:73:10:73:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:76:5:76:9 | hash6 [element a] | semmle.label | hash6 [element a] | | hash_flow.rb:76:13:76:47 | ...[...] [element a] | semmle.label | ...[...] [element a] | +| hash_flow.rb:76:18:76:46 | call to [] [element a] | semmle.label | call to [] [element a] | | hash_flow.rb:76:26:76:35 | call to taint | semmle.label | call to taint | | hash_flow.rb:77:10:77:14 | hash6 [element a] | semmle.label | hash6 [element a] | | hash_flow.rb:77:10:77:19 | ...[...] | semmle.label | ...[...] | @@ -1067,6 +1189,7 @@ nodes | hash_flow.rb:85:10:85:14 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:85:10:85:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:92:5:92:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:92:12:95:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:93:15:93:24 | call to taint | semmle.label | call to taint | | hash_flow.rb:96:5:96:9 | hash2 [element :a] | semmle.label | hash2 [element :a] | | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | semmle.label | call to try_convert [element :a] | @@ -1093,6 +1216,7 @@ nodes | hash_flow.rb:120:10:120:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:121:10:121:10 | c | semmle.label | c | | hash_flow.rb:127:5:127:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:127:12:130:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:128:15:128:24 | call to taint | semmle.label | call to taint | | hash_flow.rb:131:5:131:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:131:18:131:29 | key_or_value | semmle.label | key_or_value | @@ -1101,6 +1225,7 @@ nodes | hash_flow.rb:134:22:134:26 | value | semmle.label | value | | hash_flow.rb:136:14:136:18 | value | semmle.label | value | | hash_flow.rb:143:5:143:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:143:12:146:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:144:15:144:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:147:5:147:5 | b [element 1] | semmle.label | b [element 1] | | hash_flow.rb:147:9:147:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1115,6 +1240,7 @@ nodes | hash_flow.rb:152:10:152:10 | c [element 1] | semmle.label | c [element 1] | | hash_flow.rb:152:10:152:13 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:169:5:169:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:169:12:172:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:170:15:170:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:173:5:173:5 | a [element :a] | semmle.label | a [element :a] | | hash_flow.rb:173:9:173:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1122,12 +1248,14 @@ nodes | hash_flow.rb:174:10:174:10 | a [element :a] | semmle.label | a [element :a] | | hash_flow.rb:174:10:174:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:181:5:181:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:181:12:184:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:182:15:182:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:185:5:185:5 | a | semmle.label | a | | hash_flow.rb:185:9:185:12 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:185:9:185:23 | call to delete | semmle.label | call to delete | | hash_flow.rb:186:10:186:10 | a | semmle.label | a | | hash_flow.rb:193:5:193:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:193:12:196:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:194:15:194:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:197:5:197:5 | a [element :a] | semmle.label | a [element :a] | | hash_flow.rb:197:9:197:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | @@ -1141,13 +1269,17 @@ nodes | hash_flow.rb:202:10:202:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:209:5:209:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | semmle.label | hash [element :c, element :d] | +| hash_flow.rb:209:12:216:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:209:12:216:5 | call to [] [element :c, element :d] | semmle.label | call to [] [element :c, element :d] | | hash_flow.rb:210:15:210:25 | call to taint | semmle.label | call to taint | +| hash_flow.rb:212:15:215:9 | call to [] [element :d] | semmle.label | call to [] [element :d] | | hash_flow.rb:213:19:213:29 | call to taint | semmle.label | call to taint | | hash_flow.rb:217:10:217:13 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:217:10:217:21 | call to dig | semmle.label | call to dig | | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | semmle.label | hash [element :c, element :d] | | hash_flow.rb:219:10:219:24 | call to dig | semmle.label | call to dig | | hash_flow.rb:226:5:226:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:226:12:229:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:227:15:227:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:230:5:230:5 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:230:9:230:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1157,6 +1289,7 @@ nodes | hash_flow.rb:234:10:234:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:234:10:234:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:241:5:241:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:241:12:244:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:242:15:242:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:245:5:245:5 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:245:9:245:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1164,6 +1297,7 @@ nodes | hash_flow.rb:248:10:248:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:248:10:248:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:255:5:255:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:255:12:258:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:256:15:256:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:259:5:259:5 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:259:9:259:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1173,6 +1307,7 @@ nodes | hash_flow.rb:263:10:263:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:263:10:263:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:270:5:270:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:270:12:273:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:271:15:271:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:274:5:274:5 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:274:9:274:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1182,6 +1317,7 @@ nodes | hash_flow.rb:277:10:277:10 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:277:10:277:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:284:5:284:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:284:12:289:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:287:15:287:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:290:5:290:5 | x [element :c] | semmle.label | x [element :c] | | hash_flow.rb:290:9:290:12 | hash [element :c] | semmle.label | hash [element :c] | @@ -1190,6 +1326,8 @@ nodes | hash_flow.rb:293:10:293:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:300:5:300:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:300:5:300:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:300:12:304:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:300:12:304:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:301:15:301:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:303:15:303:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:305:5:305:5 | b | semmle.label | b | @@ -1221,6 +1359,8 @@ nodes | hash_flow.rb:316:10:316:10 | b | semmle.label | b | | hash_flow.rb:322:5:322:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:322:5:322:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:322:12:326:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:322:12:326:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:323:15:323:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:325:15:325:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:327:5:327:5 | b [element] | semmle.label | b [element] | @@ -1246,6 +1386,8 @@ nodes | hash_flow.rb:335:10:335:13 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:341:5:341:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:341:5:341:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:341:12:345:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:341:12:345:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:342:15:342:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:344:15:344:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:346:5:346:5 | b [element :a] | semmle.label | b [element :a] | @@ -1259,6 +1401,8 @@ nodes | hash_flow.rb:351:11:351:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:357:5:357:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:357:5:357:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:357:12:361:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:357:12:361:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:358:15:358:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:360:15:360:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:362:5:362:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | @@ -1271,6 +1415,8 @@ nodes | hash_flow.rb:367:11:367:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:373:5:373:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:373:5:373:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:373:12:377:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:373:12:377:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:374:15:374:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:376:15:376:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:378:5:378:5 | b [element] | semmle.label | b [element] | @@ -1282,6 +1428,8 @@ nodes | hash_flow.rb:379:11:379:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:385:5:385:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:385:5:385:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:385:12:389:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:385:12:389:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:386:15:386:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:388:15:388:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:390:5:390:5 | b [element :a] | semmle.label | b [element :a] | @@ -1299,10 +1447,14 @@ nodes | hash_flow.rb:396:11:396:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:402:5:402:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:402:5:402:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:402:13:406:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:402:13:406:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:403:15:403:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:405:15:405:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:407:5:407:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:407:5:407:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:407:13:411:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:407:13:411:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:408:15:408:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:410:15:410:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:412:5:412:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1335,10 +1487,14 @@ nodes | hash_flow.rb:422:11:422:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:428:5:428:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:428:5:428:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:428:13:432:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:428:13:432:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:429:15:429:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:431:15:431:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:433:5:433:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:433:5:433:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:433:13:437:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:433:13:437:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:434:15:434:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:436:15:436:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:438:5:438:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1386,6 +1542,7 @@ nodes | hash_flow.rb:455:11:455:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | | hash_flow.rb:455:11:455:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:461:5:461:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:461:12:464:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:462:15:462:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:465:5:465:5 | b [element 1] | semmle.label | b [element 1] | | hash_flow.rb:465:9:465:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1393,6 +1550,7 @@ nodes | hash_flow.rb:467:10:467:10 | b [element 1] | semmle.label | b [element 1] | | hash_flow.rb:467:10:467:13 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:473:5:473:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:473:12:476:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:474:15:474:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:477:5:477:5 | b [element :a] | semmle.label | b [element :a] | | hash_flow.rb:477:9:477:12 | hash [element :a] | semmle.label | hash [element :a] | @@ -1402,6 +1560,7 @@ nodes | hash_flow.rb:482:10:482:10 | b [element :a] | semmle.label | b [element :a] | | hash_flow.rb:482:10:482:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:488:5:488:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:488:12:491:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | | hash_flow.rb:489:15:489:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:492:5:492:5 | b [element :a] | semmle.label | b [element :a] | | hash_flow.rb:492:9:492:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | @@ -1415,6 +1574,8 @@ nodes | hash_flow.rb:498:10:498:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:504:5:504:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:504:5:504:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:504:12:508:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:504:12:508:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:505:15:505:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:507:15:507:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | semmle.label | [post] hash2 [element :a] | @@ -1429,6 +1590,8 @@ nodes | hash_flow.rb:515:11:515:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:519:5:519:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:519:5:519:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:519:12:523:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:519:12:523:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:520:15:520:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:522:15:522:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:524:5:524:5 | b [element :a] | semmle.label | b [element :a] | @@ -1442,6 +1605,8 @@ nodes | hash_flow.rb:529:11:529:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:535:5:535:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:535:5:535:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:535:12:539:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:535:12:539:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:536:15:536:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:538:15:538:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:540:5:540:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | @@ -1454,6 +1619,8 @@ nodes | hash_flow.rb:545:11:545:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:551:5:551:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:551:5:551:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:551:12:555:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:551:12:555:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:552:15:552:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:554:15:554:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:556:5:556:5 | b [element 1] | semmle.label | b [element 1] | @@ -1469,6 +1636,8 @@ nodes | hash_flow.rb:559:11:559:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:565:5:565:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:565:5:565:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:565:12:569:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:565:12:569:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:566:15:566:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:568:15:568:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:570:5:570:5 | b [element :a] | semmle.label | b [element :a] | @@ -1491,6 +1660,8 @@ nodes | hash_flow.rb:578:11:578:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:584:5:584:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:584:5:584:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:584:12:588:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:584:12:588:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:585:15:585:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:587:15:587:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:589:5:589:5 | a [element, element 1] | semmle.label | a [element, element 1] | @@ -1503,6 +1674,8 @@ nodes | hash_flow.rb:591:11:591:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:597:5:597:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:597:5:597:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:597:12:601:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:597:12:601:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:598:15:598:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:600:15:600:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:602:5:602:5 | a [element :a] | semmle.label | a [element :a] | @@ -1523,12 +1696,15 @@ nodes | hash_flow.rb:607:9:611:7 | call to to_h [element] | semmle.label | call to to_h [element] | | hash_flow.rb:607:28:607:32 | value | semmle.label | value | | hash_flow.rb:609:14:609:18 | value | semmle.label | value | +| hash_flow.rb:610:9:610:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | | hash_flow.rb:610:14:610:24 | call to taint | semmle.label | call to taint | | hash_flow.rb:612:10:612:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:612:11:612:11 | b [element] | semmle.label | b [element] | | hash_flow.rb:612:11:612:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:618:5:618:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:618:5:618:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:618:12:622:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:618:12:622:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:619:15:619:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:621:15:621:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:623:5:623:5 | a [element] | semmle.label | a [element] | @@ -1546,6 +1722,8 @@ nodes | hash_flow.rb:626:11:626:16 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:632:5:632:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:632:5:632:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:632:12:636:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:632:12:636:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:633:15:633:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:635:15:635:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:637:5:637:8 | [post] hash [element] | semmle.label | [post] hash [element] | @@ -1565,6 +1743,8 @@ nodes | hash_flow.rb:642:11:642:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:648:5:648:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:648:5:648:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:648:12:652:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:648:12:652:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:649:15:649:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:651:15:651:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:653:5:653:5 | b [element] | semmle.label | b [element] | @@ -1582,6 +1762,8 @@ nodes | hash_flow.rb:658:11:658:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:664:5:664:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:664:5:664:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:664:12:668:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:664:12:668:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:665:15:665:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:667:15:667:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:669:5:669:8 | [post] hash [element] | semmle.label | [post] hash [element] | @@ -1595,10 +1777,14 @@ nodes | hash_flow.rb:673:11:673:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:679:5:679:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:679:5:679:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:679:13:683:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:679:13:683:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:680:15:680:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:682:15:682:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:684:5:684:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:684:5:684:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:684:13:688:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:684:13:688:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:685:15:685:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:687:15:687:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:689:5:689:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1647,6 +1833,8 @@ nodes | hash_flow.rb:706:11:706:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:712:5:712:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:712:5:712:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:712:12:716:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:712:12:716:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:713:15:713:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:715:15:715:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:717:5:717:5 | a [element] | semmle.label | a [element] | @@ -1658,6 +1846,8 @@ nodes | hash_flow.rb:718:11:718:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:724:5:724:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:724:5:724:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:724:12:728:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:724:12:728:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:725:15:725:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:727:15:727:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:729:5:729:5 | b [element 0] | semmle.label | b [element 0] | @@ -1673,10 +1863,14 @@ nodes | hash_flow.rb:732:10:732:13 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:738:5:738:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:738:5:738:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:738:13:742:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:738:13:742:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:739:15:739:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:741:15:741:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:743:5:743:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:743:5:743:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:743:13:747:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:743:13:747:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:744:15:744:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:746:15:746:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:748:5:748:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1684,6 +1878,11 @@ nodes | hash_flow.rb:748:5:748:8 | hash [element :d] | semmle.label | hash [element :d] | | hash_flow.rb:748:5:748:8 | hash [element :f] | semmle.label | hash [element :f] | | hash_flow.rb:748:5:748:8 | hash [element :g] | semmle.label | hash [element :g] | +| hash_flow.rb:748:12:748:59 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:748:12:748:59 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:748:12:748:59 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:748:12:748:59 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:748:12:748:59 | call to [] [element :g] | semmle.label | call to [] [element :g] | | hash_flow.rb:748:14:748:20 | ** ... [element :a] | semmle.label | ** ... [element :a] | | hash_flow.rb:748:14:748:20 | ** ... [element :c] | semmle.label | ** ... [element :c] | | hash_flow.rb:748:16:748:20 | hash1 [element :a] | semmle.label | hash1 [element :a] | @@ -1706,6 +1905,9 @@ nodes | hash_flow.rb:762:5:762:8 | hash [element :a] | semmle.label | hash [element :a] | | hash_flow.rb:762:5:762:8 | hash [element :c] | semmle.label | hash [element :c] | | hash_flow.rb:762:5:762:8 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:762:12:767:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:762:12:767:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:762:12:767:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | | hash_flow.rb:763:15:763:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:765:15:765:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:766:15:766:25 | call to taint | semmle.label | call to taint | @@ -1725,10 +1927,14 @@ nodes | hash_flow.rb:783:10:783:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:790:5:790:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:790:5:790:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:790:13:794:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:790:13:794:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:791:15:791:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:793:15:793:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:795:5:795:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:795:5:795:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:795:13:799:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:795:13:799:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:796:15:796:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:798:15:798:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:800:5:800:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1761,10 +1967,14 @@ nodes | hash_flow.rb:810:11:810:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:816:5:816:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:816:5:816:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:816:13:820:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:816:13:820:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:817:15:817:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:819:15:819:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:821:5:821:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:821:5:821:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:821:13:825:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:821:13:825:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:822:15:822:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:824:15:824:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:826:5:826:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1813,10 +2023,14 @@ nodes | hash_flow.rb:843:11:843:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:849:5:849:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:849:5:849:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:849:13:853:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:849:13:853:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:850:12:850:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:852:12:852:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:854:5:854:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:854:5:854:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:854:13:858:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:854:13:858:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:855:12:855:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:857:12:857:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:860:5:860:9 | hash3 [element :a] | semmle.label | hash3 [element :a] | @@ -1869,10 +2083,14 @@ nodes | hash_flow.rb:875:11:875:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:881:5:881:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:881:5:881:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:881:13:885:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:881:13:885:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:882:12:882:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:884:12:884:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:886:5:886:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:886:5:886:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:886:13:890:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:886:13:890:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:887:12:887:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:889:12:889:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:892:5:892:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1917,10 +2135,14 @@ nodes | hash_flow.rb:905:11:905:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:911:5:911:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:911:5:911:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:911:13:915:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:911:13:915:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:912:12:912:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:914:12:914:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:916:5:916:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:916:5:916:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:916:13:920:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:916:13:920:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:917:12:917:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:919:12:919:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:922:5:922:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1965,10 +2187,14 @@ nodes | hash_flow.rb:935:11:935:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:941:5:941:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:941:5:941:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:941:13:945:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:941:13:945:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | | hash_flow.rb:942:12:942:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:944:12:944:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:946:5:946:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | | hash_flow.rb:946:5:946:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:946:13:950:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:946:13:950:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | | hash_flow.rb:947:12:947:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:949:12:949:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:952:5:952:8 | hash [element :a] | semmle.label | hash [element :a] | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 35249d82a65..f640ff6551a 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -2798,12 +2798,14 @@ | UseUseExplosion.rb:21:3691:21:3696 | call to use | UseUseExplosion.rb:21:3686:21:3696 | else ... | | UseUseExplosion.rb:24:5:25:7 | synthetic splat parameter | UseUseExplosion.rb:24:13:24:13 | i | | UseUseExplosion.rb:24:5:25:7 | use | UseUseExplosion.rb:1:1:26:3 | C | +| file://:0:0:0:0 | [summary param] ** in I18n.translate | file://:0:0:0:0 | [summary] read: Argument[hash-splat].Element[any] in I18n.translate | | file://:0:0:0:0 | [summary param] position 0 in & | file://:0:0:0:0 | [summary] read: Argument[0].Element[any] in & | | file://:0:0:0:0 | [summary param] position 0 in + | file://:0:0:0:0 | [summary] read: Argument[0].Element[any] in + | | file://:0:0:0:0 | [summary param] position 0 in ActionController::Parameters#merge | file://:0:0:0:0 | [summary] to write: ReturnValue in ActionController::Parameters#merge | | file://:0:0:0:0 | [summary param] position 0 in ActionController::Parameters#merge! | file://:0:0:0:0 | [summary] to write: Argument[self] in ActionController::Parameters#merge! | | file://:0:0:0:0 | [summary param] position 0 in ActionController::Parameters#merge! | file://:0:0:0:0 | [summary] to write: ReturnValue in ActionController::Parameters#merge! | | file://:0:0:0:0 | [summary param] position 0 in Arel.sql | file://:0:0:0:0 | [summary] to write: ReturnValue in Arel.sql | +| file://:0:0:0:0 | [summary param] position 0 in Arel::Nodes::SqlLiteral.new | file://:0:0:0:0 | [summary] to write: ReturnValue in Arel::Nodes::SqlLiteral.new | | file://:0:0:0:0 | [summary param] position 0 in Base64.decode64() | file://:0:0:0:0 | [summary] to write: ReturnValue in Base64.decode64() | | file://:0:0:0:0 | [summary param] position 0 in ERB.new | file://:0:0:0:0 | [summary] to write: ReturnValue in ERB.new | | file://:0:0:0:0 | [summary param] position 0 in File.absolute_path | file://:0:0:0:0 | [summary] to write: ReturnValue in File.absolute_path | @@ -2839,6 +2841,7 @@ | file://:0:0:0:0 | [summary param] self in assoc-unknown-arg | file://:0:0:0:0 | [summary] read: Argument[self].Element[any] in assoc-unknown-arg | | file://:0:0:0:0 | [summary param] self in each(0) | file://:0:0:0:0 | [summary] read: Argument[self].Element[any] in each(0) | | file://:0:0:0:0 | [summary] read: Argument[0].Element[any] in Hash[] | file://:0:0:0:0 | [summary] read: Argument[0].Element[any].Element[1] in Hash[] | +| file://:0:0:0:0 | [summary] read: Argument[hash-splat].Element[any] in I18n.translate | file://:0:0:0:0 | [summary] to write: ReturnValue in I18n.translate | | local_dataflow.rb:1:1:7:3 | self (foo) | local_dataflow.rb:3:8:3:10 | self | | local_dataflow.rb:1:1:7:3 | self in foo | local_dataflow.rb:1:1:7:3 | self (foo) | | local_dataflow.rb:1:1:7:3 | synthetic splat parameter | local_dataflow.rb:1:9:1:9 | a | diff --git a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected index 629c9993984..879c57b1f17 100644 --- a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected @@ -27,32 +27,39 @@ edges | params_flow.rb:33:26:33:34 | call to taint | params_flow.rb:25:17:25:24 | **kwargs [hash-splat position :p2] | provenance | | | params_flow.rb:33:41:33:49 | call to taint | params_flow.rb:25:17:25:24 | **kwargs [hash-splat position :p3] | provenance | | | params_flow.rb:34:1:34:4 | args [element :p3] | params_flow.rb:35:25:35:28 | args [element :p3] | provenance | | -| params_flow.rb:34:14:34:22 | call to taint | params_flow.rb:34:1:34:4 | args [element :p3] | provenance | | +| params_flow.rb:34:8:34:32 | call to [] [element :p3] | params_flow.rb:34:1:34:4 | args [element :p3] | provenance | | +| params_flow.rb:34:14:34:22 | call to taint | params_flow.rb:34:8:34:32 | call to [] [element :p3] | provenance | | | params_flow.rb:35:12:35:20 | call to taint | params_flow.rb:25:12:25:13 | p1 | provenance | | | params_flow.rb:35:23:35:28 | ** ... [element :p3] | params_flow.rb:25:17:25:24 | **kwargs [element :p3] | provenance | | | params_flow.rb:35:25:35:28 | args [element :p3] | params_flow.rb:35:23:35:28 | ** ... [element :p3] | provenance | | | params_flow.rb:37:1:37:4 | args [element :p1] | params_flow.rb:38:10:38:13 | args [element :p1] | provenance | | | params_flow.rb:37:1:37:4 | args [element :p2] | params_flow.rb:38:10:38:13 | args [element :p2] | provenance | | -| params_flow.rb:37:16:37:24 | call to taint | params_flow.rb:37:1:37:4 | args [element :p1] | provenance | | -| params_flow.rb:37:34:37:42 | call to taint | params_flow.rb:37:1:37:4 | args [element :p2] | provenance | | +| params_flow.rb:37:8:37:44 | call to [] [element :p1] | params_flow.rb:37:1:37:4 | args [element :p1] | provenance | | +| params_flow.rb:37:8:37:44 | call to [] [element :p2] | params_flow.rb:37:1:37:4 | args [element :p2] | provenance | | +| params_flow.rb:37:16:37:24 | call to taint | params_flow.rb:37:8:37:44 | call to [] [element :p1] | provenance | | +| params_flow.rb:37:34:37:42 | call to taint | params_flow.rb:37:8:37:44 | call to [] [element :p2] | provenance | | | params_flow.rb:38:8:38:13 | ** ... [element :p1] | params_flow.rb:25:12:25:13 | p1 | provenance | | | params_flow.rb:38:8:38:13 | ** ... [element :p2] | params_flow.rb:25:17:25:24 | **kwargs [element :p2] | provenance | | | params_flow.rb:38:10:38:13 | args [element :p1] | params_flow.rb:38:8:38:13 | ** ... [element :p1] | provenance | | | params_flow.rb:38:10:38:13 | args [element :p2] | params_flow.rb:38:8:38:13 | ** ... [element :p2] | provenance | | | params_flow.rb:40:1:40:4 | args [element :p1] | params_flow.rb:41:26:41:29 | args [element :p1] | provenance | | -| params_flow.rb:40:16:40:24 | call to taint | params_flow.rb:40:1:40:4 | args [element :p1] | provenance | | +| params_flow.rb:40:8:40:26 | call to [] [element :p1] | params_flow.rb:40:1:40:4 | args [element :p1] | provenance | | +| params_flow.rb:40:16:40:24 | call to taint | params_flow.rb:40:8:40:26 | call to [] [element :p1] | provenance | | | params_flow.rb:41:13:41:21 | call to taint | params_flow.rb:16:18:16:19 | p2 | provenance | | | params_flow.rb:41:24:41:29 | ** ... [element :p1] | params_flow.rb:16:13:16:14 | p1 | provenance | | | params_flow.rb:41:26:41:29 | args [element :p1] | params_flow.rb:41:24:41:29 | ** ... [element :p1] | provenance | | | params_flow.rb:43:1:43:4 | args [element 0] | params_flow.rb:44:24:44:27 | args [element 0] | provenance | | -| params_flow.rb:43:9:43:17 | call to taint | params_flow.rb:43:1:43:4 | args [element 0] | provenance | | +| params_flow.rb:43:8:43:18 | call to [] [element 0] | params_flow.rb:43:1:43:4 | args [element 0] | provenance | | +| params_flow.rb:43:9:43:17 | call to taint | params_flow.rb:43:8:43:18 | call to [] [element 0] | provenance | | | params_flow.rb:44:12:44:20 | call to taint | params_flow.rb:9:16:9:17 | p1 | provenance | | | params_flow.rb:44:23:44:27 | * ... [element 0] | params_flow.rb:9:20:9:21 | p2 | provenance | | | params_flow.rb:44:24:44:27 | args [element 0] | params_flow.rb:44:23:44:27 | * ... [element 0] | provenance | | | params_flow.rb:46:1:46:4 | args [element 0] | params_flow.rb:47:13:47:16 | args [element 0] | provenance | | | params_flow.rb:46:1:46:4 | args [element 1] | params_flow.rb:47:13:47:16 | args [element 1] | provenance | | -| params_flow.rb:46:9:46:17 | call to taint | params_flow.rb:46:1:46:4 | args [element 0] | provenance | | -| params_flow.rb:46:20:46:28 | call to taint | params_flow.rb:46:1:46:4 | args [element 1] | provenance | | +| params_flow.rb:46:8:46:29 | call to [] [element 0] | params_flow.rb:46:1:46:4 | args [element 0] | provenance | | +| params_flow.rb:46:8:46:29 | call to [] [element 1] | params_flow.rb:46:1:46:4 | args [element 1] | provenance | | +| params_flow.rb:46:9:46:17 | call to taint | params_flow.rb:46:8:46:29 | call to [] [element 0] | provenance | | +| params_flow.rb:46:20:46:28 | call to taint | params_flow.rb:46:8:46:29 | call to [] [element 1] | provenance | | | params_flow.rb:47:12:47:16 | * ... [element 0] | params_flow.rb:9:16:9:17 | p1 | provenance | | | params_flow.rb:47:12:47:16 | * ... [element 1] | params_flow.rb:9:20:9:21 | p2 | provenance | | | params_flow.rb:47:13:47:16 | args [element 0] | params_flow.rb:47:12:47:16 | * ... [element 0] | provenance | | @@ -66,15 +73,18 @@ edges | params_flow.rb:55:9:55:17 | call to taint | params_flow.rb:49:13:49:14 | p1 | provenance | | | params_flow.rb:55:20:55:28 | call to taint | params_flow.rb:49:17:49:24 | *posargs [element 0] | provenance | | | params_flow.rb:57:1:57:4 | args [element 0] | params_flow.rb:58:21:58:24 | args [element 0] | provenance | | -| params_flow.rb:57:9:57:17 | call to taint | params_flow.rb:57:1:57:4 | args [element 0] | provenance | | +| params_flow.rb:57:8:57:18 | call to [] [element 0] | params_flow.rb:57:1:57:4 | args [element 0] | provenance | | +| params_flow.rb:57:9:57:17 | call to taint | params_flow.rb:57:8:57:18 | call to [] [element 0] | provenance | | | params_flow.rb:58:9:58:17 | call to taint | params_flow.rb:49:13:49:14 | p1 | provenance | | | params_flow.rb:58:20:58:24 | * ... [element 0] | params_flow.rb:49:17:49:24 | *posargs [element 0] | provenance | | | params_flow.rb:58:20:58:24 | * ... [element 0] | params_flow.rb:49:17:49:24 | *posargs [element 0] | provenance | | | params_flow.rb:58:21:58:24 | args [element 0] | params_flow.rb:58:20:58:24 | * ... [element 0] | provenance | | | params_flow.rb:60:1:60:4 | args [element 0] | params_flow.rb:61:10:61:13 | args [element 0] | provenance | | | params_flow.rb:60:1:60:4 | args [element 1] | params_flow.rb:61:10:61:13 | args [element 1] | provenance | | -| params_flow.rb:60:9:60:17 | call to taint | params_flow.rb:60:1:60:4 | args [element 0] | provenance | | -| params_flow.rb:60:20:60:28 | call to taint | params_flow.rb:60:1:60:4 | args [element 1] | provenance | | +| params_flow.rb:60:8:60:29 | call to [] [element 0] | params_flow.rb:60:1:60:4 | args [element 0] | provenance | | +| params_flow.rb:60:8:60:29 | call to [] [element 1] | params_flow.rb:60:1:60:4 | args [element 1] | provenance | | +| params_flow.rb:60:9:60:17 | call to taint | params_flow.rb:60:8:60:29 | call to [] [element 0] | provenance | | +| params_flow.rb:60:20:60:28 | call to taint | params_flow.rb:60:8:60:29 | call to [] [element 1] | provenance | | | params_flow.rb:61:9:61:13 | * ... [element 0] | params_flow.rb:49:13:49:14 | p1 | provenance | | | params_flow.rb:61:9:61:13 | * ... [element 1] | params_flow.rb:49:17:49:24 | *posargs [element 0] | provenance | | | params_flow.rb:61:10:61:13 | args [element 0] | params_flow.rb:61:9:61:13 | * ... [element 0] | provenance | | @@ -94,7 +104,8 @@ edges | params_flow.rb:78:43:78:51 | call to taint | params_flow.rb:69:24:69:24 | w | provenance | | | params_flow.rb:78:54:78:62 | call to taint | params_flow.rb:69:27:69:27 | r | provenance | | | params_flow.rb:80:1:80:4 | args [element 0] | params_flow.rb:81:22:81:25 | args [element 0] | provenance | | -| params_flow.rb:80:9:80:17 | call to taint | params_flow.rb:80:1:80:4 | args [element 0] | provenance | | +| params_flow.rb:80:8:80:51 | call to [] [element 0] | params_flow.rb:80:1:80:4 | args [element 0] | provenance | | +| params_flow.rb:80:9:80:17 | call to taint | params_flow.rb:80:8:80:51 | call to [] [element 0] | provenance | | | params_flow.rb:81:10:81:18 | call to taint | params_flow.rb:69:14:69:14 | x | provenance | | | params_flow.rb:81:21:81:25 | * ... [element 0] | params_flow.rb:69:17:69:17 | y | provenance | | | params_flow.rb:81:22:81:25 | args [element 0] | params_flow.rb:81:21:81:25 | * ... [element 0] | provenance | | @@ -108,10 +119,14 @@ edges | params_flow.rb:93:1:93:4 | args [element 1] | params_flow.rb:94:33:94:36 | args [element 1] | provenance | | | params_flow.rb:93:1:93:4 | args [element 2] | params_flow.rb:94:33:94:36 | args [element 2] | provenance | | | params_flow.rb:93:1:93:4 | args [element 3] | params_flow.rb:94:33:94:36 | args [element 3] | provenance | | -| params_flow.rb:93:9:93:17 | call to taint | params_flow.rb:93:1:93:4 | args [element 0] | provenance | | -| params_flow.rb:93:20:93:28 | call to taint | params_flow.rb:93:1:93:4 | args [element 1] | provenance | | -| params_flow.rb:93:31:93:39 | call to taint | params_flow.rb:93:1:93:4 | args [element 2] | provenance | | -| params_flow.rb:93:42:93:50 | call to taint | params_flow.rb:93:1:93:4 | args [element 3] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] [element 0] | params_flow.rb:93:1:93:4 | args [element 0] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] [element 1] | params_flow.rb:93:1:93:4 | args [element 1] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] [element 2] | params_flow.rb:93:1:93:4 | args [element 2] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] [element 3] | params_flow.rb:93:1:93:4 | args [element 3] | provenance | | +| params_flow.rb:93:9:93:17 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 0] | provenance | | +| params_flow.rb:93:20:93:28 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 1] | provenance | | +| params_flow.rb:93:31:93:39 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 2] | provenance | | +| params_flow.rb:93:42:93:50 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 3] | provenance | | | params_flow.rb:94:10:94:18 | call to taint | params_flow.rb:83:14:83:14 | t | provenance | | | params_flow.rb:94:21:94:29 | call to taint | params_flow.rb:83:17:83:17 | u | provenance | | | params_flow.rb:94:32:94:36 | * ... [element 0] | params_flow.rb:83:20:83:20 | v | provenance | | @@ -146,8 +161,10 @@ edges | params_flow.rb:118:13:118:13 | x [element] | params_flow.rb:118:12:118:13 | * ... [element] | provenance | | | params_flow.rb:130:1:130:4 | args [element 0] | params_flow.rb:131:11:131:14 | args [element 0] | provenance | | | params_flow.rb:130:1:130:4 | args [element 1] | params_flow.rb:131:11:131:14 | args [element 1] | provenance | | -| params_flow.rb:130:9:130:17 | call to taint | params_flow.rb:130:1:130:4 | args [element 0] | provenance | | -| params_flow.rb:130:20:130:28 | call to taint | params_flow.rb:130:1:130:4 | args [element 1] | provenance | | +| params_flow.rb:130:8:130:29 | call to [] [element 0] | params_flow.rb:130:1:130:4 | args [element 0] | provenance | | +| params_flow.rb:130:8:130:29 | call to [] [element 1] | params_flow.rb:130:1:130:4 | args [element 1] | provenance | | +| params_flow.rb:130:9:130:17 | call to taint | params_flow.rb:130:8:130:29 | call to [] [element 0] | provenance | | +| params_flow.rb:130:20:130:28 | call to taint | params_flow.rb:130:8:130:29 | call to [] [element 1] | provenance | | | params_flow.rb:131:10:131:14 | * ... [element 0] | params_flow.rb:83:14:83:14 | t | provenance | | | params_flow.rb:131:10:131:14 | * ... [element 1] | params_flow.rb:83:17:83:17 | u | provenance | | | params_flow.rb:131:11:131:14 | args [element 0] | params_flow.rb:131:10:131:14 | * ... [element 0] | provenance | | @@ -156,7 +173,8 @@ edges | params_flow.rb:133:14:133:18 | *args [element 1] | params_flow.rb:134:10:134:13 | args [element 1] | provenance | | | params_flow.rb:134:10:134:13 | args [element 1] | params_flow.rb:134:10:134:16 | ...[...] | provenance | | | params_flow.rb:137:10:137:43 | * ... [element 1] | params_flow.rb:133:14:133:18 | *args [element 1] | provenance | | -| params_flow.rb:137:23:137:31 | call to taint | params_flow.rb:137:10:137:43 | * ... [element 1] | provenance | | +| params_flow.rb:137:11:137:43 | call to [] [element 1] | params_flow.rb:137:10:137:43 | * ... [element 1] | provenance | | +| params_flow.rb:137:23:137:31 | call to taint | params_flow.rb:137:11:137:43 | call to [] [element 1] | provenance | | | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:154:18:154:19 | p2 | provenance | | | params_flow.rb:154:18:154:19 | p2 | params_flow.rb:154:5:154:6 | [post] p1 [element 0] | provenance | | | params_flow.rb:164:23:164:24 | [post] p1 [element 0] | params_flow.rb:165:6:165:7 | p1 [element 0] | provenance | | @@ -204,12 +222,15 @@ nodes | params_flow.rb:33:26:33:34 | call to taint | semmle.label | call to taint | | params_flow.rb:33:41:33:49 | call to taint | semmle.label | call to taint | | params_flow.rb:34:1:34:4 | args [element :p3] | semmle.label | args [element :p3] | +| params_flow.rb:34:8:34:32 | call to [] [element :p3] | semmle.label | call to [] [element :p3] | | params_flow.rb:34:14:34:22 | call to taint | semmle.label | call to taint | | params_flow.rb:35:12:35:20 | call to taint | semmle.label | call to taint | | params_flow.rb:35:23:35:28 | ** ... [element :p3] | semmle.label | ** ... [element :p3] | | params_flow.rb:35:25:35:28 | args [element :p3] | semmle.label | args [element :p3] | | params_flow.rb:37:1:37:4 | args [element :p1] | semmle.label | args [element :p1] | | params_flow.rb:37:1:37:4 | args [element :p2] | semmle.label | args [element :p2] | +| params_flow.rb:37:8:37:44 | call to [] [element :p1] | semmle.label | call to [] [element :p1] | +| params_flow.rb:37:8:37:44 | call to [] [element :p2] | semmle.label | call to [] [element :p2] | | params_flow.rb:37:16:37:24 | call to taint | semmle.label | call to taint | | params_flow.rb:37:34:37:42 | call to taint | semmle.label | call to taint | | params_flow.rb:38:8:38:13 | ** ... [element :p1] | semmle.label | ** ... [element :p1] | @@ -217,17 +238,21 @@ nodes | params_flow.rb:38:10:38:13 | args [element :p1] | semmle.label | args [element :p1] | | params_flow.rb:38:10:38:13 | args [element :p2] | semmle.label | args [element :p2] | | params_flow.rb:40:1:40:4 | args [element :p1] | semmle.label | args [element :p1] | +| params_flow.rb:40:8:40:26 | call to [] [element :p1] | semmle.label | call to [] [element :p1] | | params_flow.rb:40:16:40:24 | call to taint | semmle.label | call to taint | | params_flow.rb:41:13:41:21 | call to taint | semmle.label | call to taint | | params_flow.rb:41:24:41:29 | ** ... [element :p1] | semmle.label | ** ... [element :p1] | | params_flow.rb:41:26:41:29 | args [element :p1] | semmle.label | args [element :p1] | | params_flow.rb:43:1:43:4 | args [element 0] | semmle.label | args [element 0] | +| params_flow.rb:43:8:43:18 | call to [] [element 0] | semmle.label | call to [] [element 0] | | params_flow.rb:43:9:43:17 | call to taint | semmle.label | call to taint | | params_flow.rb:44:12:44:20 | call to taint | semmle.label | call to taint | | params_flow.rb:44:23:44:27 | * ... [element 0] | semmle.label | * ... [element 0] | | params_flow.rb:44:24:44:27 | args [element 0] | semmle.label | args [element 0] | | params_flow.rb:46:1:46:4 | args [element 0] | semmle.label | args [element 0] | | params_flow.rb:46:1:46:4 | args [element 1] | semmle.label | args [element 1] | +| params_flow.rb:46:8:46:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| params_flow.rb:46:8:46:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | | params_flow.rb:46:9:46:17 | call to taint | semmle.label | call to taint | | params_flow.rb:46:20:46:28 | call to taint | semmle.label | call to taint | | params_flow.rb:47:12:47:16 | * ... [element 0] | semmle.label | * ... [element 0] | @@ -245,12 +270,15 @@ nodes | params_flow.rb:55:9:55:17 | call to taint | semmle.label | call to taint | | params_flow.rb:55:20:55:28 | call to taint | semmle.label | call to taint | | params_flow.rb:57:1:57:4 | args [element 0] | semmle.label | args [element 0] | +| params_flow.rb:57:8:57:18 | call to [] [element 0] | semmle.label | call to [] [element 0] | | params_flow.rb:57:9:57:17 | call to taint | semmle.label | call to taint | | params_flow.rb:58:9:58:17 | call to taint | semmle.label | call to taint | | params_flow.rb:58:20:58:24 | * ... [element 0] | semmle.label | * ... [element 0] | | params_flow.rb:58:21:58:24 | args [element 0] | semmle.label | args [element 0] | | params_flow.rb:60:1:60:4 | args [element 0] | semmle.label | args [element 0] | | params_flow.rb:60:1:60:4 | args [element 1] | semmle.label | args [element 1] | +| params_flow.rb:60:8:60:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| params_flow.rb:60:8:60:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | | params_flow.rb:60:9:60:17 | call to taint | semmle.label | call to taint | | params_flow.rb:60:20:60:28 | call to taint | semmle.label | call to taint | | params_flow.rb:61:9:61:13 | * ... [element 0] | semmle.label | * ... [element 0] | @@ -277,6 +305,7 @@ nodes | params_flow.rb:78:43:78:51 | call to taint | semmle.label | call to taint | | params_flow.rb:78:54:78:62 | call to taint | semmle.label | call to taint | | params_flow.rb:80:1:80:4 | args [element 0] | semmle.label | args [element 0] | +| params_flow.rb:80:8:80:51 | call to [] [element 0] | semmle.label | call to [] [element 0] | | params_flow.rb:80:9:80:17 | call to taint | semmle.label | call to taint | | params_flow.rb:81:10:81:18 | call to taint | semmle.label | call to taint | | params_flow.rb:81:21:81:25 | * ... [element 0] | semmle.label | * ... [element 0] | @@ -297,6 +326,10 @@ nodes | params_flow.rb:93:1:93:4 | args [element 1] | semmle.label | args [element 1] | | params_flow.rb:93:1:93:4 | args [element 2] | semmle.label | args [element 2] | | params_flow.rb:93:1:93:4 | args [element 3] | semmle.label | args [element 3] | +| params_flow.rb:93:8:93:51 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| params_flow.rb:93:8:93:51 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| params_flow.rb:93:8:93:51 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| params_flow.rb:93:8:93:51 | call to [] [element 3] | semmle.label | call to [] [element 3] | | params_flow.rb:93:9:93:17 | call to taint | semmle.label | call to taint | | params_flow.rb:93:20:93:28 | call to taint | semmle.label | call to taint | | params_flow.rb:93:31:93:39 | call to taint | semmle.label | call to taint | @@ -339,6 +372,8 @@ nodes | params_flow.rb:118:13:118:13 | x [element] | semmle.label | x [element] | | params_flow.rb:130:1:130:4 | args [element 0] | semmle.label | args [element 0] | | params_flow.rb:130:1:130:4 | args [element 1] | semmle.label | args [element 1] | +| params_flow.rb:130:8:130:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| params_flow.rb:130:8:130:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | | params_flow.rb:130:9:130:17 | call to taint | semmle.label | call to taint | | params_flow.rb:130:20:130:28 | call to taint | semmle.label | call to taint | | params_flow.rb:131:10:131:14 | * ... [element 0] | semmle.label | * ... [element 0] | @@ -350,6 +385,7 @@ nodes | params_flow.rb:134:10:134:13 | args [element 1] | semmle.label | args [element 1] | | params_flow.rb:134:10:134:16 | ...[...] | semmle.label | ...[...] | | params_flow.rb:137:10:137:43 | * ... [element 1] | semmle.label | * ... [element 1] | +| params_flow.rb:137:11:137:43 | call to [] [element 1] | semmle.label | call to [] [element 1] | | params_flow.rb:137:23:137:31 | call to taint | semmle.label | call to taint | | params_flow.rb:153:28:153:29 | p2 | semmle.label | p2 | | params_flow.rb:154:5:154:6 | [post] p1 [element 0] | semmle.label | [post] p1 [element 0] | diff --git a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected index 693832e5577..09c9d040e55 100644 --- a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected +++ b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected @@ -93,7 +93,8 @@ edges | summaries.rb:48:24:48:41 | call to source | summaries.rb:48:8:48:42 | call to preserveTaint | provenance | | | summaries.rb:51:24:51:30 | tainted | summaries.rb:51:6:51:31 | call to namedArg | provenance | | | summaries.rb:53:1:53:4 | args [element :foo] | summaries.rb:54:21:54:24 | args [element :foo] | provenance | | -| summaries.rb:53:15:53:31 | call to source | summaries.rb:53:1:53:4 | args [element :foo] | provenance | | +| summaries.rb:53:8:53:33 | call to [] [element :foo] | summaries.rb:53:1:53:4 | args [element :foo] | provenance | | +| summaries.rb:53:15:53:31 | call to source | summaries.rb:53:8:53:33 | call to [] [element :foo] | provenance | | | summaries.rb:54:19:54:24 | ** ... [element :foo] | summaries.rb:54:6:54:25 | call to namedArg | provenance | | | summaries.rb:54:21:54:24 | args [element :foo] | summaries.rb:54:19:54:24 | ** ... [element :foo] | provenance | | | summaries.rb:56:22:56:28 | tainted | summaries.rb:56:6:56:29 | call to anyArg | provenance | | @@ -118,10 +119,14 @@ edges | summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:86:6:86:6 | a [element 2] | provenance | | | summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:95:1:95:1 | a [element 2] | provenance | | | summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:95:1:95:1 | a [element 2] | provenance | | -| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:1:79:1 | a [element 1] | provenance | | -| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:1:79:1 | a [element 1] | provenance | | -| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:1:79:1 | a [element 2] | provenance | | -| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:1:79:1 | a [element 2] | provenance | | +| summaries.rb:79:5:79:47 | call to [] [element 1] | summaries.rb:79:1:79:1 | a [element 1] | provenance | | +| summaries.rb:79:5:79:47 | call to [] [element 1] | summaries.rb:79:1:79:1 | a [element 1] | provenance | | +| summaries.rb:79:5:79:47 | call to [] [element 2] | summaries.rb:79:1:79:1 | a [element 2] | provenance | | +| summaries.rb:79:5:79:47 | call to [] [element 2] | summaries.rb:79:1:79:1 | a [element 2] | provenance | | +| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:5:79:47 | call to [] [element 1] | provenance | | +| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:5:79:47 | call to [] [element 1] | provenance | | +| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:5:79:47 | call to [] [element 2] | provenance | | +| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:5:79:47 | call to [] [element 2] | provenance | | | summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:82:6:82:6 | a [element] | provenance | | | summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:82:6:82:6 | a [element] | provenance | | | summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:84:6:84:6 | a [element] | provenance | | @@ -317,6 +322,7 @@ nodes | summaries.rb:51:6:51:31 | call to namedArg | semmle.label | call to namedArg | | summaries.rb:51:24:51:30 | tainted | semmle.label | tainted | | summaries.rb:53:1:53:4 | args [element :foo] | semmle.label | args [element :foo] | +| summaries.rb:53:8:53:33 | call to [] [element :foo] | semmle.label | call to [] [element :foo] | | summaries.rb:53:15:53:31 | call to source | semmle.label | call to source | | summaries.rb:54:6:54:25 | call to namedArg | semmle.label | call to namedArg | | summaries.rb:54:19:54:24 | ** ... [element :foo] | semmle.label | ** ... [element :foo] | @@ -340,6 +346,10 @@ nodes | summaries.rb:79:1:79:1 | a [element 1] | semmle.label | a [element 1] | | summaries.rb:79:1:79:1 | a [element 2] | semmle.label | a [element 2] | | summaries.rb:79:1:79:1 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:79:5:79:47 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| summaries.rb:79:5:79:47 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| summaries.rb:79:5:79:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| summaries.rb:79:5:79:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | | summaries.rb:79:15:79:29 | call to source | semmle.label | call to source | | summaries.rb:79:15:79:29 | call to source | semmle.label | call to source | | summaries.rb:79:32:79:46 | call to source | semmle.label | call to source | diff --git a/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected b/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected index 6f2810e13d7..9276cc0b350 100644 --- a/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected +++ b/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected @@ -11,7 +11,7 @@ actionControllerControllerClasses | filter_flow.rb:42:1:57:3 | ThreeController | | filter_flow.rb:59:1:73:3 | FourController | | filter_flow.rb:75:1:93:3 | FiveController | -| input_access.rb:1:1:50:3 | UsersController | +| input_access.rb:1:1:58:3 | UsersController | | params_flow.rb:1:1:162:3 | MyController | | params_flow.rb:170:1:178:3 | Subclass | actionControllerActionMethods @@ -48,7 +48,7 @@ actionControllerActionMethods | filter_flow.rb:83:3:84:5 | b | | filter_flow.rb:86:3:88:5 | c | | filter_flow.rb:90:3:92:5 | taint_foo | -| input_access.rb:2:3:49:5 | index | +| input_access.rb:2:3:57:5 | index | | logging.rb:2:5:8:7 | index | | params_flow.rb:2:3:4:5 | m1 | | params_flow.rb:6:3:8:5 | m2 | @@ -230,43 +230,51 @@ httpInputAccesses | filter_flow.rb:91:12:91:17 | call to params | ActionController::Metal#params | | input_access.rb:3:5:3:18 | call to params | ActionDispatch::Request#params | | input_access.rb:4:5:4:22 | call to parameters | ActionDispatch::Request#parameters | -| input_access.rb:5:5:5:15 | call to GET | ActionDispatch::Request#GET | -| input_access.rb:6:5:6:16 | call to POST | ActionDispatch::Request#POST | -| input_access.rb:7:5:7:28 | call to query_parameters | ActionDispatch::Request#query_parameters | -| input_access.rb:8:5:8:30 | call to request_parameters | ActionDispatch::Request#request_parameters | -| input_access.rb:9:5:9:31 | call to filtered_parameters | ActionDispatch::Request#filtered_parameters | -| input_access.rb:11:5:11:25 | call to authorization | ActionDispatch::Request#authorization | -| input_access.rb:12:5:12:23 | call to script_name | ActionDispatch::Request#script_name | -| input_access.rb:13:5:13:21 | call to path_info | ActionDispatch::Request#path_info | -| input_access.rb:14:5:14:22 | call to user_agent | ActionDispatch::Request#user_agent | -| input_access.rb:15:5:15:19 | call to referer | ActionDispatch::Request#referer | -| input_access.rb:16:5:16:20 | call to referrer | ActionDispatch::Request#referrer | -| input_access.rb:17:5:17:26 | call to host_authority | ActionDispatch::Request#host_authority | -| input_access.rb:18:5:18:24 | call to content_type | ActionDispatch::Request#content_type | -| input_access.rb:19:5:19:16 | call to host | ActionDispatch::Request#host | -| input_access.rb:20:5:20:20 | call to hostname | ActionDispatch::Request#hostname | -| input_access.rb:21:5:21:27 | call to accept_encoding | ActionDispatch::Request#accept_encoding | -| input_access.rb:22:5:22:27 | call to accept_language | ActionDispatch::Request#accept_language | -| input_access.rb:23:5:23:25 | call to if_none_match | ActionDispatch::Request#if_none_match | -| input_access.rb:24:5:24:31 | call to if_none_match_etags | ActionDispatch::Request#if_none_match_etags | -| input_access.rb:25:5:25:29 | call to content_mime_type | ActionDispatch::Request#content_mime_type | -| input_access.rb:27:5:27:21 | call to authority | ActionDispatch::Request#authority | -| input_access.rb:28:5:28:16 | call to host | ActionDispatch::Request#host | -| input_access.rb:29:5:29:26 | call to host_authority | ActionDispatch::Request#host_authority | -| input_access.rb:30:5:30:26 | call to host_with_port | ActionDispatch::Request#host_with_port | -| input_access.rb:31:5:31:20 | call to hostname | ActionDispatch::Request#hostname | -| input_access.rb:32:5:32:25 | call to forwarded_for | ActionDispatch::Request#forwarded_for | -| input_access.rb:33:5:33:26 | call to forwarded_host | ActionDispatch::Request#forwarded_host | -| input_access.rb:34:5:34:16 | call to port | ActionDispatch::Request#port | -| input_access.rb:35:5:35:26 | call to forwarded_port | ActionDispatch::Request#forwarded_port | -| input_access.rb:37:5:37:22 | call to media_type | ActionDispatch::Request#media_type | -| input_access.rb:38:5:38:29 | call to media_type_params | ActionDispatch::Request#media_type_params | -| input_access.rb:39:5:39:27 | call to content_charset | ActionDispatch::Request#content_charset | -| input_access.rb:40:5:40:20 | call to base_url | ActionDispatch::Request#base_url | -| input_access.rb:42:5:42:16 | call to body | ActionDispatch::Request#body | -| input_access.rb:43:5:43:20 | call to raw_post | ActionDispatch::Request#raw_post | -| input_access.rb:45:5:45:30 | ...[...] | ActionDispatch::Request#env[] | -| input_access.rb:47:5:47:39 | ...[...] | ActionDispatch::Request#env[] | +| input_access.rb:5:5:5:29 | ...[...] | ActionDispatch::Request#[] | +| input_access.rb:6:5:6:15 | call to GET | ActionDispatch::Request#GET | +| input_access.rb:7:5:7:16 | call to POST | ActionDispatch::Request#POST | +| input_access.rb:8:5:8:28 | call to query_parameters | ActionDispatch::Request#query_parameters | +| input_access.rb:9:5:9:30 | call to request_parameters | ActionDispatch::Request#request_parameters | +| input_access.rb:10:5:10:31 | call to filtered_parameters | ActionDispatch::Request#filtered_parameters | +| input_access.rb:11:5:11:24 | call to query_string | ActionDispatch::Request#query_string | +| input_access.rb:13:5:13:25 | call to authorization | ActionDispatch::Request#authorization | +| input_access.rb:14:5:14:23 | call to script_name | ActionDispatch::Request#script_name | +| input_access.rb:15:5:15:21 | call to path_info | ActionDispatch::Request#path_info | +| input_access.rb:16:5:16:22 | call to user_agent | ActionDispatch::Request#user_agent | +| input_access.rb:17:5:17:19 | call to referer | ActionDispatch::Request#referer | +| input_access.rb:18:5:18:20 | call to referrer | ActionDispatch::Request#referrer | +| input_access.rb:19:5:19:19 | call to headers | ActionDispatch::Request#headers | +| input_access.rb:20:5:20:19 | call to cookies | ActionDispatch::Request#cookies | +| input_access.rb:21:5:21:22 | call to cookie_jar | ActionDispatch::Request#cookie_jar | +| input_access.rb:22:5:22:24 | call to content_type | ActionDispatch::Request#content_type | +| input_access.rb:23:5:23:18 | call to accept | ActionDispatch::Request#accept | +| input_access.rb:24:5:24:27 | call to accept_encoding | ActionDispatch::Request#accept_encoding | +| input_access.rb:25:5:25:27 | call to accept_language | ActionDispatch::Request#accept_language | +| input_access.rb:26:5:26:25 | call to if_none_match | ActionDispatch::Request#if_none_match | +| input_access.rb:27:5:27:31 | call to if_none_match_etags | ActionDispatch::Request#if_none_match_etags | +| input_access.rb:28:5:28:29 | call to content_mime_type | ActionDispatch::Request#content_mime_type | +| input_access.rb:30:5:30:21 | call to authority | ActionDispatch::Request#authority | +| input_access.rb:31:5:31:16 | call to host | ActionDispatch::Request#host | +| input_access.rb:32:5:32:26 | call to host_authority | ActionDispatch::Request#host_authority | +| input_access.rb:33:5:33:26 | call to host_with_port | ActionDispatch::Request#host_with_port | +| input_access.rb:34:5:34:30 | call to raw_host_with_port | ActionDispatch::Request#raw_host_with_port | +| input_access.rb:35:5:35:20 | call to hostname | ActionDispatch::Request#hostname | +| input_access.rb:36:5:36:25 | call to forwarded_for | ActionDispatch::Request#forwarded_for | +| input_access.rb:37:5:37:26 | call to forwarded_host | ActionDispatch::Request#forwarded_host | +| input_access.rb:38:5:38:16 | call to port | ActionDispatch::Request#port | +| input_access.rb:39:5:39:26 | call to forwarded_port | ActionDispatch::Request#forwarded_port | +| input_access.rb:40:5:40:23 | call to port_string | ActionDispatch::Request#port_string | +| input_access.rb:41:5:41:18 | call to domain | ActionDispatch::Request#domain | +| input_access.rb:42:5:42:21 | call to subdomain | ActionDispatch::Request#subdomain | +| input_access.rb:43:5:43:22 | call to subdomains | ActionDispatch::Request#subdomains | +| input_access.rb:45:5:45:22 | call to media_type | ActionDispatch::Request#media_type | +| input_access.rb:46:5:46:29 | call to media_type_params | ActionDispatch::Request#media_type_params | +| input_access.rb:47:5:47:27 | call to content_charset | ActionDispatch::Request#content_charset | +| input_access.rb:48:5:48:20 | call to base_url | ActionDispatch::Request#base_url | +| input_access.rb:50:5:50:16 | call to body | ActionDispatch::Request#body | +| input_access.rb:51:5:51:20 | call to raw_post | ActionDispatch::Request#raw_post | +| input_access.rb:53:5:53:30 | ...[...] | ActionDispatch::Request#env[] | +| input_access.rb:55:5:55:39 | ...[...] | ActionDispatch::Request#env[] | | logging.rb:5:22:5:35 | call to params | ActionDispatch::Request#params | | params_flow.rb:3:10:3:15 | call to params | ActionController::Metal#params | | params_flow.rb:7:10:7:15 | call to params | ActionController::Metal#params | diff --git a/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb b/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb index 334e36d3f3c..d5716bf4bd8 100644 --- a/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb +++ b/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb @@ -2,11 +2,13 @@ class UsersController < ActionController::Base def index request.params request.parameters + request["parameter_name"] request.GET request.POST request.query_parameters request.request_parameters request.filtered_parameters + request.query_string request.authorization request.script_name @@ -14,10 +16,11 @@ class UsersController < ActionController::Base request.user_agent request.referer request.referrer - request.host_authority + request.headers + request.cookies + request.cookie_jar request.content_type - request.host - request.hostname + request.accept request.accept_encoding request.accept_language request.if_none_match @@ -28,11 +31,16 @@ class UsersController < ActionController::Base request.host request.host_authority request.host_with_port + request.raw_host_with_port request.hostname request.forwarded_for request.forwarded_host request.port request.forwarded_port + request.port_string + request.domain + request.subdomain + request.subdomains request.media_type request.media_type_params diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index b273bddbee6..5dd0dbd9a15 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -1,7 +1,7 @@ activeRecordModelClasses | ActiveRecord.rb:1:1:3:3 | UserGroup | -| ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:21:1:25:3 | Admin | +| ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:34:1:38:3 | Admin | | associations.rb:1:1:3:3 | Author | | associations.rb:5:1:9:3 | Post | | associations.rb:11:1:13:3 | Tag | @@ -10,20 +10,33 @@ activeRecordInstances | ActiveRecord.rb:9:5:9:68 | call to find | | ActiveRecord.rb:13:5:13:40 | call to find_by | | ActiveRecord.rb:13:5:13:46 | call to users | -| ActiveRecord.rb:16:3:18:5 | self (exec) | -| ActiveRecord.rb:16:3:18:5 | self in exec | +| ActiveRecord.rb:16:3:31:5 | self (exec) | +| ActiveRecord.rb:16:3:31:5 | self in exec | | ActiveRecord.rb:17:5:17:14 | self | -| ActiveRecord.rb:39:5:39:51 | call to authenticate | -| ActiveRecord.rb:40:5:40:30 | call to find_by_name | -| ActiveRecord.rb:59:5:61:7 | if ... | -| ActiveRecord.rb:59:43:60:40 | then ... | -| ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:64:5:64:33 | call to find_by | -| ActiveRecord.rb:66:5:66:34 | call to find | -| ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:88:5:88:16 | call to create | +| ActiveRecord.rb:18:5:18:14 | self | +| ActiveRecord.rb:19:5:19:14 | self | +| ActiveRecord.rb:20:5:20:14 | self | +| ActiveRecord.rb:21:5:21:14 | self | +| ActiveRecord.rb:22:5:22:14 | self | +| ActiveRecord.rb:23:5:23:14 | self | +| ActiveRecord.rb:24:5:24:14 | self | +| ActiveRecord.rb:25:5:25:14 | self | +| ActiveRecord.rb:26:5:26:14 | self | +| ActiveRecord.rb:27:5:27:14 | self | +| ActiveRecord.rb:28:5:28:14 | self | +| ActiveRecord.rb:29:5:29:14 | self | +| ActiveRecord.rb:30:5:30:14 | self | +| ActiveRecord.rb:52:5:52:51 | call to authenticate | +| ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:72:5:74:7 | if ... | +| ActiveRecord.rb:72:43:73:40 | then ... | +| ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:77:5:77:33 | call to find_by | +| ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:101:5:101:16 | call to create | | associations.rb:19:1:19:7 | author1 | | associations.rb:19:1:19:20 | ... = ... | | associations.rb:19:11:19:20 | call to new | @@ -108,47 +121,60 @@ activeRecordInstances | associations.rb:53:1:53:34 | call to find | activeRecordSqlExecutionRanges | ActiveRecord.rb:9:33:9:67 | "name='#{...}' and pass='#{...}'" | -| ActiveRecord.rb:17:24:17:24 | q | -| ActiveRecord.rb:23:16:23:24 | condition | -| ActiveRecord.rb:32:30:32:44 | ...[...] | -| ActiveRecord.rb:33:20:33:42 | "id = '#{...}'" | -| ActiveRecord.rb:34:21:34:45 | call to [] | -| ActiveRecord.rb:35:16:35:21 | <<-SQL | -| ActiveRecord.rb:38:20:38:47 | "user.id = '#{...}'" | -| ActiveRecord.rb:50:20:50:32 | ... + ... | -| ActiveRecord.rb:56:16:56:28 | "name #{...}" | -| ActiveRecord.rb:60:20:60:39 | "username = #{...}" | -| ActiveRecord.rb:72:21:72:44 | ...[...] | -| ActiveRecord.rb:110:27:110:76 | "this is an unsafe annotation:..." | +| ActiveRecord.rb:17:23:17:23 | q | +| ActiveRecord.rb:18:23:18:23 | q | +| ActiveRecord.rb:19:27:19:27 | q | +| ActiveRecord.rb:20:28:20:28 | q | +| ActiveRecord.rb:21:28:21:28 | q | +| ActiveRecord.rb:22:28:22:28 | q | +| ActiveRecord.rb:23:24:23:24 | q | +| ActiveRecord.rb:24:23:24:23 | q | +| ActiveRecord.rb:25:27:25:27 | q | +| ActiveRecord.rb:26:27:26:27 | q | +| ActiveRecord.rb:27:28:27:28 | q | +| ActiveRecord.rb:28:29:28:29 | q | +| ActiveRecord.rb:29:30:29:30 | q | +| ActiveRecord.rb:30:23:30:23 | q | +| ActiveRecord.rb:36:16:36:24 | condition | +| ActiveRecord.rb:45:30:45:44 | ...[...] | +| ActiveRecord.rb:46:20:46:42 | "id = '#{...}'" | +| ActiveRecord.rb:47:21:47:45 | call to [] | +| ActiveRecord.rb:48:16:48:21 | <<-SQL | +| ActiveRecord.rb:51:20:51:47 | "user.id = '#{...}'" | +| ActiveRecord.rb:63:20:63:32 | ... + ... | +| ActiveRecord.rb:69:16:69:28 | "name #{...}" | +| ActiveRecord.rb:73:20:73:39 | "username = #{...}" | +| ActiveRecord.rb:85:21:85:44 | ...[...] | +| ActiveRecord.rb:123:27:123:76 | "this is an unsafe annotation:..." | activeRecordModelClassMethodCalls | ActiveRecord.rb:2:3:2:17 | call to has_many | | ActiveRecord.rb:6:3:6:24 | call to belongs_to | | ActiveRecord.rb:9:5:9:68 | call to find | | ActiveRecord.rb:13:5:13:40 | call to find_by | | ActiveRecord.rb:13:5:13:46 | call to users | -| ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:32:5:32:45 | call to calculate | -| ActiveRecord.rb:33:5:33:43 | call to delete_by | -| ActiveRecord.rb:34:5:34:46 | call to destroy_by | -| ActiveRecord.rb:35:5:35:35 | call to where | -| ActiveRecord.rb:38:5:38:14 | call to where | -| ActiveRecord.rb:38:5:38:48 | call to not | -| ActiveRecord.rb:40:5:40:30 | call to find_by_name | -| ActiveRecord.rb:41:5:41:36 | call to not_a_find_by_method | -| ActiveRecord.rb:50:5:50:33 | call to delete_by | -| ActiveRecord.rb:56:5:56:29 | call to order | -| ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:64:5:64:33 | call to find_by | -| ActiveRecord.rb:66:5:66:34 | call to find | -| ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:88:5:88:16 | call to create | -| ActiveRecord.rb:92:5:92:27 | call to update | -| ActiveRecord.rb:96:5:96:69 | call to update | -| ActiveRecord.rb:100:5:100:71 | call to update | -| ActiveRecord.rb:106:13:106:54 | call to annotate | -| ActiveRecord.rb:110:13:110:77 | call to annotate | +| ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:45:5:45:45 | call to calculate | +| ActiveRecord.rb:46:5:46:43 | call to delete_by | +| ActiveRecord.rb:47:5:47:46 | call to destroy_by | +| ActiveRecord.rb:48:5:48:35 | call to where | +| ActiveRecord.rb:51:5:51:14 | call to where | +| ActiveRecord.rb:51:5:51:48 | call to not | +| ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:54:5:54:36 | call to not_a_find_by_method | +| ActiveRecord.rb:63:5:63:33 | call to delete_by | +| ActiveRecord.rb:69:5:69:29 | call to order | +| ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:77:5:77:33 | call to find_by | +| ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:101:5:101:16 | call to create | +| ActiveRecord.rb:105:5:105:27 | call to update | +| ActiveRecord.rb:109:5:109:69 | call to update | +| ActiveRecord.rb:113:5:113:71 | call to update | +| ActiveRecord.rb:119:13:119:54 | call to annotate | +| ActiveRecord.rb:123:13:123:77 | call to annotate | | associations.rb:2:3:2:17 | call to has_many | | associations.rb:6:3:6:20 | call to belongs_to | | associations.rb:7:3:7:20 | call to has_many | @@ -204,41 +230,41 @@ activeRecordModelClassMethodCalls activeRecordModelClassMethodCallsReplacement | ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:2:3:2:17 | call to has_many | | ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:13:5:13:40 | call to find_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:6:3:6:24 | call to belongs_to | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:9:5:9:68 | call to find | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:32:5:32:45 | call to calculate | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:33:5:33:43 | call to delete_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:34:5:34:46 | call to destroy_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:35:5:35:35 | call to where | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:38:5:38:14 | call to where | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:39:5:39:51 | call to authenticate | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:40:5:40:30 | call to find_by_name | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:41:5:41:36 | call to not_a_find_by_method | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:50:5:50:33 | call to delete_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:56:5:56:29 | call to order | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:64:5:64:33 | call to find_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:66:5:66:34 | call to find | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:72:5:72:45 | call to delete_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:88:5:88:16 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:92:5:92:27 | call to update | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:96:5:96:69 | call to update | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:100:5:100:71 | call to update | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:106:13:106:54 | call to annotate | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:110:13:110:77 | call to annotate | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:72:5:72:45 | call to delete_by | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:88:5:88:16 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:92:5:92:27 | call to update | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:96:5:96:69 | call to update | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:100:5:100:71 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:6:3:6:24 | call to belongs_to | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:9:5:9:68 | call to find | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:45:5:45:45 | call to calculate | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:46:5:46:43 | call to delete_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:47:5:47:46 | call to destroy_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:48:5:48:35 | call to where | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:51:5:51:14 | call to where | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:52:5:52:51 | call to authenticate | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:54:5:54:36 | call to not_a_find_by_method | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:63:5:63:33 | call to delete_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:69:5:69:29 | call to order | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:77:5:77:33 | call to find_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:85:5:85:45 | call to delete_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:101:5:101:16 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:105:5:105:27 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:109:5:109:69 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:113:5:113:71 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:119:13:119:54 | call to annotate | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:123:13:123:77 | call to annotate | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:85:5:85:45 | call to delete_by | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:101:5:101:16 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:105:5:105:27 | call to update | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:109:5:109:69 | call to update | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:113:5:113:71 | call to update | | associations.rb:1:1:3:3 | Author | associations.rb:2:3:2:17 | call to has_many | | associations.rb:1:1:3:3 | Author | associations.rb:19:11:19:20 | call to new | | associations.rb:5:1:9:3 | Post | associations.rb:6:3:6:20 | call to belongs_to | @@ -248,29 +274,29 @@ activeRecordModelClassMethodCallsReplacement | associations.rb:15:1:17:3 | Comment | associations.rb:16:3:16:18 | call to belongs_to | potentiallyUnsafeSqlExecutingMethodCall | ActiveRecord.rb:9:5:9:68 | call to find | -| ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:32:5:32:45 | call to calculate | -| ActiveRecord.rb:33:5:33:43 | call to delete_by | -| ActiveRecord.rb:34:5:34:46 | call to destroy_by | -| ActiveRecord.rb:35:5:35:35 | call to where | -| ActiveRecord.rb:38:5:38:48 | call to not | -| ActiveRecord.rb:50:5:50:33 | call to delete_by | -| ActiveRecord.rb:56:5:56:29 | call to order | -| ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:110:13:110:77 | call to annotate | +| ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:45:5:45:45 | call to calculate | +| ActiveRecord.rb:46:5:46:43 | call to delete_by | +| ActiveRecord.rb:47:5:47:46 | call to destroy_by | +| ActiveRecord.rb:48:5:48:35 | call to where | +| ActiveRecord.rb:51:5:51:48 | call to not | +| ActiveRecord.rb:63:5:63:33 | call to delete_by | +| ActiveRecord.rb:69:5:69:29 | call to order | +| ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:123:13:123:77 | call to annotate | activeRecordModelInstantiations -| ActiveRecord.rb:9:5:9:68 | call to find | ActiveRecord.rb:5:1:19:3 | User | +| ActiveRecord.rb:9:5:9:68 | call to find | ActiveRecord.rb:5:1:32:3 | User | | ActiveRecord.rb:13:5:13:40 | call to find_by | ActiveRecord.rb:1:1:3:3 | UserGroup | -| ActiveRecord.rb:13:5:13:46 | call to users | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:16:3:18:5 | self in exec | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:40:5:40:30 | call to find_by_name | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:60:7:60:40 | call to find_by | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:64:5:64:33 | call to find_by | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:66:5:66:34 | call to find | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:76:5:76:24 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | -| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | -| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | -| ActiveRecord.rb:88:5:88:16 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | +| ActiveRecord.rb:13:5:13:46 | call to users | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:16:3:31:5 | self in exec | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:53:5:53:30 | call to find_by_name | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:73:7:73:40 | call to find_by | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:77:5:77:33 | call to find_by | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:79:5:79:34 | call to find | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:89:5:89:24 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | +| ActiveRecord.rb:93:5:93:66 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | +| ActiveRecord.rb:97:5:97:68 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | +| ActiveRecord.rb:101:5:101:16 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | | associations.rb:19:11:19:20 | call to new | associations.rb:1:1:3:3 | Author | | associations.rb:21:9:21:21 | call to posts | associations.rb:5:1:9:3 | Post | | associations.rb:21:9:21:28 | call to create | associations.rb:5:1:9:3 | Post | @@ -312,13 +338,13 @@ activeRecordModelInstantiations | associations.rb:53:1:53:13 | call to posts | associations.rb:5:1:9:3 | Post | | associations.rb:53:1:53:20 | call to reload | associations.rb:5:1:9:3 | Post | persistentWriteAccesses -| ActiveRecord.rb:76:5:76:24 | call to create | ActiveRecord.rb:76:18:76:23 | call to params | -| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:80:24:80:36 | ...[...] | -| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:80:49:80:65 | ...[...] | -| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:84:25:84:37 | ...[...] | -| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:84:50:84:66 | ...[...] | -| ActiveRecord.rb:92:5:92:27 | call to update | ActiveRecord.rb:92:21:92:26 | call to params | -| ActiveRecord.rb:96:5:96:69 | call to update | ActiveRecord.rb:96:27:96:39 | ...[...] | -| ActiveRecord.rb:96:5:96:69 | call to update | ActiveRecord.rb:96:52:96:68 | ...[...] | -| ActiveRecord.rb:100:5:100:71 | call to update | ActiveRecord.rb:100:21:100:70 | call to [] | +| ActiveRecord.rb:89:5:89:24 | call to create | ActiveRecord.rb:89:18:89:23 | call to params | +| ActiveRecord.rb:93:5:93:66 | call to create | ActiveRecord.rb:93:24:93:36 | ...[...] | +| ActiveRecord.rb:93:5:93:66 | call to create | ActiveRecord.rb:93:49:93:65 | ...[...] | +| ActiveRecord.rb:97:5:97:68 | call to create | ActiveRecord.rb:97:25:97:37 | ...[...] | +| ActiveRecord.rb:97:5:97:68 | call to create | ActiveRecord.rb:97:50:97:66 | ...[...] | +| ActiveRecord.rb:105:5:105:27 | call to update | ActiveRecord.rb:105:21:105:26 | call to params | +| ActiveRecord.rb:109:5:109:69 | call to update | ActiveRecord.rb:109:27:109:39 | ...[...] | +| ActiveRecord.rb:109:5:109:69 | call to update | ActiveRecord.rb:109:52:109:68 | ...[...] | +| ActiveRecord.rb:113:5:113:71 | call to update | ActiveRecord.rb:113:21:113:70 | call to [] | | associations.rb:31:16:31:22 | ... = ... | associations.rb:31:16:31:22 | author2 | diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb index dca8f3c43d3..3c1468acf45 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb @@ -14,7 +14,20 @@ class User < ApplicationRecord end def exec(q) + connection.create(q) + connection.delete(q) + connection.exec_query(q) + connection.exec_insert(q) + connection.exec_delete(q) + connection.exec_update(q) connection.execute(q) + connection.insert(q) + connection.select_all(q) + connection.select_one(q) + connection.select_rows(q) + connection.select_value(q) + connection.select_values(q) + connection.update(q) end end 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 4eadde7fa54..c6c8b9744bd 100644 --- a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected +++ b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected @@ -2,32 +2,37 @@ testFailures | hash_extensions.rb:126:10:126:19 | call to sole | Unexpected result: hasValueFlow=b | edges | active_support.rb:180:5:180:5 | x [element 0] | active_support.rb:181:9:181:9 | x [element 0] | provenance | | -| active_support.rb:180:10:180:17 | call to source | active_support.rb:180:5:180:5 | x [element 0] | provenance | | +| active_support.rb:180:9:180:18 | call to [] [element 0] | active_support.rb:180:5:180:5 | x [element 0] | provenance | | +| active_support.rb:180:10:180:17 | call to source | active_support.rb:180:9:180:18 | call to [] [element 0] | provenance | | | active_support.rb:181:5:181:5 | y [element] | active_support.rb:182:10:182:10 | y [element] | provenance | | | active_support.rb:181:9:181:9 | x [element 0] | active_support.rb:181:9:181:23 | call to compact_blank [element] | provenance | | | active_support.rb:181:9:181:23 | call to compact_blank [element] | active_support.rb:181:5:181:5 | y [element] | provenance | | | active_support.rb:182:10:182:10 | y [element] | active_support.rb:182:10:182:13 | ...[...] | provenance | | | active_support.rb:186:5:186:5 | x [element 0] | active_support.rb:187:9:187:9 | x [element 0] | provenance | | -| active_support.rb:186:10:186:18 | call to source | active_support.rb:186:5:186:5 | x [element 0] | provenance | | +| active_support.rb:186:9:186:22 | call to [] [element 0] | active_support.rb:186:5:186:5 | x [element 0] | provenance | | +| active_support.rb:186:10:186:18 | call to source | active_support.rb:186:9:186:22 | call to [] [element 0] | provenance | | | active_support.rb:187:5:187:5 | y [element] | active_support.rb:188:10:188:10 | y [element] | provenance | | | active_support.rb:187:9:187:9 | x [element 0] | active_support.rb:187:9:187:21 | call to excluding [element] | provenance | | | active_support.rb:187:9:187:21 | call to excluding [element] | active_support.rb:187:5:187:5 | y [element] | provenance | | | active_support.rb:188:10:188:10 | y [element] | active_support.rb:188:10:188:13 | ...[...] | provenance | | | active_support.rb:192:5:192:5 | x [element 0] | active_support.rb:193:9:193:9 | x [element 0] | provenance | | -| active_support.rb:192:10:192:18 | call to source | active_support.rb:192:5:192:5 | x [element 0] | provenance | | +| active_support.rb:192:9:192:22 | call to [] [element 0] | active_support.rb:192:5:192:5 | x [element 0] | provenance | | +| active_support.rb:192:10:192:18 | call to source | active_support.rb:192:9:192:22 | call to [] [element 0] | provenance | | | active_support.rb:193:5:193:5 | y [element] | active_support.rb:194:10:194:10 | y [element] | provenance | | | active_support.rb:193:9:193:9 | x [element 0] | active_support.rb:193:9:193:19 | call to without [element] | provenance | | | active_support.rb:193:9:193:19 | call to without [element] | active_support.rb:193:5:193:5 | y [element] | provenance | | | active_support.rb:194:10:194:10 | y [element] | active_support.rb:194:10:194:13 | ...[...] | provenance | | | active_support.rb:198:5:198:5 | x [element 0] | active_support.rb:199:9:199:9 | x [element 0] | provenance | | -| active_support.rb:198:10:198:18 | call to source | active_support.rb:198:5:198:5 | x [element 0] | provenance | | +| active_support.rb:198:9:198:22 | call to [] [element 0] | active_support.rb:198:5:198:5 | x [element 0] | provenance | | +| active_support.rb:198:10:198:18 | call to source | active_support.rb:198:9:198:22 | call to [] [element 0] | provenance | | | active_support.rb:199:5:199:5 | y [element] | active_support.rb:200:10:200:10 | y [element] | provenance | | | active_support.rb:199:9:199:9 | x [element 0] | active_support.rb:199:9:199:37 | call to in_order_of [element] | provenance | | | active_support.rb:199:9:199:37 | call to in_order_of [element] | active_support.rb:199:5:199:5 | y [element] | provenance | | | active_support.rb:200:10:200:10 | y [element] | active_support.rb:200:10:200:13 | ...[...] | provenance | | | active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:205:9:205:9 | a [element 0] | provenance | | | active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:206:10:206:10 | a [element 0] | provenance | | -| active_support.rb:204:10:204:18 | call to source | active_support.rb:204:5:204:5 | a [element 0] | provenance | | +| active_support.rb:204:9:204:22 | call to [] [element 0] | active_support.rb:204:5:204:5 | a [element 0] | provenance | | +| active_support.rb:204:10:204:18 | call to source | active_support.rb:204:9:204:22 | call to [] [element 0] | provenance | | | active_support.rb:205:5:205:5 | b [element 0] | active_support.rb:208:10:208:10 | b [element 0] | provenance | | | active_support.rb:205:5:205:5 | b [element] | active_support.rb:208:10:208:10 | b [element] | provenance | | | active_support.rb:205:5:205:5 | b [element] | active_support.rb:209:10:209:10 | b [element] | provenance | | @@ -54,37 +59,43 @@ edges | active_support.rb:290:7:290:16 | call to source | active_support.rb:290:3:290:3 | x | provenance | | | active_support.rb:291:8:291:8 | x | active_support.rb:291:8:291:17 | call to deep_dup | provenance | | | hash_extensions.rb:2:5:2:5 | h [element :a] | hash_extensions.rb:3:9:3:9 | h [element :a] | provenance | | -| hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:5:2:5 | h [element :a] | provenance | | +| hash_extensions.rb:2:9:2:26 | call to [] [element :a] | hash_extensions.rb:2:5:2:5 | h [element :a] | provenance | | +| hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:9:2:26 | call to [] [element :a] | provenance | | | hash_extensions.rb:3:5:3:5 | x [element] | hash_extensions.rb:4:10:4:10 | x [element] | provenance | | | hash_extensions.rb:3:9:3:9 | h [element :a] | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | provenance | | | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | hash_extensions.rb:3:5:3:5 | x [element] | provenance | | | hash_extensions.rb:4:10:4:10 | x [element] | hash_extensions.rb:4:10:4:14 | ...[...] | provenance | | | hash_extensions.rb:10:5:10:5 | h [element :a] | hash_extensions.rb:11:9:11:9 | h [element :a] | provenance | | -| hash_extensions.rb:10:14:10:24 | call to source | hash_extensions.rb:10:5:10:5 | h [element :a] | provenance | | +| hash_extensions.rb:10:9:10:26 | call to [] [element :a] | hash_extensions.rb:10:5:10:5 | h [element :a] | provenance | | +| hash_extensions.rb:10:14:10:24 | call to source | hash_extensions.rb:10:9:10:26 | call to [] [element :a] | provenance | | | hash_extensions.rb:11:5:11:5 | x [element] | hash_extensions.rb:12:10:12:10 | x [element] | provenance | | | hash_extensions.rb:11:9:11:9 | h [element :a] | hash_extensions.rb:11:9:11:20 | call to to_options [element] | provenance | | | hash_extensions.rb:11:9:11:20 | call to to_options [element] | hash_extensions.rb:11:5:11:5 | x [element] | provenance | | | hash_extensions.rb:12:10:12:10 | x [element] | hash_extensions.rb:12:10:12:14 | ...[...] | provenance | | | hash_extensions.rb:18:5:18:5 | h [element :a] | hash_extensions.rb:19:9:19:9 | h [element :a] | provenance | | -| hash_extensions.rb:18:14:18:24 | call to source | hash_extensions.rb:18:5:18:5 | h [element :a] | provenance | | +| hash_extensions.rb:18:9:18:26 | call to [] [element :a] | hash_extensions.rb:18:5:18:5 | h [element :a] | provenance | | +| hash_extensions.rb:18:14:18:24 | call to source | hash_extensions.rb:18:9:18:26 | call to [] [element :a] | provenance | | | hash_extensions.rb:19:5:19:5 | x [element] | hash_extensions.rb:20:10:20:10 | x [element] | provenance | | | hash_extensions.rb:19:9:19:9 | h [element :a] | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | provenance | | | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | hash_extensions.rb:19:5:19:5 | x [element] | provenance | | | hash_extensions.rb:20:10:20:10 | x [element] | hash_extensions.rb:20:10:20:14 | ...[...] | provenance | | | hash_extensions.rb:26:5:26:5 | h [element :a] | hash_extensions.rb:27:9:27:9 | h [element :a] | provenance | | -| hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:5:26:5 | h [element :a] | provenance | | +| hash_extensions.rb:26:9:26:26 | call to [] [element :a] | hash_extensions.rb:26:5:26:5 | h [element :a] | provenance | | +| hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:9:26:26 | call to [] [element :a] | provenance | | | hash_extensions.rb:27:5:27:5 | x [element] | hash_extensions.rb:28:10:28:10 | x [element] | provenance | | | hash_extensions.rb:27:9:27:9 | h [element :a] | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | provenance | | | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | hash_extensions.rb:27:5:27:5 | x [element] | provenance | | | hash_extensions.rb:28:10:28:10 | x [element] | hash_extensions.rb:28:10:28:14 | ...[...] | provenance | | | hash_extensions.rb:34:5:34:5 | h [element :a] | hash_extensions.rb:35:9:35:9 | h [element :a] | provenance | | -| hash_extensions.rb:34:14:34:24 | call to source | hash_extensions.rb:34:5:34:5 | h [element :a] | provenance | | +| hash_extensions.rb:34:9:34:26 | call to [] [element :a] | hash_extensions.rb:34:5:34:5 | h [element :a] | provenance | | +| hash_extensions.rb:34:14:34:24 | call to source | hash_extensions.rb:34:9:34:26 | call to [] [element :a] | provenance | | | hash_extensions.rb:35:5:35:5 | x [element] | hash_extensions.rb:36:10:36:10 | x [element] | provenance | | | hash_extensions.rb:35:9:35:9 | h [element :a] | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | provenance | | | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | hash_extensions.rb:35:5:35:5 | x [element] | provenance | | | hash_extensions.rb:36:10:36:10 | x [element] | hash_extensions.rb:36:10:36:14 | ...[...] | provenance | | | hash_extensions.rb:42:5:42:5 | h [element :a] | hash_extensions.rb:43:9:43:9 | h [element :a] | provenance | | -| hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:5:42:5 | h [element :a] | provenance | | +| hash_extensions.rb:42:9:42:26 | call to [] [element :a] | hash_extensions.rb:42:5:42:5 | h [element :a] | provenance | | +| hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:9:42:26 | call to [] [element :a] | provenance | | | hash_extensions.rb:43:5:43:5 | x [element] | hash_extensions.rb:44:10:44:10 | x [element] | provenance | | | hash_extensions.rb:43:9:43:9 | h [element :a] | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | provenance | | | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | hash_extensions.rb:43:5:43:5 | x [element] | provenance | | @@ -92,9 +103,12 @@ edges | hash_extensions.rb:50:5:50:5 | h [element :a] | hash_extensions.rb:51:9:51:9 | h [element :a] | provenance | | | hash_extensions.rb:50:5:50:5 | h [element :b] | hash_extensions.rb:51:9:51:9 | h [element :b] | provenance | | | hash_extensions.rb:50:5:50:5 | h [element :d] | hash_extensions.rb:51:9:51:9 | h [element :d] | provenance | | -| hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :a] | provenance | | -| hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :b] | provenance | | -| hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :d] | provenance | | +| hash_extensions.rb:50:9:50:63 | call to [] [element :a] | hash_extensions.rb:50:5:50:5 | h [element :a] | provenance | | +| hash_extensions.rb:50:9:50:63 | call to [] [element :b] | hash_extensions.rb:50:5:50:5 | h [element :b] | provenance | | +| hash_extensions.rb:50:9:50:63 | call to [] [element :d] | hash_extensions.rb:50:5:50:5 | h [element :d] | provenance | | +| hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] [element :a] | provenance | | +| hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] [element :b] | provenance | | +| hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] [element :d] | provenance | | | hash_extensions.rb:51:5:51:5 | x [element :a] | hash_extensions.rb:58:10:58:10 | x [element :a] | provenance | | | hash_extensions.rb:51:5:51:5 | x [element :b] | hash_extensions.rb:59:10:59:10 | x [element :b] | provenance | | | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | hash_extensions.rb:56:10:56:10 | h [element :d] | provenance | | @@ -109,9 +123,12 @@ edges | hash_extensions.rb:67:5:67:10 | values [element 0] | hash_extensions.rb:68:9:68:14 | values [element 0] | provenance | | | hash_extensions.rb:67:5:67:10 | values [element 1] | hash_extensions.rb:68:9:68:14 | values [element 1] | provenance | | | hash_extensions.rb:67:5:67:10 | values [element 2] | hash_extensions.rb:68:9:68:14 | values [element 2] | provenance | | -| hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:5:67:10 | values [element 0] | provenance | | -| hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:5:67:10 | values [element 1] | provenance | | -| hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:5:67:10 | values [element 2] | provenance | | +| hash_extensions.rb:67:14:67:52 | call to [] [element 0] | hash_extensions.rb:67:5:67:10 | values [element 0] | provenance | | +| hash_extensions.rb:67:14:67:52 | call to [] [element 1] | hash_extensions.rb:67:5:67:10 | values [element 1] | provenance | | +| hash_extensions.rb:67:14:67:52 | call to [] [element 2] | hash_extensions.rb:67:5:67:10 | values [element 2] | provenance | | +| hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:14:67:52 | call to [] [element 0] | provenance | | +| hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:14:67:52 | call to [] [element 1] | provenance | | +| hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:14:67:52 | call to [] [element 2] | provenance | | | hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:73:10:73:10 | h [element] | provenance | | | hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:74:10:74:10 | h [element] | provenance | | | hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | provenance | | @@ -127,9 +144,12 @@ edges | hash_extensions.rb:80:5:80:10 | values [element 0] | hash_extensions.rb:81:9:81:14 | values [element 0] | provenance | | | hash_extensions.rb:80:5:80:10 | values [element 1] | hash_extensions.rb:81:9:81:14 | values [element 1] | provenance | | | hash_extensions.rb:80:5:80:10 | values [element 2] | hash_extensions.rb:81:9:81:14 | values [element 2] | provenance | | -| hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:5:80:10 | values [element 0] | provenance | | -| hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:5:80:10 | values [element 1] | provenance | | -| hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:5:80:10 | values [element 2] | provenance | | +| hash_extensions.rb:80:14:80:52 | call to [] [element 0] | hash_extensions.rb:80:5:80:10 | values [element 0] | provenance | | +| hash_extensions.rb:80:14:80:52 | call to [] [element 1] | hash_extensions.rb:80:5:80:10 | values [element 1] | provenance | | +| hash_extensions.rb:80:14:80:52 | call to [] [element 2] | hash_extensions.rb:80:5:80:10 | values [element 2] | provenance | | +| hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:14:80:52 | call to [] [element 0] | provenance | | +| hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:14:80:52 | call to [] [element 1] | provenance | | +| hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:14:80:52 | call to [] [element 2] | provenance | | | hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:86:10:86:10 | h [element] | provenance | | | hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:87:10:87:10 | h [element] | provenance | | | hash_extensions.rb:81:9:81:14 | values [element 0] | hash_extensions.rb:81:31:81:33 | key | provenance | | @@ -152,8 +172,12 @@ edges | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | provenance | | | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | provenance | | | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | provenance | | +| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :id] | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | provenance | | +| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :name] | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | provenance | | +| hash_extensions.rb:98:15:98:56 | call to [] [element :id] | hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :id] | provenance | | +| hash_extensions.rb:98:15:98:56 | call to [] [element :name] | hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :name] | provenance | | +| hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:15:98:56 | call to [] [element :id] | provenance | | +| hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:15:98:56 | call to [] [element :name] | provenance | | | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | hash_extensions.rb:99:10:99:25 | call to pick | provenance | | | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | hash_extensions.rb:100:10:100:27 | call to pick | provenance | | | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | provenance | | @@ -174,10 +198,18 @@ edges | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | provenance | | | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | provenance | | | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | provenance | | -| hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | provenance | | -| hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :id] | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :name] | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :id] | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :name] | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | provenance | | +| hash_extensions.rb:110:15:110:56 | call to [] [element :id] | hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :id] | provenance | | +| hash_extensions.rb:110:15:110:56 | call to [] [element :name] | hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :name] | provenance | | +| hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:15:110:56 | call to [] [element :id] | provenance | | +| hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:15:110:56 | call to [] [element :name] | provenance | | +| hash_extensions.rb:110:59:110:101 | call to [] [element :id] | hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :id] | provenance | | +| hash_extensions.rb:110:59:110:101 | call to [] [element :name] | hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :name] | provenance | | +| hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:59:110:101 | call to [] [element :id] | provenance | | +| hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:59:110:101 | call to [] [element :name] | provenance | | | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | provenance | | | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | provenance | | | hash_extensions.rb:111:10:111:28 | call to pluck [element] | hash_extensions.rb:111:10:111:31 | ...[...] | provenance | | @@ -198,13 +230,16 @@ edges | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | provenance | | | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | hash_extensions.rb:115:10:115:39 | ...[...] | provenance | | | hash_extensions.rb:122:5:122:10 | single [element 0] | hash_extensions.rb:125:10:125:15 | single [element 0] | provenance | | -| hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:5:122:10 | single [element 0] | provenance | | +| hash_extensions.rb:122:14:122:26 | call to [] [element 0] | hash_extensions.rb:122:5:122:10 | single [element 0] | provenance | | +| hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:14:122:26 | call to [] [element 0] | provenance | | | hash_extensions.rb:123:5:123:9 | multi [element 0] | hash_extensions.rb:126:10:126:14 | multi [element 0] | provenance | | -| hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:5:123:9 | multi [element 0] | provenance | | +| hash_extensions.rb:123:13:123:38 | call to [] [element 0] | hash_extensions.rb:123:5:123:9 | multi [element 0] | provenance | | +| hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:13:123:38 | call to [] [element 0] | provenance | | | hash_extensions.rb:125:10:125:15 | single [element 0] | hash_extensions.rb:125:10:125:20 | call to sole | provenance | | | hash_extensions.rb:126:10:126:14 | multi [element 0] | hash_extensions.rb:126:10:126:19 | call to sole | provenance | | nodes | active_support.rb:180:5:180:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:180:9:180:18 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:181:9 | x [element 0] | semmle.label | x [element 0] | @@ -212,6 +247,7 @@ nodes | active_support.rb:182:10:182:10 | y [element] | semmle.label | y [element] | | active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:186:9:186:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:187:9 | x [element 0] | semmle.label | x [element 0] | @@ -219,6 +255,7 @@ nodes | active_support.rb:188:10:188:10 | y [element] | semmle.label | y [element] | | active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:192:5:192:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:192:9:192:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:193:9 | x [element 0] | semmle.label | x [element 0] | @@ -226,6 +263,7 @@ nodes | active_support.rb:194:10:194:10 | y [element] | semmle.label | y [element] | | active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:198:5:198:5 | x [element 0] | semmle.label | x [element 0] | +| active_support.rb:198:9:198:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:9:199:9 | x [element 0] | semmle.label | x [element 0] | @@ -233,6 +271,7 @@ nodes | active_support.rb:200:10:200:10 | y [element] | semmle.label | y [element] | | active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:204:5:204:5 | a [element 0] | semmle.label | a [element 0] | +| active_support.rb:204:9:204:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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] | semmle.label | b [element] | @@ -265,6 +304,7 @@ nodes | 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 | | hash_extensions.rb:2:5:2:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:2:9:2:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | | 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:9:3:9 | h [element :a] | semmle.label | h [element :a] | @@ -272,6 +312,7 @@ nodes | hash_extensions.rb:4:10:4:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:4:10:4:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:10:5:10:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:10:9:10:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | | 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:9:11:9 | h [element :a] | semmle.label | h [element :a] | @@ -279,6 +320,7 @@ nodes | hash_extensions.rb:12:10:12:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:18:5:18:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:18:9:18:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | | 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:9:19:9 | h [element :a] | semmle.label | h [element :a] | @@ -286,6 +328,7 @@ nodes | hash_extensions.rb:20:10:20:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:26:5:26:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:26:9:26:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | | 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:9:27:9 | h [element :a] | semmle.label | h [element :a] | @@ -293,6 +336,7 @@ nodes | hash_extensions.rb:28:10:28:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:28:10:28:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:34:5:34:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:34:9:34:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | | 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:9:35:9 | h [element :a] | semmle.label | h [element :a] | @@ -300,6 +344,7 @@ nodes | hash_extensions.rb:36:10:36:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:42:5:42:5 | h [element :a] | semmle.label | h [element :a] | +| hash_extensions.rb:42:9:42:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | | 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:9:43:9 | h [element :a] | semmle.label | h [element :a] | @@ -309,6 +354,9 @@ nodes | 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 :d] | semmle.label | h [element :d] | +| hash_extensions.rb:50:9:50:63 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_extensions.rb:50:9:50:63 | call to [] [element :b] | semmle.label | call to [] [element :b] | +| hash_extensions.rb:50:9:50:63 | call to [] [element :d] | semmle.label | call to [] [element :d] | | 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:52:50:61 | call to taint | semmle.label | call to taint | @@ -329,6 +377,9 @@ nodes | 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 2] | semmle.label | values [element 2] | +| hash_extensions.rb:67:14:67:52 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| hash_extensions.rb:67:14:67:52 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| hash_extensions.rb:67:14:67:52 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:41:67:51 | call to source | semmle.label | call to source | @@ -346,6 +397,9 @@ nodes | 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 2] | semmle.label | values [element 2] | +| hash_extensions.rb:80:14:80:52 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| hash_extensions.rb:80:14:80:52 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| hash_extensions.rb:80:14:80:52 | call to [] [element 2] | semmle.label | call to [] [element 2] | | 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:41:80:51 | call to source | semmle.label | call to source | @@ -370,6 +424,10 @@ nodes | 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 :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :id] | semmle.label | call to [] [element 0, element :id] | +| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :name] | semmle.label | call to [] [element 0, element :name] | +| hash_extensions.rb:98:15:98:56 | call to [] [element :id] | semmle.label | call to [] [element :id] | +| hash_extensions.rb:98:15:98:56 | call to [] [element :name] | semmle.label | call to [] [element :name] | | 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:99:10:99:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | @@ -392,8 +450,16 @@ nodes | 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 :name] | semmle.label | values [element 1, element :name] | +| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :id] | semmle.label | call to [] [element 0, element :id] | +| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :name] | semmle.label | call to [] [element 0, element :name] | +| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :id] | semmle.label | call to [] [element 1, element :id] | +| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :name] | semmle.label | call to [] [element 1, element :name] | +| hash_extensions.rb:110:15:110:56 | call to [] [element :id] | semmle.label | call to [] [element :id] | +| hash_extensions.rb:110:15:110:56 | call to [] [element :name] | semmle.label | call to [] [element :name] | | 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:59:110:101 | call to [] [element :id] | semmle.label | call to [] [element :id] | +| hash_extensions.rb:110:59:110:101 | call to [] [element :name] | semmle.label | call to [] [element :name] | | 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:111:10:111:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | @@ -421,8 +487,10 @@ nodes | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:122:5:122:10 | single [element 0] | semmle.label | single [element 0] | +| hash_extensions.rb:122:14:122:26 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:13:123:38 | call to [] [element 0] | semmle.label | call to [] [element 0] | | 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:20 | call to sole | semmle.label | call to sole | diff --git a/ruby/ql/test/library-tests/frameworks/core/Kernel.expected b/ruby/ql/test/library-tests/frameworks/core/Kernel.expected index 3d35933fbf6..c3c9c8f1896 100644 --- a/ruby/ql/test/library-tests/frameworks/core/Kernel.expected +++ b/ruby/ql/test/library-tests/frameworks/core/Kernel.expected @@ -42,6 +42,13 @@ sendCallCodeExecutions | Eval.rb:7:1:7:19 | call to send | Eval.rb:7:8:7:13 | "push" | | Kernel.rb:2:1:2:22 | call to send | Kernel.rb:2:6:2:12 | "raise" | | Kernel.rb:5:1:5:19 | call to send | Kernel.rb:5:8:5:13 | "push" | +methodCallCodeExecutions +| Kernel.rb:92:1:92:14 | call to method | Kernel.rb:92:8:92:13 | "exit" | +| Kernel.rb:93:1:93:21 | call to public_method | Kernel.rb:93:15:93:20 | "exit" | +| Kernel.rb:94:1:94:23 | call to singleton_method | Kernel.rb:94:18:94:22 | "foo" | +| Kernel.rb:96:1:96:18 | call to method | Kernel.rb:96:12:96:17 | "exit" | +| Kernel.rb:97:1:97:25 | call to public_method | Kernel.rb:97:19:97:24 | "exit" | +| Kernel.rb:98:1:98:27 | call to singleton_method | Kernel.rb:98:22:98:26 | "foo" | evalCallCodeExecutions | Eval.rb:3:1:3:43 | call to eval | Eval.rb:3:6:3:22 | "raise \\"error\\"" | | Kernel.rb:1:1:1:43 | call to eval | Kernel.rb:1:6:1:22 | "raise \\"error\\"" | diff --git a/ruby/ql/test/library-tests/frameworks/core/Kernel.ql b/ruby/ql/test/library-tests/frameworks/core/Kernel.ql index 89bd115e7d8..1577e037316 100644 --- a/ruby/ql/test/library-tests/frameworks/core/Kernel.ql +++ b/ruby/ql/test/library-tests/frameworks/core/Kernel.ql @@ -9,4 +9,6 @@ query predicate kernelSpawnCallExecutions(KernelSpawnCall c) { any() } query DataFlow::Node sendCallCodeExecutions(SendCallCodeExecution e) { result = e.getCode() } +query DataFlow::Node methodCallCodeExecutions(MethodCallCodeExecution e) { result = e.getCode() } + query DataFlow::Node evalCallCodeExecutions(EvalCallCodeExecution e) { result = e.getCode() } diff --git a/ruby/ql/test/library-tests/frameworks/core/Kernel.rb b/ruby/ql/test/library-tests/frameworks/core/Kernel.rb index ad233e16f9c..cf59f6cdefd 100644 --- a/ruby/ql/test/library-tests/frameworks/core/Kernel.rb +++ b/ruby/ql/test/library-tests/frameworks/core/Kernel.rb @@ -87,4 +87,12 @@ class Foo end end -UnknownModule.system("ls") \ No newline at end of file +UnknownModule.system("ls") + +method("exit").call +public_method("exit").call +singleton_method("foo").call + +Foo.method("exit").call +Foo.public_method("exit").call +Foo.singleton_method("foo").call diff --git a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected index baad7a63b8d..0930c4da2a4 100644 --- a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected +++ b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected @@ -4,12 +4,14 @@ edges | app.rb:75:5:75:8 | [post] self [@foo] | app.rb:76:32:76:35 | self [@foo] | provenance | | | app.rb:75:12:75:17 | call to params | app.rb:75:12:75:24 | ...[...] | provenance | | | app.rb:75:12:75:24 | ...[...] | app.rb:75:5:75:8 | [post] self [@foo] | provenance | | -| app.rb:76:32:76:35 | @foo | views/index.erb:2:10:2:12 | call to foo | provenance | | +| app.rb:76:25:76:36 | call to [] [element :foo] | views/index.erb:2:10:2:12 | call to foo | provenance | | +| app.rb:76:32:76:35 | @foo | app.rb:76:25:76:36 | call to [] [element :foo] | provenance | | | app.rb:76:32:76:35 | self [@foo] | app.rb:76:32:76:35 | @foo | provenance | | 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:25:76:36 | call to [] [element :foo] | semmle.label | call to [] [element :foo] | | app.rb:76:32:76:35 | @foo | semmle.label | @foo | | app.rb:76:32:76:35 | self [@foo] | semmle.label | self [@foo] | | views/index.erb:2:10:2:12 | call to foo | semmle.label | call to foo | diff --git a/ruby/ql/test/query-tests/experimental/LdapInjection/Ldapinjection.expected b/ruby/ql/test/query-tests/experimental/LdapInjection/Ldapinjection.expected index 9eddf82c15c..f4858a7017d 100644 --- a/ruby/ql/test/query-tests/experimental/LdapInjection/Ldapinjection.expected +++ b/ruby/ql/test/query-tests/experimental/LdapInjection/Ldapinjection.expected @@ -6,7 +6,9 @@ edges | LdapInjection.rb:9:5:9:8 | name | LdapInjection.rb:33:88:33:91 | name | provenance | | | LdapInjection.rb:9:12:9:17 | call to params | LdapInjection.rb:9:12:9:29 | ...[...] | provenance | | | LdapInjection.rb:9:12:9:29 | ...[...] | LdapInjection.rb:9:5:9:8 | name | provenance | | +| LdapInjection.rb:33:87:33:92 | call to [] [element 0] | LdapInjection.rb:33:87:33:92 | call to [] | provenance | | | LdapInjection.rb:33:88:33:91 | name | LdapInjection.rb:33:87:33:92 | call to [] | provenance | | +| LdapInjection.rb:33:88:33:91 | name | LdapInjection.rb:33:87:33:92 | call to [] [element 0] | provenance | | | LdapInjection.rb:33:88:33:91 | name | LdapInjection.rb:37:41:37:44 | name | provenance | | | LdapInjection.rb:37:5:37:10 | filter | LdapInjection.rb:38:62:38:67 | filter | provenance | | | LdapInjection.rb:37:14:37:45 | call to eq | LdapInjection.rb:37:5:37:10 | filter | provenance | | @@ -21,6 +23,7 @@ nodes | LdapInjection.rb:25:23:25:49 | "ou=people,dc=#{...},dc=com" | semmle.label | "ou=people,dc=#{...},dc=com" | | LdapInjection.rb:29:62:29:73 | "cn=#{...}" | semmle.label | "cn=#{...}" | | LdapInjection.rb:33:87:33:92 | call to [] | semmle.label | call to [] | +| LdapInjection.rb:33:87:33:92 | call to [] [element 0] | semmle.label | call to [] [element 0] | | LdapInjection.rb:33:88:33:91 | name | semmle.label | name | | LdapInjection.rb:37:5:37:10 | filter | semmle.label | filter | | LdapInjection.rb:37:14:37:45 | call to eq | semmle.label | call to eq | diff --git a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected new file mode 100644 index 00000000000..c0bf81ce21a --- /dev/null +++ b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected @@ -0,0 +1,56 @@ +edges +| UnsafeYamlDeserialization.rb:10:5:10:13 | yaml_data | UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | UnsafeYamlDeserialization.rb:10:17:10:28 | ...[...] | provenance | | +| UnsafeYamlDeserialization.rb:10:17:10:28 | ...[...] | UnsafeYamlDeserialization.rb:10:5:10:13 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:17:5:17:13 | yaml_data | UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | UnsafeYamlDeserialization.rb:17:17:17:28 | ...[...] | provenance | | +| UnsafeYamlDeserialization.rb:17:17:17:28 | ...[...] | UnsafeYamlDeserialization.rb:17:5:17:13 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:32:17:32:28 | ...[...] | provenance | | +| UnsafeYamlDeserialization.rb:32:17:32:28 | ...[...] | UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | provenance | | +nodes +| UnsafeYamlDeserialization.rb:10:5:10:13 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | semmle.label | call to params | +| UnsafeYamlDeserialization.rb:10:17:10:28 | ...[...] | semmle.label | ...[...] | +| UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:17:5:17:13 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | semmle.label | call to params | +| UnsafeYamlDeserialization.rb:17:17:17:28 | ...[...] | semmle.label | ...[...] | +| UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | semmle.label | call to params | +| UnsafeYamlDeserialization.rb:32:17:32:28 | ...[...] | semmle.label | ...[...] | +| UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | semmle.label | call to read | +| UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | semmle.label | call to gets | +| UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | semmle.label | call to read | +| UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | semmle.label | call to gets | +| UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | semmle.label | call to readlines | +subpaths +#select +| UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | value from stdin | +| UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | value from stdin | +| UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | value from stdin | +| UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | value from stdin | +| UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | value from stdin | diff --git a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.qlref b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.qlref new file mode 100644 index 00000000000..991ba757e43 --- /dev/null +++ b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.qlref @@ -0,0 +1 @@ +experimental/cwe-502/UnsafeYamlDeserialization.ql \ No newline at end of file diff --git a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.rb b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.rb new file mode 100644 index 00000000000..c9b186e0915 --- /dev/null +++ b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.rb @@ -0,0 +1,75 @@ +require "active_job" +require "base64" +require "json" +require "oj" +require "yaml" + +class UsersController < ActionController::Base + # BAD before psych version 4.0.0 and + def route1 + yaml_data = params[:key] + object = Psych.load yaml_data + object = Psych.load_file yaml_data + end + + # GOOD In psych version 4.0.0 and above + def route2 + yaml_data = params[:key] + object = Psych.load yaml_data + object = Psych.load_file yaml_data + end + + # GOOD + def route3 + yaml_data = params[:key] + object = Psych.parse_stream(yaml_data) + object = Psych.parse(yaml_data) + object = Psych.parse_file(yaml_data) + end + + # BAD + def route4 + yaml_data = params[:key] + object = Psych.unsafe_load(yaml_data) + object = Psych.unsafe_load_file(yaml_data) + object = Psych.load_stream(yaml_data) + parse_output = Psych.parse_stream(yaml_data) + object = parse_output.to_ruby + object = Psych.parse(yaml_data).to_ruby + object = Psych.parse_file(yaml_data).to_ruby + parsed_yaml = Psych.parse_stream(yaml_data) + parsed_yaml.children.each do |child| + object = child.to_ruby + end + Psych.parse_stream(yaml_data) do |document| + object = document.to_ruby + end + object = parsed_yaml.children.first.to_ruby + content = parsed_yaml.children[0].children[0].children + object = parsed_yaml.to_ruby[0] + object = content.to_ruby[0] + object = Psych.parse(yaml_data).children[0].to_ruby + end + + # GOOD + def route5 + plist_data = params[:key] + result = Plist.parse_xml(plist_data, marshal: false) + end + + def stdin + object = YAML.load $stdin.read + + # STDIN + object = YAML.load STDIN.gets + + # ARGF + object = YAML.load ARGF.read + + # Kernel.gets + object = YAML.load gets + + # Kernel.readlines + object = YAML.load readlines + end +end diff --git a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected index 71f40d81a34..d92d24400e8 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected @@ -15,16 +15,27 @@ edges | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | provenance | | | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | provenance | | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/views/foo/bars/show.html.erb:82:6:82:17 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:82:6:82:17 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:85:36:85:47 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:86:28:86:39 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | provenance | | | app/controllers/foo/bars_controller.rb:30:5:30:7 | str | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | provenance | | | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | provenance | | | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | app/controllers/foo/bars_controller.rb:30:5:30:7 | str | provenance | | +| app/controllers/foo/bars_controller.rb:33:32:33:37 | call to params | app/controllers/foo/bars_controller.rb:33:32:33:49 | ...[...] | provenance | | +| app/controllers/foo/bars_controller.rb:33:32:33:49 | ...[...] | app/controllers/foo/bars_controller.rb:33:5:33:50 | call to translate | provenance | | +| app/controllers/foo/bars_controller.rb:34:24:34:29 | call to params | app/controllers/foo/bars_controller.rb:34:24:34:41 | ...[...] | provenance | | +| app/controllers/foo/bars_controller.rb:34:24:34:41 | ...[...] | app/controllers/foo/bars_controller.rb:34:5:34:42 | call to t | provenance | | +| app/controllers/foo/bars_controller.rb:36:34:36:39 | call to params | app/controllers/foo/bars_controller.rb:36:34:36:51 | ...[...] | provenance | | +| app/controllers/foo/bars_controller.rb:36:34:36:51 | ...[...] | app/controllers/foo/bars_controller.rb:36:5:36:52 | call to t | provenance | | +| app/controllers/foo/bars_controller.rb:37:42:37:47 | call to params | app/controllers/foo/bars_controller.rb:37:42:37:59 | ...[...] | provenance | | +| app/controllers/foo/bars_controller.rb:37:42:37:59 | ...[...] | app/controllers/foo/bars_controller.rb:37:5:37:60 | call to translate | provenance | | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] [element] | provenance | | | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | @@ -32,16 +43,20 @@ edges | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | provenance | | | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | provenance | | | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | provenance | | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | provenance | | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | provenance | | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | provenance | | | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | provenance | | | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | provenance | | | app/views/foo/bars/show.html.erb:53:29:53:34 | call to params | app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | provenance | | | app/views/foo/bars/show.html.erb:56:13:56:18 | call to params | app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | provenance | | | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | provenance | | | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | provenance | | +| app/views/foo/bars/show.html.erb:85:36:85:47 | call to display_text | app/views/foo/bars/show.html.erb:85:9:85:48 | call to translate | provenance | | +| app/views/foo/bars/show.html.erb:86:28:86:39 | call to display_text | app/views/foo/bars/show.html.erb:86:9:86:40 | call to t | provenance | | nodes | app/controllers/foo/bars_controller.rb:9:12:9:17 | call to params | semmle.label | call to params | | app/controllers/foo/bars_controller.rb:9:12:9:29 | ...[...] | semmle.label | ...[...] | @@ -57,11 +72,24 @@ nodes | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | semmle.label | call to params | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | semmle.label | ... = ... | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | semmle.label | dt | | app/controllers/foo/bars_controller.rb:30:5:30:7 | str | semmle.label | str | | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | semmle.label | call to params | | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | semmle.label | ...[...] | | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | semmle.label | str | +| app/controllers/foo/bars_controller.rb:33:5:33:50 | call to translate | semmle.label | call to translate | +| app/controllers/foo/bars_controller.rb:33:32:33:37 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:33:32:33:49 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:34:5:34:42 | call to t | semmle.label | call to t | +| app/controllers/foo/bars_controller.rb:34:24:34:29 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:34:24:34:41 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:36:5:36:52 | call to t | semmle.label | call to t | +| app/controllers/foo/bars_controller.rb:36:34:36:39 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:36:34:36:51 | ...[...] | semmle.label | ...[...] | +| app/controllers/foo/bars_controller.rb:37:5:37:60 | call to translate | semmle.label | call to translate | +| app/controllers/foo/bars_controller.rb:37:42:37:47 | call to params | semmle.label | call to params | +| app/controllers/foo/bars_controller.rb:37:42:37:59 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | semmle.label | call to display_text [element] | | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | semmle.label | call to local_assigns [element :display_text, element] | @@ -78,6 +106,8 @@ nodes | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | semmle.label | call to display_text | | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | semmle.label | @instance_text | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | semmle.label | call to [] [element :display_text, element] | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | semmle.label | ... + ... | | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | semmle.label | ... + ... [element] | | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | semmle.label | call to display_text | @@ -92,10 +122,18 @@ nodes | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | semmle.label | call to params | | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/show.html.erb:82:6:82:17 | call to display_text | semmle.label | call to display_text | +| app/views/foo/bars/show.html.erb:85:9:85:48 | call to translate | semmle.label | call to translate | +| app/views/foo/bars/show.html.erb:85:36:85:47 | call to display_text | semmle.label | call to display_text | +| app/views/foo/bars/show.html.erb:86:9:86:40 | call to t | semmle.label | call to t | +| app/views/foo/bars/show.html.erb:86:28:86:39 | call to display_text | semmle.label | call to display_text | subpaths #select | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | user-provided value | | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | user-provided value | +| app/controllers/foo/bars_controller.rb:33:5:33:50 | call to translate | app/controllers/foo/bars_controller.rb:33:32:33:37 | call to params | app/controllers/foo/bars_controller.rb:33:5:33:50 | call to translate | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:33:32:33:37 | call to params | user-provided value | +| app/controllers/foo/bars_controller.rb:34:5:34:42 | call to t | app/controllers/foo/bars_controller.rb:34:24:34:29 | call to params | app/controllers/foo/bars_controller.rb:34:5:34:42 | call to t | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:34:24:34:29 | call to params | user-provided value | +| app/controllers/foo/bars_controller.rb:36:5:36:52 | call to t | app/controllers/foo/bars_controller.rb:36:34:36:39 | call to params | app/controllers/foo/bars_controller.rb:36:5:36:52 | call to t | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:36:34:36:39 | call to params | user-provided value | +| app/controllers/foo/bars_controller.rb:37:5:37:60 | call to translate | app/controllers/foo/bars_controller.rb:37:42:37:47 | call to params | app/controllers/foo/bars_controller.rb:37:5:37:60 | call to translate | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:37:42:37:47 | call to params | user-provided value | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params | user-provided value | @@ -112,3 +150,5 @@ subpaths | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | user-provided value | | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | app/views/foo/bars/show.html.erb:76:28:76:39 | ...[...] | Cross-site scripting vulnerability due to a $@. | app/views/foo/bars/show.html.erb:76:28:76:33 | call to params | user-provided value | | app/views/foo/bars/show.html.erb:82:6:82:17 | call to display_text | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:82:6:82:17 | call to display_text | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:85:9:85:48 | call to translate | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:85:9:85:48 | call to translate | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | +| app/views/foo/bars/show.html.erb:86:9:86:40 | call to t | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | app/views/foo/bars/show.html.erb:86:9:86:40 | call to t | Cross-site scripting vulnerability due to a $@. | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected index 8ae455760c1..99d248f4884 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected @@ -3,12 +3,13 @@ edges | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | provenance | | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | provenance | | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | provenance | | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | provenance | | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | provenance | | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | provenance | | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | provenance | | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] [element] | provenance | | | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | @@ -16,10 +17,12 @@ edges | app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | provenance | | | app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | provenance | | | app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | provenance | | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | provenance | | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | provenance | | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | provenance | | | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | provenance | | | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | provenance | | | app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | provenance | | @@ -27,6 +30,7 @@ nodes | app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | semmle.label | dt | | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | semmle.label | call to read | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | semmle.label | dt | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | semmle.label | dt | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text [element] | semmle.label | call to display_text [element] | @@ -43,6 +47,8 @@ nodes | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | semmle.label | ...[...] | | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | semmle.label | call to display_text | | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | semmle.label | @instance_text | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | semmle.label | call to [] [element :display_text, element] | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | semmle.label | ... + ... | | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | semmle.label | ... + ... [element] | | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | semmle.label | call to display_text | diff --git a/ruby/ql/test/query-tests/security/cwe-079/app/controllers/foo/bars_controller.rb b/ruby/ql/test/query-tests/security/cwe-079/app/controllers/foo/bars_controller.rb index ce6adfda027..4146cc29953 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/app/controllers/foo/bars_controller.rb +++ b/ruby/ql/test/query-tests/security/cwe-079/app/controllers/foo/bars_controller.rb @@ -29,5 +29,11 @@ class BarsController < ApplicationController def make_safe_html str = params[:user_name] str.html_safe + + translate("welcome", name: params[:user_name]).html_safe # NOT OK - translate preserves taint + t("welcome", name: params[:user_name]).html_safe # NOT OK - t is an alias of translate + t("welcome_html", name: params[:user_name]).html_safe # OK - t escapes html when key ends in _html + I18n.t("welcome_html", name: params[:user_name]).html_safe # NOT OK - I18n.t does not escape html + I18n.translate("welcome_html", name: params[:user_name]).html_safe # NOT OK - alias end end diff --git a/ruby/ql/test/query-tests/security/cwe-079/app/views/foo/bars/show.html.erb b/ruby/ql/test/query-tests/security/cwe-079/app/views/foo/bars/show.html.erb index 21c463eddbb..b8092cd883f 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/app/views/foo/bars/show.html.erb +++ b/ruby/ql/test/query-tests/security/cwe-079/app/views/foo/bars/show.html.erb @@ -80,3 +80,10 @@ <%# BAD: A local rendered raw as a local variable %> <%== display_text %> + +<%# BAD: translate preserves taint %> +<%= raw translate("welcome", name: display_text) %> +<%= raw t("welcome", name: display_text) %> + +<%# GOOD: translate sanitizes for html keys %> +<%= raw t("welcome1.html", name: display_text) %> diff --git a/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb b/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb index c63f384b091..9a94e48708d 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb +++ b/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb @@ -105,6 +105,14 @@ class FooController < ActionController::Base User.reorder(params[:direction]) + User.select('a','b', params[:column]) + User.reselect('a','b', params[:column]) + User.order('a ASC', "b #{params[:direction]}") + User.reorder('a ASC', "b #{params[:direction]}") + User.group('a', params[:column]) + User.pluck('a', params[:column]) + User.joins(:a, params[:column]) + User.count_by_sql(params[:custom_sql_query]) end end diff --git a/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb b/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb index a1efb3adabb..1cd6782b241 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb +++ b/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb @@ -4,5 +4,6 @@ class PotatoController < ActionController::Base name = params[:user_name] # BAD: SQL statement constructed from user input sql = Arel.sql("SELECT * FROM users WHERE name = #{name}") + sql = Arel::Nodes::SqlLiteral.new("SELECT * FROM users WHERE name = #{name}") end end \ No newline at end of file diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected index 1f9b8483f3b..9bf4513af07 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -8,10 +8,12 @@ edges | ActiveRecordInjection.rb:43:29:43:39 | ...[...] | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | provenance | | | ActiveRecordInjection.rb:48:30:48:35 | call to params | ActiveRecordInjection.rb:48:30:48:40 | ...[...] | provenance | | | ActiveRecordInjection.rb:48:30:48:40 | ...[...] | ActiveRecordInjection.rb:48:21:48:43 | "id = '#{...}'" | provenance | | -| ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | ActiveRecordInjection.rb:52:21:52:45 | call to [] | provenance | | +| ActiveRecordInjection.rb:52:21:52:45 | call to [] [element 0] | ActiveRecordInjection.rb:52:21:52:45 | call to [] | provenance | | +| ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | ActiveRecordInjection.rb:52:21:52:45 | call to [] [element 0] | provenance | | | ActiveRecordInjection.rb:52:31:52:36 | call to params | ActiveRecordInjection.rb:52:31:52:41 | ...[...] | provenance | | | ActiveRecordInjection.rb:52:31:52:41 | ...[...] | ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | provenance | | -| ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | ActiveRecordInjection.rb:57:22:57:46 | call to [] | provenance | | +| ActiveRecordInjection.rb:57:22:57:46 | call to [] [element 0] | ActiveRecordInjection.rb:57:22:57:46 | call to [] | provenance | | +| ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | ActiveRecordInjection.rb:57:22:57:46 | call to [] [element 0] | provenance | | | ActiveRecordInjection.rb:57:32:57:37 | call to params | ActiveRecordInjection.rb:57:32:57:42 | ...[...] | provenance | | | ActiveRecordInjection.rb:57:32:57:42 | ...[...] | ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | provenance | | | ActiveRecordInjection.rb:62:21:62:26 | call to params | ActiveRecordInjection.rb:62:21:62:35 | ...[...] | provenance | | @@ -34,36 +36,46 @@ edges | ActiveRecordInjection.rb:104:30:104:35 | call to params | ActiveRecordInjection.rb:104:30:104:51 | ...[...] | provenance | | | ActiveRecordInjection.rb:104:30:104:51 | ...[...] | ActiveRecordInjection.rb:104:19:104:54 | "name = '#{...}'" | provenance | | | ActiveRecordInjection.rb:106:18:106:23 | call to params | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | provenance | | -| ActiveRecordInjection.rb:108:23:108:28 | call to params | ActiveRecordInjection.rb:108:23:108:47 | ...[...] | provenance | | -| ActiveRecordInjection.rb:114:5:114:6 | ps | ActiveRecordInjection.rb:115:11:115:12 | ps | provenance | | -| ActiveRecordInjection.rb:114:10:114:15 | call to params | ActiveRecordInjection.rb:114:5:114:6 | ps | provenance | | -| ActiveRecordInjection.rb:115:5:115:7 | uid | ActiveRecordInjection.rb:116:5:116:9 | uidEq | provenance | | -| ActiveRecordInjection.rb:115:11:115:12 | ps | ActiveRecordInjection.rb:115:11:115:17 | ...[...] | provenance | | -| ActiveRecordInjection.rb:115:11:115:17 | ...[...] | ActiveRecordInjection.rb:115:5:115:7 | uid | provenance | | -| ActiveRecordInjection.rb:116:5:116:9 | uidEq | ActiveRecordInjection.rb:120:20:120:32 | ... + ... | provenance | | -| ActiveRecordInjection.rb:116:5:116:9 | uidEq | ActiveRecordInjection.rb:120:28:120:32 | uidEq | provenance | | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... [element] | ActiveRecordInjection.rb:120:20:120:32 | ... + ... | provenance | | -| ActiveRecordInjection.rb:120:28:120:32 | uidEq | ActiveRecordInjection.rb:120:20:120:32 | ... + ... [element] | provenance | | -| ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:153:21:153:44 | ...[...] | provenance | | -| ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:153:21:153:44 | ...[...] | provenance | | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | ActiveRecordInjection.rb:20:22:20:30 | condition | provenance | | -| ActiveRecordInjection.rb:167:59:167:64 | call to params | ActiveRecordInjection.rb:167:59:167:74 | ...[...] | provenance | | -| ActiveRecordInjection.rb:167:59:167:74 | ...[...] | ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | provenance | | -| ActiveRecordInjection.rb:178:5:178:13 | my_params | ActiveRecordInjection.rb:179:47:179:55 | my_params | provenance | | -| ActiveRecordInjection.rb:178:17:178:32 | call to permitted_params | ActiveRecordInjection.rb:178:5:178:13 | my_params | provenance | | -| ActiveRecordInjection.rb:179:5:179:9 | query | ActiveRecordInjection.rb:180:37:180:41 | query | provenance | | -| ActiveRecordInjection.rb:179:47:179:55 | my_params | ActiveRecordInjection.rb:179:47:179:65 | ...[...] | provenance | | -| ActiveRecordInjection.rb:179:47:179:65 | ...[...] | ActiveRecordInjection.rb:179:5:179:9 | query | provenance | | -| ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:185:5:185:27 | call to require | provenance | | -| ActiveRecordInjection.rb:185:5:185:27 | call to require | ActiveRecordInjection.rb:185:5:185:59 | call to permit | provenance | | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | ActiveRecordInjection.rb:178:17:178:32 | call to permitted_params | provenance | | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | ActiveRecordInjection.rb:189:77:189:92 | call to permitted_params | provenance | | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | ActiveRecordInjection.rb:190:69:190:84 | call to permitted_params | provenance | | -| ActiveRecordInjection.rb:189:77:189:92 | call to permitted_params | ActiveRecordInjection.rb:189:77:189:102 | ...[...] | provenance | | -| ActiveRecordInjection.rb:189:77:189:102 | ...[...] | ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | provenance | | -| ActiveRecordInjection.rb:190:69:190:84 | call to permitted_params | ActiveRecordInjection.rb:190:69:190:94 | ...[...] | provenance | | -| ActiveRecordInjection.rb:190:69:190:94 | ...[...] | ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | provenance | | +| ActiveRecordInjection.rb:108:26:108:31 | call to params | ActiveRecordInjection.rb:108:26:108:40 | ...[...] | provenance | | +| ActiveRecordInjection.rb:109:28:109:33 | call to params | ActiveRecordInjection.rb:109:28:109:42 | ...[...] | provenance | | +| ActiveRecordInjection.rb:110:30:110:35 | call to params | ActiveRecordInjection.rb:110:30:110:47 | ...[...] | provenance | | +| ActiveRecordInjection.rb:110:30:110:47 | ...[...] | ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | provenance | | +| ActiveRecordInjection.rb:111:32:111:37 | call to params | ActiveRecordInjection.rb:111:32:111:49 | ...[...] | provenance | | +| ActiveRecordInjection.rb:111:32:111:49 | ...[...] | ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | provenance | | +| ActiveRecordInjection.rb:112:21:112:26 | call to params | ActiveRecordInjection.rb:112:21:112:35 | ...[...] | provenance | | +| ActiveRecordInjection.rb:113:21:113:26 | call to params | ActiveRecordInjection.rb:113:21:113:35 | ...[...] | provenance | | +| ActiveRecordInjection.rb:114:20:114:25 | call to params | ActiveRecordInjection.rb:114:20:114:34 | ...[...] | provenance | | +| ActiveRecordInjection.rb:116:23:116:28 | call to params | ActiveRecordInjection.rb:116:23:116:47 | ...[...] | provenance | | +| ActiveRecordInjection.rb:122:5:122:6 | ps | ActiveRecordInjection.rb:123:11:123:12 | ps | provenance | | +| ActiveRecordInjection.rb:122:10:122:15 | call to params | ActiveRecordInjection.rb:122:5:122:6 | ps | provenance | | +| ActiveRecordInjection.rb:123:5:123:7 | uid | ActiveRecordInjection.rb:124:5:124:9 | uidEq | provenance | | +| ActiveRecordInjection.rb:123:11:123:12 | ps | ActiveRecordInjection.rb:123:11:123:17 | ...[...] | provenance | | +| ActiveRecordInjection.rb:123:11:123:17 | ...[...] | ActiveRecordInjection.rb:123:5:123:7 | uid | provenance | | +| ActiveRecordInjection.rb:124:5:124:9 | uidEq | ActiveRecordInjection.rb:128:20:128:32 | ... + ... | provenance | | +| ActiveRecordInjection.rb:124:5:124:9 | uidEq | ActiveRecordInjection.rb:128:28:128:32 | uidEq | provenance | | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... [element] | ActiveRecordInjection.rb:128:20:128:32 | ... + ... | provenance | | +| ActiveRecordInjection.rb:128:28:128:32 | uidEq | ActiveRecordInjection.rb:128:20:128:32 | ... + ... [element] | provenance | | +| ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:161:21:161:44 | ...[...] | provenance | | +| ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:161:21:161:44 | ...[...] | provenance | | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | ActiveRecordInjection.rb:20:22:20:30 | condition | provenance | | +| ActiveRecordInjection.rb:175:59:175:64 | call to params | ActiveRecordInjection.rb:175:59:175:74 | ...[...] | provenance | | +| ActiveRecordInjection.rb:175:59:175:74 | ...[...] | ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | provenance | | +| ActiveRecordInjection.rb:186:5:186:13 | my_params | ActiveRecordInjection.rb:187:47:187:55 | my_params | provenance | | +| ActiveRecordInjection.rb:186:17:186:32 | call to permitted_params | ActiveRecordInjection.rb:186:5:186:13 | my_params | provenance | | +| ActiveRecordInjection.rb:187:5:187:9 | query | ActiveRecordInjection.rb:188:37:188:41 | query | provenance | | +| ActiveRecordInjection.rb:187:47:187:55 | my_params | ActiveRecordInjection.rb:187:47:187:65 | ...[...] | provenance | | +| ActiveRecordInjection.rb:187:47:187:65 | ...[...] | ActiveRecordInjection.rb:187:5:187:9 | query | provenance | | +| ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:193:5:193:27 | call to require | provenance | | +| ActiveRecordInjection.rb:193:5:193:27 | call to require | ActiveRecordInjection.rb:193:5:193:59 | call to permit | provenance | | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | ActiveRecordInjection.rb:186:17:186:32 | call to permitted_params | provenance | | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | ActiveRecordInjection.rb:197:77:197:92 | call to permitted_params | provenance | | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | ActiveRecordInjection.rb:198:69:198:84 | call to permitted_params | provenance | | +| ActiveRecordInjection.rb:197:77:197:92 | call to permitted_params | ActiveRecordInjection.rb:197:77:197:102 | ...[...] | provenance | | +| ActiveRecordInjection.rb:197:77:197:102 | ...[...] | ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | provenance | | +| ActiveRecordInjection.rb:198:69:198:84 | call to permitted_params | ActiveRecordInjection.rb:198:69:198:94 | ...[...] | provenance | | +| ActiveRecordInjection.rb:198:69:198:94 | ...[...] | ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | provenance | | | ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | provenance | | +| ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | provenance | | | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:4:12:4:29 | ...[...] | provenance | | | ArelInjection.rb:4:12:4:29 | ...[...] | ArelInjection.rb:4:5:4:8 | name | provenance | | | PgInjection.rb:6:5:6:8 | name | PgInjection.rb:13:5:13:8 | qry1 | provenance | | @@ -95,10 +107,12 @@ nodes | ActiveRecordInjection.rb:48:30:48:35 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:48:30:48:40 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:52:21:52:45 | call to [] | semmle.label | call to [] | +| ActiveRecordInjection.rb:52:21:52:45 | call to [] [element 0] | semmle.label | call to [] [element 0] | | ActiveRecordInjection.rb:52:22:52:44 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | | ActiveRecordInjection.rb:52:31:52:36 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:52:31:52:41 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:57:22:57:46 | call to [] | semmle.label | call to [] | +| ActiveRecordInjection.rb:57:22:57:46 | call to [] [element 0] | semmle.label | call to [] [element 0] | | ActiveRecordInjection.rb:57:23:57:45 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | | ActiveRecordInjection.rb:57:32:57:37 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:57:32:57:42 | ...[...] | semmle.label | ...[...] | @@ -133,42 +147,59 @@ nodes | ActiveRecordInjection.rb:104:30:104:51 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:106:18:106:23 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:108:23:108:28 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:108:23:108:47 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:114:5:114:6 | ps | semmle.label | ps | -| ActiveRecordInjection.rb:114:10:114:15 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:115:5:115:7 | uid | semmle.label | uid | -| ActiveRecordInjection.rb:115:11:115:12 | ps | semmle.label | ps | -| ActiveRecordInjection.rb:115:11:115:17 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:116:5:116:9 | uidEq | semmle.label | uidEq | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... | semmle.label | ... + ... | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... [element] | semmle.label | ... + ... [element] | -| ActiveRecordInjection.rb:120:28:120:32 | uidEq | semmle.label | uidEq | -| ActiveRecordInjection.rb:153:21:153:26 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | semmle.label | "this is an unsafe annotation:..." | -| ActiveRecordInjection.rb:167:59:167:64 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:167:59:167:74 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:178:5:178:13 | my_params | semmle.label | my_params | -| ActiveRecordInjection.rb:178:17:178:32 | call to permitted_params | semmle.label | call to permitted_params | -| ActiveRecordInjection.rb:179:5:179:9 | query | semmle.label | query | -| ActiveRecordInjection.rb:179:47:179:55 | my_params | semmle.label | my_params | -| ActiveRecordInjection.rb:179:47:179:65 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:180:37:180:41 | query | semmle.label | query | -| ActiveRecordInjection.rb:185:5:185:10 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:185:5:185:27 | call to require | semmle.label | call to require | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | semmle.label | call to permit | -| ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | -| ActiveRecordInjection.rb:189:77:189:92 | call to permitted_params | semmle.label | call to permitted_params | -| ActiveRecordInjection.rb:189:77:189:102 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | -| ActiveRecordInjection.rb:190:69:190:84 | call to permitted_params | semmle.label | call to permitted_params | -| ActiveRecordInjection.rb:190:69:190:94 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:108:26:108:31 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:108:26:108:40 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:109:28:109:33 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:109:28:109:42 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | semmle.label | "b #{...}" | +| ActiveRecordInjection.rb:110:30:110:35 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:110:30:110:47 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | semmle.label | "b #{...}" | +| ActiveRecordInjection.rb:111:32:111:37 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:111:32:111:49 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:112:21:112:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:112:21:112:35 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:113:21:113:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:113:21:113:35 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:114:20:114:25 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:114:20:114:34 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:116:23:116:28 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:116:23:116:47 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:122:5:122:6 | ps | semmle.label | ps | +| ActiveRecordInjection.rb:122:10:122:15 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:123:5:123:7 | uid | semmle.label | uid | +| ActiveRecordInjection.rb:123:11:123:12 | ps | semmle.label | ps | +| ActiveRecordInjection.rb:123:11:123:17 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:124:5:124:9 | uidEq | semmle.label | uidEq | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... | semmle.label | ... + ... | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... [element] | semmle.label | ... + ... [element] | +| ActiveRecordInjection.rb:128:28:128:32 | uidEq | semmle.label | uidEq | +| ActiveRecordInjection.rb:161:21:161:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | semmle.label | "this is an unsafe annotation:..." | +| ActiveRecordInjection.rb:175:59:175:64 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:175:59:175:74 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:186:5:186:13 | my_params | semmle.label | my_params | +| ActiveRecordInjection.rb:186:17:186:32 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:187:5:187:9 | query | semmle.label | query | +| ActiveRecordInjection.rb:187:47:187:55 | my_params | semmle.label | my_params | +| ActiveRecordInjection.rb:187:47:187:65 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:188:37:188:41 | query | semmle.label | query | +| ActiveRecordInjection.rb:193:5:193:10 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:193:5:193:27 | call to require | semmle.label | call to require | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | semmle.label | call to permit | +| ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | +| ActiveRecordInjection.rb:197:77:197:92 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:197:77:197:102 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | +| ActiveRecordInjection.rb:198:69:198:84 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:198:69:198:94 | ...[...] | semmle.label | ...[...] | | ArelInjection.rb:4:5:4:8 | name | semmle.label | name | | ArelInjection.rb:4:12:4:17 | call to params | semmle.label | call to params | | ArelInjection.rb:4:12:4:29 | ...[...] | semmle.label | ...[...] | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." | +| ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." | | PgInjection.rb:6:5:6:8 | name | semmle.label | name | | PgInjection.rb:6:12:6:17 | call to params | semmle.label | call to params | | PgInjection.rb:6:12:6:24 | ...[...] | semmle.label | ...[...] | @@ -186,7 +217,7 @@ subpaths #select | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:23:70:28 | call to params | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:23:70:28 | call to params | user-provided value | | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:38:70:43 | call to params | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:38:70:43 | call to params | user-provided value | -| ActiveRecordInjection.rb:23:16:23:24 | condition | ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:23:16:23:24 | condition | This SQL query depends on a $@. | ActiveRecordInjection.rb:153:21:153:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:23:16:23:24 | condition | ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:23:16:23:24 | condition | This SQL query depends on a $@. | ActiveRecordInjection.rb:161:21:161:26 | call to params | user-provided value | | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | ActiveRecordInjection.rb:35:30:35:35 | call to params | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:35:30:35:35 | call to params | user-provided value | | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | ActiveRecordInjection.rb:39:18:39:23 | call to params | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:39:18:39:23 | call to params | user-provided value | | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | ActiveRecordInjection.rb:43:29:43:34 | call to params | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:43:29:43:34 | call to params | user-provided value | @@ -204,14 +235,22 @@ subpaths | ActiveRecordInjection.rb:100:20:100:55 | "name = '#{...}'" | ActiveRecordInjection.rb:100:31:100:36 | call to params | ActiveRecordInjection.rb:100:20:100:55 | "name = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:100:31:100:36 | call to params | user-provided value | | ActiveRecordInjection.rb:104:19:104:54 | "name = '#{...}'" | ActiveRecordInjection.rb:104:30:104:35 | call to params | ActiveRecordInjection.rb:104:19:104:54 | "name = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:104:30:104:35 | call to params | user-provided value | | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | ActiveRecordInjection.rb:106:18:106:23 | call to params | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:106:18:106:23 | call to params | user-provided value | -| ActiveRecordInjection.rb:108:23:108:47 | ...[...] | ActiveRecordInjection.rb:108:23:108:28 | call to params | ActiveRecordInjection.rb:108:23:108:47 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:108:23:108:28 | call to params | user-provided value | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... | ActiveRecordInjection.rb:114:10:114:15 | call to params | ActiveRecordInjection.rb:120:20:120:32 | ... + ... | This SQL query depends on a $@. | ActiveRecordInjection.rb:114:10:114:15 | call to params | user-provided value | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:153:21:153:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:153:21:153:26 | call to params | user-provided value | -| ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | ActiveRecordInjection.rb:167:59:167:64 | call to params | ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:167:59:167:64 | call to params | user-provided value | -| ActiveRecordInjection.rb:180:37:180:41 | query | ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:180:37:180:41 | query | This SQL query depends on a $@. | ActiveRecordInjection.rb:185:5:185:10 | call to params | user-provided value | -| ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:185:5:185:10 | call to params | user-provided value | -| ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:185:5:185:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:108:26:108:40 | ...[...] | ActiveRecordInjection.rb:108:26:108:31 | call to params | ActiveRecordInjection.rb:108:26:108:40 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:108:26:108:31 | call to params | user-provided value | +| ActiveRecordInjection.rb:109:28:109:42 | ...[...] | ActiveRecordInjection.rb:109:28:109:33 | call to params | ActiveRecordInjection.rb:109:28:109:42 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:109:28:109:33 | call to params | user-provided value | +| ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | ActiveRecordInjection.rb:110:30:110:35 | call to params | ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | This SQL query depends on a $@. | ActiveRecordInjection.rb:110:30:110:35 | call to params | user-provided value | +| ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | ActiveRecordInjection.rb:111:32:111:37 | call to params | ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | This SQL query depends on a $@. | ActiveRecordInjection.rb:111:32:111:37 | call to params | user-provided value | +| ActiveRecordInjection.rb:112:21:112:35 | ...[...] | ActiveRecordInjection.rb:112:21:112:26 | call to params | ActiveRecordInjection.rb:112:21:112:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:112:21:112:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:113:21:113:35 | ...[...] | ActiveRecordInjection.rb:113:21:113:26 | call to params | ActiveRecordInjection.rb:113:21:113:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:113:21:113:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:114:20:114:34 | ...[...] | ActiveRecordInjection.rb:114:20:114:25 | call to params | ActiveRecordInjection.rb:114:20:114:34 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:114:20:114:25 | call to params | user-provided value | +| ActiveRecordInjection.rb:116:23:116:47 | ...[...] | ActiveRecordInjection.rb:116:23:116:28 | call to params | ActiveRecordInjection.rb:116:23:116:47 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:116:23:116:28 | call to params | user-provided value | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... | ActiveRecordInjection.rb:122:10:122:15 | call to params | ActiveRecordInjection.rb:128:20:128:32 | ... + ... | This SQL query depends on a $@. | ActiveRecordInjection.rb:122:10:122:15 | call to params | user-provided value | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:161:21:161:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:161:21:161:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | ActiveRecordInjection.rb:175:59:175:64 | call to params | ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:175:59:175:64 | call to params | user-provided value | +| ActiveRecordInjection.rb:188:37:188:41 | query | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:188:37:188:41 | query | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value | +| ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value | | PgInjection.rb:14:15:14:18 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:14:15:14:18 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | | PgInjection.rb:15:21:15:24 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:15:21:15:24 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | | PgInjection.rb:20:22:20:25 | qry2 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:20:22:20:25 | qry2 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected index 8af3ed306de..4ff7b8aa338 100644 --- a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected +++ b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected @@ -5,7 +5,8 @@ edges | impl/unsafeCode.rb:28:17:28:22 | my_arr | impl/unsafeCode.rb:29:10:29:15 | my_arr | provenance | | | impl/unsafeCode.rb:32:21:32:21 | x | impl/unsafeCode.rb:33:12:33:12 | x | provenance | | | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | impl/unsafeCode.rb:34:10:34:12 | arr | provenance | | -| impl/unsafeCode.rb:33:12:33:12 | x | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | provenance | | +| impl/unsafeCode.rb:33:11:33:23 | call to [] [element 0] | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | provenance | | +| impl/unsafeCode.rb:33:12:33:12 | x | impl/unsafeCode.rb:33:11:33:23 | call to [] [element 0] | provenance | | | impl/unsafeCode.rb:37:15:37:15 | x | impl/unsafeCode.rb:39:14:39:14 | x | provenance | | | impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | impl/unsafeCode.rb:40:10:40:12 | arr | provenance | | | impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | impl/unsafeCode.rb:44:10:44:12 | arr | provenance | | @@ -18,9 +19,11 @@ edges | impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | impl/unsafeCode.rb:60:5:60:7 | arr [element 0] | provenance | | | impl/unsafeCode.rb:60:17:60:17 | x | impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | provenance | | | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | impl/unsafeCode.rb:64:10:64:13 | arr2 | provenance | | +| impl/unsafeCode.rb:63:12:63:43 | call to [] [element 0] | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | provenance | | | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | impl/unsafeCode.rb:63:13:63:42 | call to join | provenance | | -| impl/unsafeCode.rb:63:13:63:42 | call to join | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | provenance | | -| impl/unsafeCode.rb:63:30:63:30 | y | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | provenance | | +| impl/unsafeCode.rb:63:13:63:42 | call to join | impl/unsafeCode.rb:63:12:63:43 | call to [] [element 0] | provenance | | +| impl/unsafeCode.rb:63:19:63:31 | call to [] [element 1] | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | provenance | | +| impl/unsafeCode.rb:63:30:63:30 | y | impl/unsafeCode.rb:63:19:63:31 | call to [] [element 1] | provenance | | nodes | impl/unsafeCode.rb:2:12:2:17 | target | semmle.label | target | | impl/unsafeCode.rb:3:17:3:25 | #{...} | semmle.label | #{...} | @@ -32,6 +35,7 @@ nodes | impl/unsafeCode.rb:29:10:29:15 | my_arr | semmle.label | my_arr | | impl/unsafeCode.rb:32:21:32:21 | x | semmle.label | x | | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | semmle.label | arr [element 0] | +| impl/unsafeCode.rb:33:11:33:23 | call to [] [element 0] | semmle.label | call to [] [element 0] | | impl/unsafeCode.rb:33:12:33:12 | x | semmle.label | x | | impl/unsafeCode.rb:34:10:34:12 | arr | semmle.label | arr | | impl/unsafeCode.rb:37:15:37:15 | x | semmle.label | x | @@ -50,8 +54,10 @@ nodes | impl/unsafeCode.rb:60:17:60:17 | x | semmle.label | x | | impl/unsafeCode.rb:61:10:61:12 | arr | semmle.label | arr | | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | semmle.label | arr2 [element 0] | +| impl/unsafeCode.rb:63:12:63:43 | call to [] [element 0] | semmle.label | call to [] [element 0] | | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | semmle.label | call to Array [element 1] | | impl/unsafeCode.rb:63:13:63:42 | call to join | semmle.label | call to join | +| impl/unsafeCode.rb:63:19:63:31 | call to [] [element 1] | semmle.label | call to [] [element 1] | | impl/unsafeCode.rb:63:30:63:30 | y | semmle.label | y | | impl/unsafeCode.rb:64:10:64:13 | arr2 | semmle.label | arr2 | subpaths diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected index cb29945fbee..bf95f464117 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected @@ -12,7 +12,8 @@ edges | logging.rb:3:1:3:8 | password | logging.rb:28:26:28:33 | password | provenance | | | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:3:1:3:8 | password | provenance | | | logging.rb:30:1:30:4 | hsh1 [element :password] | logging.rb:38:20:38:23 | hsh1 [element :password] | provenance | | -| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | logging.rb:30:1:30:4 | hsh1 [element :password] | provenance | | +| logging.rb:30:8:30:55 | call to [] [element :password] | logging.rb:30:1:30:4 | hsh1 [element :password] | provenance | | +| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | logging.rb:30:8:30:55 | call to [] [element :password] | provenance | | | logging.rb:34:1:34:4 | [post] hsh2 [element :password] | logging.rb:35:1:35:4 | hsh3 [element :password] | provenance | | | logging.rb:34:1:34:4 | [post] hsh2 [element :password] | logging.rb:40:20:40:23 | hsh2 [element :password] | provenance | | | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | logging.rb:34:1:34:4 | [post] hsh2 [element :password] | provenance | | @@ -53,6 +54,7 @@ nodes | logging.rb:26:18:26:34 | "pw: #{...}" | semmle.label | "pw: #{...}" | | logging.rb:28:26:28:33 | password | semmle.label | password | | logging.rb:30:1:30:4 | hsh1 [element :password] | semmle.label | hsh1 [element :password] | +| logging.rb:30:8:30:55 | call to [] [element :password] | semmle.label | call to [] [element :password] | | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | semmle.label | "aec5058e61f7f122998b1a30ee2c66b6" | | logging.rb:34:1:34:4 | [post] hsh2 [element :password] | semmle.label | [post] hsh2 [element :password] | | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | semmle.label | "beeda625d7306b45784d91ea0336e201" | diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/PlistUnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/PlistUnsafeDeserialization.rb deleted file mode 100644 index 63f64b5cd22..00000000000 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/PlistUnsafeDeserialization.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'yaml' -class UsersController < ActionController::Base - def example - # not safe - result = Plist.parse_xml(params[:yaml_string]) - result = Plist.parse_xml(params[:yaml_string], marshal: true) - - # safe - result = Plist.parse_xml(params[:yaml_string], marshal: false) - end -end - - diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected index bf0376f3959..71e206901b9 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected @@ -1,6 +1,4 @@ edges -| PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | provenance | | -| PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | provenance | | | UnsafeDeserialization.rb:11:5:11:19 | serialized_data | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | provenance | | | UnsafeDeserialization.rb:11:23:11:50 | call to decode64 | UnsafeDeserialization.rb:11:5:11:19 | serialized_data | provenance | | | UnsafeDeserialization.rb:11:39:11:44 | call to params | UnsafeDeserialization.rb:11:39:11:50 | ...[...] | provenance | | @@ -40,21 +38,22 @@ edges | UnsafeDeserialization.rb:115:5:115:13 | yaml_data | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | provenance | | | UnsafeDeserialization.rb:115:17:115:22 | call to params | UnsafeDeserialization.rb:115:17:115:28 | ...[...] | provenance | | | UnsafeDeserialization.rb:115:17:115:28 | ...[...] | UnsafeDeserialization.rb:115:5:115:13 | yaml_data | provenance | | -| YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | YAMLUnsafeDeserialization.rb:14:39:14:58 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:14:39:14:58 | ...[...] | YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | provenance | | -| YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | YAMLUnsafeDeserialization.rb:16:17:16:36 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:16:17:16:36 | ...[...] | YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | provenance | | -| YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | YAMLUnsafeDeserialization.rb:17:22:17:39 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:17:22:17:39 | ...[...] | YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | provenance | | +| UnsafeDeserialization.rb:122:5:122:13 | yaml_data | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | provenance | | +| UnsafeDeserialization.rb:122:17:122:22 | call to params | UnsafeDeserialization.rb:122:17:122:28 | ...[...] | provenance | | +| UnsafeDeserialization.rb:122:17:122:28 | ...[...] | UnsafeDeserialization.rb:122:5:122:13 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | provenance | | +| UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:137:17:137:28 | ...[...] | provenance | | +| UnsafeDeserialization.rb:137:17:137:28 | ...[...] | UnsafeDeserialization.rb:137:5:137:13 | yaml_data | provenance | | +| UnsafeDeserialization.rb:149:5:149:14 | plist_data | UnsafeDeserialization.rb:150:30:150:39 | plist_data | provenance | | +| UnsafeDeserialization.rb:149:5:149:14 | plist_data | UnsafeDeserialization.rb:151:30:151:39 | plist_data | provenance | | +| UnsafeDeserialization.rb:149:18:149:23 | call to params | UnsafeDeserialization.rb:149:18:149:29 | ...[...] | provenance | | +| UnsafeDeserialization.rb:149:18:149:29 | ...[...] | UnsafeDeserialization.rb:149:5:149:14 | plist_data | provenance | | nodes -| PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | semmle.label | call to params | -| PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | semmle.label | ...[...] | -| PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | semmle.label | call to params | -| PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:11:5:11:19 | serialized_data | semmle.label | serialized_data | | UnsafeDeserialization.rb:11:23:11:50 | call to decode64 | semmle.label | call to decode64 | | UnsafeDeserialization.rb:11:39:11:44 | call to params | semmle.label | call to params | @@ -106,32 +105,31 @@ nodes | UnsafeDeserialization.rb:115:17:115:22 | call to params | semmle.label | call to params | | UnsafeDeserialization.rb:115:17:115:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | semmle.label | yaml_data | -| UnsafeDeserialization.rb:120:24:120:34 | call to read | semmle.label | call to read | -| UnsafeDeserialization.rb:123:24:123:33 | call to gets | semmle.label | call to gets | -| UnsafeDeserialization.rb:126:24:126:32 | call to read | semmle.label | call to read | -| UnsafeDeserialization.rb:129:24:129:27 | call to gets | semmle.label | call to gets | -| UnsafeDeserialization.rb:132:24:132:32 | call to readlines | semmle.label | call to readlines | -| YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:14:39:14:58 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | semmle.label | call to to_ruby | -| YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | semmle.label | call to to_ruby | -| YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:16:17:16:36 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | semmle.label | call to to_ruby | -| YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:17:22:17:39 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:122:5:122:13 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:122:17:122:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:122:17:122:28 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:123:25:123:33 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:137:17:137:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:137:17:137:28 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:138:32:138:40 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:139:37:139:45 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:140:32:140:40 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeDeserialization.rb:149:5:149:14 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:149:18:149:23 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:149:18:149:29 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:150:30:150:39 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:151:30:151:39 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:161:24:161:34 | call to read | semmle.label | call to read | +| UnsafeDeserialization.rb:164:24:164:33 | call to gets | semmle.label | call to gets | +| UnsafeDeserialization.rb:167:24:167:32 | call to read | semmle.label | call to read | +| UnsafeDeserialization.rb:170:24:170:27 | call to gets | semmle.label | call to gets | +| UnsafeDeserialization.rb:173:24:173:32 | call to readlines | semmle.label | call to readlines | subpaths #select -| PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | Unsafe deserialization depends on a $@. | PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | user-provided value | -| PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | Unsafe deserialization depends on a $@. | PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | user-provided value | | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | UnsafeDeserialization.rb:11:39:11:44 | call to params | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:11:39:11:44 | call to params | user-provided value | | UnsafeDeserialization.rb:18:30:18:44 | serialized_data | UnsafeDeserialization.rb:17:39:17:44 | call to params | UnsafeDeserialization.rb:18:30:18:44 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:17:39:17:44 | call to params | user-provided value | | UnsafeDeserialization.rb:24:24:24:32 | json_data | UnsafeDeserialization.rb:23:17:23:22 | call to params | UnsafeDeserialization.rb:24:24:24:32 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:23:17:23:22 | call to params | user-provided value | @@ -145,15 +143,17 @@ subpaths | UnsafeDeserialization.rb:94:22:94:29 | xml_data | UnsafeDeserialization.rb:93:16:93:21 | call to params | UnsafeDeserialization.rb:94:22:94:29 | xml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:93:16:93:21 | call to params | user-provided value | | UnsafeDeserialization.rb:110:34:110:36 | xml | UnsafeDeserialization.rb:109:11:109:16 | call to params | UnsafeDeserialization.rb:110:34:110:36 | xml | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:109:11:109:16 | call to params | user-provided value | | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | UnsafeDeserialization.rb:115:17:115:22 | call to params | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:115:17:115:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:120:24:120:34 | call to read | UnsafeDeserialization.rb:120:24:120:34 | call to read | UnsafeDeserialization.rb:120:24:120:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:120:24:120:34 | call to read | value from stdin | -| UnsafeDeserialization.rb:123:24:123:33 | call to gets | UnsafeDeserialization.rb:123:24:123:33 | call to gets | UnsafeDeserialization.rb:123:24:123:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:123:24:123:33 | call to gets | value from stdin | -| UnsafeDeserialization.rb:126:24:126:32 | call to read | UnsafeDeserialization.rb:126:24:126:32 | call to read | UnsafeDeserialization.rb:126:24:126:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:126:24:126:32 | call to read | value from stdin | -| UnsafeDeserialization.rb:129:24:129:27 | call to gets | UnsafeDeserialization.rb:129:24:129:27 | call to gets | UnsafeDeserialization.rb:129:24:129:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:129:24:129:27 | call to gets | value from stdin | -| UnsafeDeserialization.rb:132:24:132:32 | call to readlines | UnsafeDeserialization.rb:132:24:132:32 | call to readlines | UnsafeDeserialization.rb:132:24:132:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:132:24:132:32 | call to readlines | value from stdin | -| YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | user-provided value | +| UnsafeDeserialization.rb:123:25:123:33 | yaml_data | UnsafeDeserialization.rb:122:17:122:22 | call to params | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:122:17:122:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:138:32:138:40 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:139:37:139:45 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:140:32:140:40 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:150:30:150:39 | plist_data | UnsafeDeserialization.rb:149:18:149:23 | call to params | UnsafeDeserialization.rb:150:30:150:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:149:18:149:23 | call to params | user-provided value | +| UnsafeDeserialization.rb:151:30:151:39 | plist_data | UnsafeDeserialization.rb:149:18:149:23 | call to params | UnsafeDeserialization.rb:151:30:151:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:149:18:149:23 | call to params | user-provided value | +| UnsafeDeserialization.rb:161:24:161:34 | call to read | UnsafeDeserialization.rb:161:24:161:34 | call to read | UnsafeDeserialization.rb:161:24:161:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:24:161:34 | call to read | value from stdin | +| UnsafeDeserialization.rb:164:24:164:33 | call to gets | UnsafeDeserialization.rb:164:24:164:33 | call to gets | UnsafeDeserialization.rb:164:24:164:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:164:24:164:33 | call to gets | value from stdin | +| UnsafeDeserialization.rb:167:24:167:32 | call to read | UnsafeDeserialization.rb:167:24:167:32 | call to read | UnsafeDeserialization.rb:167:24:167:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:167:24:167:32 | call to read | value from stdin | +| UnsafeDeserialization.rb:170:24:170:27 | call to gets | UnsafeDeserialization.rb:170:24:170:27 | call to gets | UnsafeDeserialization.rb:170:24:170:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:170:24:170:27 | call to gets | value from stdin | +| UnsafeDeserialization.rb:173:24:173:32 | call to readlines | UnsafeDeserialization.rb:173:24:173:32 | call to readlines | UnsafeDeserialization.rb:173:24:173:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:173:24:173:32 | call to readlines | value from stdin | diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb index ed89f3e566c..633a99c14fb 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb @@ -110,10 +110,51 @@ class UsersController < ActionController::Base hash = Hash.from_trusted_xml(xml) end - # BAD + # BAD before psych version 4.0.0 def route15 yaml_data = params[:key] object = Psych.load yaml_data + object = Psych.load_file yaml_data + end + + # GOOD In psych version 4.0.0 and above + def route16 + yaml_data = params[:key] + object = Psych.load yaml_data + object = Psych.load_file yaml_data + end + + # GOOD + def route17 + yaml_data = params[:key] + object = Psych.parse_stream(yaml_data) + object = Psych.parse(yaml_data) + object = Psych.parse_file(yaml_data) + end + + # BAD + def route18 + yaml_data = params[:key] + object = Psych.unsafe_load(yaml_data) + object = Psych.unsafe_load_file(yaml_data) + object = Psych.load_stream(yaml_data) + parse_output = Psych.parse_stream(yaml_data) + object = parse_output.to_ruby + object = Psych.parse(yaml_data).to_ruby + object = Psych.parse_file(yaml_data).to_ruby + end + + # BAD + def route19 + plist_data = params[:key] + result = Plist.parse_xml(plist_data) + result = Plist.parse_xml(plist_data, marshal: true) + end + + # GOOD + def route20 + plist_data = params[:key] + result = Plist.parse_xml(plist_data, marshal: false) end def stdin @@ -131,4 +172,4 @@ class UsersController < ActionController::Base # Kernel.readlines object = YAML.load readlines end -end +end \ No newline at end of file diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb deleted file mode 100644 index 6e836a0a049..00000000000 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'yaml' -class UsersController < ActionController::Base - def example - # safe - Psych.load(params[:yaml_string]) - Psych.load_file(params[:yaml_file]) - Psych.parse_stream(params[:yaml_string]) - Psych.parse(params[:yaml_string]) - Psych.parse_file(params[:yaml_file]) - # unsafe - Psych.unsafe_load(params[:yaml_string]) - Psych.unsafe_load_file(params[:yaml_file]) - Psych.load_stream(params[:yaml_string]) - parse_output = Psych.parse_stream(params[:yaml_string]) - parse_output.to_ruby - Psych.parse(params[:yaml_string]).to_ruby - Psych.parse_file(params[:yaml_file]).to_ruby - - end -end - - diff --git a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected index 84a46276371..e556d12096d 100644 --- a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected +++ b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected @@ -1,6 +1,7 @@ edges | tst.rb:1:7:1:7 | r | tst.rb:2:4:2:4 | r | provenance | | -| tst.rb:2:4:2:4 | r | tst.rb:2:3:2:15 | call to pack | provenance | | +| tst.rb:2:3:2:5 | call to [] [element 0] | tst.rb:2:3:2:15 | call to pack | provenance | | +| tst.rb:2:4:2:4 | r | tst.rb:2:3:2:5 | call to [] [element 0] | provenance | | | tst.rb:5:1:5:23 | totally_harmless_string | tst.rb:7:8:7:30 | totally_harmless_string | provenance | | | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | tst.rb:5:1:5:23 | totally_harmless_string | provenance | | | tst.rb:7:8:7:30 | totally_harmless_string | tst.rb:1:7:1:7 | r | provenance | | @@ -12,6 +13,7 @@ edges | tst.rb:17:6:17:32 | another_questionable_string | tst.rb:17:6:17:38 | call to strip | provenance | | nodes | tst.rb:1:7:1:7 | r | semmle.label | r | +| tst.rb:2:3:2:5 | call to [] [element 0] | semmle.label | call to [] [element 0] | | tst.rb:2:3:2:15 | call to pack | semmle.label | call to pack | | tst.rb:2:4:2:4 | r | semmle.label | r | | tst.rb:5:1:5:23 | totally_harmless_string | semmle.label | totally_harmless_string | diff --git a/ruby/tools/BUILD.bazel b/ruby/tools/BUILD.bazel new file mode 100644 index 00000000000..4ec50830a43 --- /dev/null +++ b/ruby/tools/BUILD.bazel @@ -0,0 +1,11 @@ +load("@semmle_code//:dist.bzl", "pack_zip") + +pack_zip( + name = "tools", + srcs = glob(["**/*"]), + excludes = [ + "BUILD.bazel", + ], + prefix = "tools", + visibility = ["//visibility:public"], +) diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index dbfa6ef4512..75f2ca53f98 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.10 + +No user-facing changes. + ## 0.1.9 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/0.1.10.md b/shared/controlflow/change-notes/released/0.1.10.md new file mode 100644 index 00000000000..47358eeee93 --- /dev/null +++ b/shared/controlflow/change-notes/released/0.1.10.md @@ -0,0 +1,3 @@ +## 0.1.10 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 1425c0edf7f..30f5ca88be0 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.9 +lastReleaseVersion: 0.1.10 diff --git a/shared/controlflow/codeql/controlflow/Cfg.qll b/shared/controlflow/codeql/controlflow/Cfg.qll index 682240972dc..e7e033f9ae2 100644 --- a/shared/controlflow/codeql/controlflow/Cfg.qll +++ b/shared/controlflow/codeql/controlflow/Cfg.qll @@ -4,6 +4,7 @@ */ private import codeql.util.Location +private import codeql.util.FileSystem /** Provides the language-specific input specification. */ signature module InputSig { @@ -1132,19 +1133,19 @@ module Make Input> { final class AstCfgNode = AstCfgNodeImpl; + /** A node to be included in the output of `TestOutput`. */ + signature class RelevantNodeSig extends Node { + /** + * Gets a string used to resolve ties in node and edge ordering. + */ + string getOrderDisambiguation(); + } + /** * Import this module into a `.ql` file of `@kind graph` to render a CFG. The * graph is restricted to nodes from `RelevantNode`. */ - module TestOutput { - /** A CFG node to include in the output. */ - abstract class RelevantNode extends Node { - /** - * Gets a string used to resolve ties in node and edge ordering. - */ - string getOrderDisambiguation() { result = "" } - } - + module TestOutput { /** Holds if `n` is a relevant node in the CFG. */ query predicate nodes(RelevantNode n, string attr, string val) { attr = "semmle.order" and @@ -1192,6 +1193,78 @@ module Make Input> { } } + /** Provides the input to `ViewCfgQuery`. */ + signature module ViewCfgQueryInputSig { + /** The source file selected in the IDE. Should be an `external` predicate. */ + string selectedSourceFile(); + + /** The source line selected in the IDE. Should be an `external` predicate. */ + int selectedSourceLine(); + + /** The source column selected in the IDE. Should be an `external` predicate. */ + int selectedSourceColumn(); + + /** + * Holds if CFG scope `scope` spans column `startColumn` of line `startLine` to + * column `endColumn` of line `endLine` in `file`. + */ + predicate cfgScopeSpan( + CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ); + } + + /** + * Provides an implementation for a `View CFG` query. + * + * Import this module into a `.ql` that looks like + * + * ```ql + * @name Print CFG + * @description Produces a representation of a file's Control Flow Graph. + * This query is used by the VS Code extension. + * @id /print-cfg + * @kind graph + * @tags ide-contextual-queries/print-cfg + * ``` + */ + module ViewCfgQuery ViewCfgQueryInput> { + private import ViewCfgQueryInput + + bindingset[file, line, column] + private CfgScope smallestEnclosingScope(File file, int line, int column) { + result = + min(CfgScope scope, int startLine, int startColumn, int endLine, int endColumn | + cfgScopeSpan(scope, file, startLine, startColumn, endLine, endColumn) and + ( + startLine < line + or + startLine = line and startColumn <= column + ) and + ( + endLine > line + or + endLine = line and endColumn >= column + ) + | + scope order by startLine desc, startColumn desc, endLine, endColumn + ) + } + + private import IdeContextual + + private class RelevantNode extends Node { + RelevantNode() { + this.getScope() = + smallestEnclosingScope(getFileBySourceArchiveName(selectedSourceFile()), + selectedSourceLine(), selectedSourceColumn()) + } + + string getOrderDisambiguation() { result = "" } + } + + import TestOutput + } + /** Provides a set of consistency queries. */ module Consistency { /** Holds if `s1` and `s2` are distinct representations of the same set. */ diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index a3018c3f456..1d43802be42 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 0.1.9 +version: 0.1.10 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 67a5bf589f4..ef80788bded 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.1 + +No user-facing changes. + ## 0.2.0 ### Breaking Changes diff --git a/shared/dataflow/change-notes/released/0.2.1.md b/shared/dataflow/change-notes/released/0.2.1.md new file mode 100644 index 00000000000..3dbfc85fe11 --- /dev/null +++ b/shared/dataflow/change-notes/released/0.2.1.md @@ -0,0 +1,3 @@ +## 0.2.1 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 5274e27ed52..df29a726bcc 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.0 +lastReleaseVersion: 0.2.1 diff --git a/shared/dataflow/codeql/dataflow/DataFlow.qll b/shared/dataflow/codeql/dataflow/DataFlow.qll index fcfd481f3dc..46fe0fe80d3 100644 --- a/shared/dataflow/codeql/dataflow/DataFlow.qll +++ b/shared/dataflow/codeql/dataflow/DataFlow.qll @@ -283,6 +283,9 @@ signature module InputSig { ) { any() } + + /** Holds if `fieldFlowBranchLimit` should be ignored for flow going into/out of `c`. */ + default predicate ignoreFieldFlowBranchLimit(DataFlowCallable c) { none() } } module Configs { diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index 3773a2225dd..840e67e9fa7 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -1117,7 +1117,9 @@ module MakeImpl { exists(int b, int j | b = branch(ret) and j = join(out) and - if b.minimum(j) <= Config::fieldFlowBranchLimit() + if + b.minimum(j) <= Config::fieldFlowBranchLimit() or + ignoreFieldFlowBranchLimit(ret.getEnclosingCallable()) then allowsFieldFlow = true else allowsFieldFlow = false ) @@ -1136,7 +1138,9 @@ module MakeImpl { exists(int b, int j | b = branch(arg) and j = join(p) and - if b.minimum(j) <= Config::fieldFlowBranchLimit() + if + b.minimum(j) <= Config::fieldFlowBranchLimit() or + ignoreFieldFlowBranchLimit(p.getEnclosingCallable()) then allowsFieldFlow = true else allowsFieldFlow = false ) diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 25a276d41a7..f3e840720ab 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -1081,8 +1081,8 @@ module Make Input> { SummaryComponentStack outputContents | summary(c, inputContents, outputContents, preservesValue) and - pred = summaryNodeInputState(c, inputContents) and - succ = summaryNodeOutputState(c, outputContents) + pred = summaryNodeInputState(pragma[only_bind_into](c), inputContents) and + succ = summaryNodeOutputState(pragma[only_bind_into](c), outputContents) | preservesValue = true or diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 16be0508de3..ee422e02ea9 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 0.2.0 +version: 0.2.1 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 4d09057118c..4730366775e 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/mad/change-notes/released/0.2.10.md b/shared/mad/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/mad/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index e7825246a9d..6d7269ef3da 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 0.2.9 +version: 0.2.10 groups: shared library: true dependencies: null diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 5b8dbcfab22..9943dcb7972 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/0.0.9.md b/shared/rangeanalysis/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 610d9750998..01db5d5734d 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 0.0.8 +version: 0.0.9 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index cd5f91f71ec..c05869c153d 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/regex/change-notes/released/0.2.10.md b/shared/regex/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/regex/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll b/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll index b3c6e64837b..6eb18aeeebc 100644 --- a/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll +++ b/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll @@ -365,11 +365,19 @@ module Make { ) } - string getChar(CharNode t) { + private string getCharInternal(CharNode t) { exists(InputSymbol s1, InputSymbol s2, InputSymbol s3 | t = Step(s1, s2, s3, _) | result = getAThreewayIntersect(s1, s2, s3) ) } + + string getChar(CharNode t) { + result = getCharInternal(t) and + not ( + // skip the upper-case char if we have the lower-case version. + result.toLowerCase() != result and result.toLowerCase() = getCharInternal(t) + ) + } } /** diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 7d802fcdcce..0d4f485312f 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 0.2.9 +version: 0.2.10 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 01acfae0148..a9161ff578b 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/ssa/change-notes/released/0.2.10.md b/shared/ssa/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/ssa/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 4fcfd63169c..2ad254711a5 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 0.2.9 +version: 0.2.10 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index fba2a870356..a59e560c415 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/0.0.9.md b/shared/threat-models/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/threat-models/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index ee3901ba2b6..60cbbc56fcb 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 0.0.8 +version: 0.0.9 library: true groups: shared dataExtensions: diff --git a/shared/tree-sitter-extractor/src/autobuilder.rs b/shared/tree-sitter-extractor/src/autobuilder.rs index 97ea5a9b32c..10f66286ab8 100644 --- a/shared/tree-sitter-extractor/src/autobuilder.rs +++ b/shared/tree-sitter-extractor/src/autobuilder.rs @@ -74,14 +74,35 @@ impl Autobuilder { cmd.arg("--working-dir=."); cmd.arg(&self.database); - for line in env::var("LGTM_INDEX_FILTERS") - .unwrap_or_default() - .split('\n') - { + // LGTM_INDEX_FILTERS is a prioritized list of include/exclude filters, where + // later filters take priority over earlier ones. + // 1) If we only see includes, we should ignore everything else, which is + // achieved by using `--also-match={filter}`. + // 2) if we see both includes and excludes, we process them in order by using + // `--also-match={filter}` for includes and `--also-match=!{filter}` for + // excludes. + // 3) If we only see excludes, we should accept everything else. Naive solution + // of just using `--also-match=!{filter}` is not good enough, since nothing + // will make the `--also-match`` pass for any file. In that case, we add a dummy + // initial `--also-match=**/*``to get the desired behavior. + let tmp = env::var("LGTM_INDEX_FILTERS").unwrap_or_default(); + let lgtm_index_filters = tmp.split('\n'); + let lgtm_index_filters_has_include = lgtm_index_filters + .clone() + .any(|s| s.starts_with("include:")); + let lgtm_index_filters_has_exclude = lgtm_index_filters + .clone() + .any(|s| s.starts_with("exclude:")); + + if !lgtm_index_filters_has_include && lgtm_index_filters_has_exclude { + cmd.arg("--also-match=**/*"); + } + + for line in lgtm_index_filters { if let Some(stripped) = line.strip_prefix("include:") { cmd.arg("--also-match=".to_owned() + stripped); } else if let Some(stripped) = line.strip_prefix("exclude:") { - cmd.arg("--exclude=".to_owned() + stripped); + cmd.arg("--also-match=!".to_owned() + stripped); } } let exit = &cmd.spawn()?.wait()?; diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 1db3a01af0b..560ad058d5b 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/0.2.10.md b/shared/tutorial/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/tutorial/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 496aadc0c7c..69116705c1b 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 0.2.9 +version: 0.2.10 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index afc857bc6bc..350f9ecbeae 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/0.2.10.md b/shared/typetracking/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/typetracking/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll index 563813aab92..f5efc6c6b56 100644 --- a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll +++ b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll @@ -785,24 +785,26 @@ module TypeTracking { ) } + private Node getNodeMid(PathNodeFwd n) { n = TPathNodeMid(result, _) } + + private Node getNodeSink(PathNodeFwd n) { n = TPathNodeSink(result) } + private predicate edgeCand(PathNodeFwd n1, PathNodeFwd n2) { exists(PathNodeFwd tgt | - edgeCand(n1.getNode(), n1.getTypeTracker(), tgt.getNode(), tgt.getTypeTracker()) + edgeCand(getNodeMid(n1), n1.getTypeTracker(), getNodeMid(tgt), tgt.getTypeTracker()) | n2 = tgt or - n2 = TPathNodeSink(tgt.getNode()) and tgt.getTypeTracker().end() + n2 = TPathNodeSink(getNodeMid(tgt)) and tgt.getTypeTracker().end() ) or n1.getTypeTracker().end() and - flowsTo(n1.getNode(), n2.getNode()) and - n1.getNode() != n2.getNode() and - n2 instanceof TPathNodeSink + flowsTo(getNodeMid(n1), getNodeSink(n2)) and + getNodeMid(n1) != getNodeSink(n2) or - sourceSimpleLocalSmallSteps(n1.getNode(), n2.getNode()) and - n1.getNode() != n2.getNode() and - n1.isSource() and - n2.isSink() + sourceSimpleLocalSmallSteps(n1.getNode(), getNodeSink(n2)) and + n1.getNode() != getNodeSink(n2) and + n1.isSource() } private predicate reachRev(PathNodeFwd n) { diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index f4a75f57cd1..fbbdcf5162a 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 0.2.9 +version: 0.2.10 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 66c5871d982..54b1eaa4d58 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/typos/change-notes/released/0.2.10.md b/shared/typos/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/typos/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index aa1abf5a3d5..4d59d9b3c34 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 0.2.9 +version: 0.2.10 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 63832e927fa..1ca1f71bcbc 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/util/change-notes/released/0.2.10.md b/shared/util/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/util/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/util/codeql/util/FileSystem.qll b/shared/util/codeql/util/FileSystem.qll index e742ad87c40..a9eb21279b6 100644 --- a/shared/util/codeql/util/FileSystem.qll +++ b/shared/util/codeql/util/FileSystem.qll @@ -219,3 +219,140 @@ module Make { override string getURL() { result = "file://" + this.getAbsolutePath() + ":0:0:0:0" } } } + +/** A file. */ +signature class FileSig { + /** + * Gets the absolute, canonical path of this container, using forward slashes + * as path separator. + * + * The path starts with a _root prefix_ followed by zero or more _path + * segments_ separated by forward slashes. + * + * The root prefix is of one of the following forms: + * + * 1. A single forward slash `/` (Unix-style) + * 2. An upper-case drive letter followed by a colon and a forward slash, + * such as `C:/` (Windows-style) + * 3. Two forward slashes, a computer name, and then another forward slash, + * such as `//FileServer/` (UNC-style) + * + * Path segments are never empty (that is, absolute paths never contain two + * contiguous slashes, except as part of a UNC-style root prefix). Also, path + * segments never contain forward slashes, and no path segment is of the + * form `.` (one dot) or `..` (two dots). + * + * Note that an absolute path never ends with a forward slash, except if it is + * a bare root prefix, that is, the path has no path segments. A container + * whose absolute path has no segments is always a `Folder`, not a `File`. + */ + string getAbsolutePath(); + + /** + * Gets the base name of this container including extension, that is, the last + * segment of its absolute path, or the empty string if it has no segments. + * + * Here are some examples of absolute paths and the corresponding base names + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + * + *
    Absolute pathBase name
    "/tmp/tst.txt""tst.txt"
    "C:/Program Files (x86)""Program Files (x86)"
    "/"""
    "C:/"""
    "D:/"""
    "//FileServer/"""
    + */ + string getBaseName(); + + /** + * Gets the extension of this container, that is, the suffix of its base name + * after the last dot character, if any. + * + * In particular, + * + * - if the name does not include a dot, there is no extension, so this + * predicate has no result; + * - if the name ends in a dot, the extension is the empty string; + * - if the name contains multiple dots, the extension follows the last dot. + * + * Here are some examples of absolute paths and the corresponding extensions + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathExtension
    "/tmp/tst.txt""txt"
    "/tmp/.classpath""classpath"
    "/bin/bash"not defined
    "/tmp/tst2."""
    "/tmp/x.tar.gz""gz"
    + */ + string getExtension(); + + /** + * Gets the relative path of this file or folder from the root folder of the + * analyzed source location. The relative path of the root folder itself is + * the empty string. + * + * This has no result if the container is outside the source root, that is, + * if the root folder is not a reflexive, transitive parent of this container. + */ + string getRelativePath(); + + /** + * Gets the stem of this container, that is, the prefix of its base name up to + * (but not including) the last dot character if there is one, or the entire + * base name if there is not. + * + * Here are some examples of absolute paths and the corresponding stems + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathStem
    "/tmp/tst.txt""tst"
    "/tmp/.classpath"""
    "/bin/bash""bash"
    "/tmp/tst2.""tst2"
    "/tmp/x.tar.gz""x.tar"
    + */ + string getStem(); + + /** + * Gets a URL representing the location of this container. + * + * For more information see https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/#providing-urls. + */ + string getURL(); + + /** + * Gets a textual representation of the path of this container. + * + * This is the absolute path of the container. + */ + string toString(); +} + +/** + * Provides shared predicates related to contextual queries in the code viewer. + */ +module IdeContextual { + /** + * Returns the `File` matching the given source file name as encoded by the VS + * Code extension. + */ + File getFileBySourceArchiveName(string name) { + // The name provided for a file in the source archive by the VS Code extension + // has some differences from the absolute path in the database: + // 1. colons are replaced by underscores + // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> + // "/C_/foo/bar" + // 3. double slashes in UNC prefixes are replaced with a single slash + // We can handle 2 and 3 together by unconditionally adding a leading slash + // before replacing double slashes. + name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + } +} diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 067442e11e2..28ed738a93d 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 0.2.9 +version: 0.2.10 groups: shared library: true dependencies: null diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index e5495abcd50..9fd5ebc26ab 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.10 + +No user-facing changes. + ## 0.2.9 No user-facing changes. diff --git a/shared/yaml/change-notes/released/0.2.10.md b/shared/yaml/change-notes/released/0.2.10.md new file mode 100644 index 00000000000..81c9722b19f --- /dev/null +++ b/shared/yaml/change-notes/released/0.2.10.md @@ -0,0 +1,3 @@ +## 0.2.10 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index d021cf0a6be..a71167814cb 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.9 +lastReleaseVersion: 0.2.10 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index a35a2bf3ab5..9643ffcec66 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 0.2.9 +version: 0.2.10 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/BUILD.bazel b/swift/BUILD.bazel index 93d4fd9a7e4..2c7c1256782 100644 --- a/swift/BUILD.bazel +++ b/swift/BUILD.bazel @@ -115,6 +115,7 @@ py_binary( deps = [":_create_extractor_pack"], ) +# TODO this is unneeded here but still used in the internal repo. Remove once it's not generate_cmake( name = "cmake", targets = [ diff --git a/swift/CMakeLists.txt b/swift/CMakeLists.txt index 2b44cc58993..46bcd32db32 100644 --- a/swift/CMakeLists.txt +++ b/swift/CMakeLists.txt @@ -17,4 +17,4 @@ project(codeql) include(../misc/bazel/cmake/setup.cmake) -include_generated(//swift:cmake) +generate_and_include(//swift/...) diff --git a/swift/extractor/BUILD.bazel b/swift/extractor/BUILD.bazel index 984c205d97b..f711b3b9d2b 100644 --- a/swift/extractor/BUILD.bazel +++ b/swift/extractor/BUILD.bazel @@ -1,5 +1,4 @@ load("//swift:rules.bzl", "swift_cc_binary") -load("//misc/bazel/cmake:cmake.bzl", "generate_cmake") load("//misc/bazel:pkg_runfiles.bzl", "pkg_runfiles") swift_cc_binary( diff --git a/swift/extractor/config/BUILD.bazel b/swift/extractor/config/BUILD.bazel index 492db13f666..a38bb8c5d24 100644 --- a/swift/extractor/config/BUILD.bazel +++ b/swift/extractor/config/BUILD.bazel @@ -2,7 +2,7 @@ load("//swift:rules.bzl", "swift_cc_library") swift_cc_library( name = "config", - srcs = glob(["*.cpp"]), + srcs = [], hdrs = glob(["*.h"]), visibility = ["//swift:__subpackages__"], ) diff --git a/swift/extractor/remapping/SwiftFileInterception.cpp b/swift/extractor/remapping/SwiftFileInterception.cpp index c83049bcbcc..168132941ad 100644 --- a/swift/extractor/remapping/SwiftFileInterception.cpp +++ b/swift/extractor/remapping/SwiftFileInterception.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include diff --git a/swift/logging/tests/assertion-diagnostics/BUILD.bazel b/swift/logging/tests/assertion-diagnostics/BUILD.bazel index e51459e1e17..ea31eac779a 100644 --- a/swift/logging/tests/assertion-diagnostics/BUILD.bazel +++ b/swift/logging/tests/assertion-diagnostics/BUILD.bazel @@ -1,5 +1,4 @@ load("//swift:rules.bzl", "swift_cc_binary") -load("//misc/bazel/cmake:cmake.bzl", "generate_cmake") swift_cc_binary( name = "assert-false", diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index e88cd0259cc..8f14bfcedc9 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.3.10 + +### Bug Fixes + +* Fixed an issue where `TypeDecl.getFullName` would get stuck in an loop and fail when minor database inconsistencies are present. + ## 0.3.9 ### Minor Analysis Improvements diff --git a/swift/ql/lib/change-notes/released/0.3.10.md b/swift/ql/lib/change-notes/released/0.3.10.md new file mode 100644 index 00000000000..9d6286ff58a --- /dev/null +++ b/swift/ql/lib/change-notes/released/0.3.10.md @@ -0,0 +1,5 @@ +## 0.3.10 + +### Bug Fixes + +* Fixed an issue where `TypeDecl.getFullName` would get stuck in an loop and fail when minor database inconsistencies are present. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 3fa5180bcb4..76ca0ac8ba7 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.3.9 +lastReleaseVersion: 0.3.10 diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql b/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql index fa25c039263..2f9a0572111 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql +++ b/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql @@ -7,52 +7,45 @@ * @tags ide-contextual-queries/print-cfg */ -private import codeql.IDEContextual +private import codeql.swift.elements.File private import codeql.swift.controlflow.ControlFlowGraph -private import codeql.swift.controlflow.internal.ControlFlowGraphImpl::TestOutput +private import codeql.swift.controlflow.internal.ControlFlowGraphImpl as Impl +private import codeql.swift.controlflow.internal.ControlFlowGraphImplSpecific /** * Gets the source file to generate a CFG from. */ external string selectedSourceFile(); +private predicate selectedSourceFileAlias = selectedSourceFile/0; + /** * Gets the source line to generate a CFG from. */ -external string selectedSourceLine(); +external int selectedSourceLine(); + +private predicate selectedSourceLineAlias = selectedSourceLine/0; /** * Gets the source column to generate a CFG from. */ -external string selectedSourceColumn(); +external int selectedSourceColumn(); -bindingset[file, line, column] -private CfgScope smallestEnclosingScope(File file, int line, int column) { - result = - min(Location loc, CfgScope scope | - loc = scope.getLocation() and - ( - loc.getStartLine() < line - or - loc.getStartLine() = line and loc.getStartColumn() <= column - ) and - ( - loc.getEndLine() > line - or - loc.getEndLine() = line and loc.getEndColumn() >= column - ) and - loc.getFile() = file - | - scope - order by - loc.getStartLine() desc, loc.getStartColumn() desc, loc.getEndLine(), loc.getEndColumn() - ) -} +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; -class MyRelevantNode extends RelevantNode { - MyRelevantNode() { - this.getScope() = - smallestEnclosingScope(getFileBySourceArchiveName(selectedSourceFile()), - selectedSourceLine().toInt(), selectedSourceColumn().toInt()) +module ViewCfgQueryInput implements Impl::ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + CfgInput::CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } + +import Impl::ViewCfgQuery diff --git a/swift/ql/lib/codeql/swift/elements/File.qll b/swift/ql/lib/codeql/swift/elements/File.qll index 4645c6a1094..823430ee7ee 100644 --- a/swift/ql/lib/codeql/swift/elements/File.qll +++ b/swift/ql/lib/codeql/swift/elements/File.qll @@ -15,11 +15,64 @@ class File extends Generated::File { /** Gets the URL of this file. */ string getURL() { result = "file://" + this.getAbsolutePath() + ":0:0:0:0" } - /** Gets the base name of this file. */ - string getBaseName() { - result = this.getAbsolutePath().regexpCapture(".*/(([^/]*?)(?:\\.([^.]*))?)", 1) + /** + * Holds if either, + * - `part` is the base name of this container and `i = 1`, or + * - `part` is the stem of this container and `i = 2`, or + * - `part` is the extension of this container and `i = 3`. + */ + cached + private predicate splitAbsolutePath(string part, int i) { + part = this.getAbsolutePath().regexpCapture(".*/(([^/]*?)(?:\\.([^.]*))?)", i) } + /** Gets the base name of this file. */ + string getBaseName() { this.splitAbsolutePath(result, 1) } + + /** + * Gets the extension of this container, that is, the suffix of its base name + * after the last dot character, if any. + * + * In particular, + * + * - if the name does not include a dot, there is no extension, so this + * predicate has no result; + * - if the name ends in a dot, the extension is the empty string; + * - if the name contains multiple dots, the extension follows the last dot. + * + * Here are some examples of absolute paths and the corresponding extensions + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathExtension
    "/tmp/tst.txt""txt"
    "/tmp/.classpath""classpath"
    "/bin/bash"not defined
    "/tmp/tst2."""
    "/tmp/x.tar.gz""gz"
    + */ + string getExtension() { this.splitAbsolutePath(result, 3) } + + /** + * Gets the stem of this container, that is, the prefix of its base name up to + * (but not including) the last dot character if there is one, or the entire + * base name if there is not. + * + * Here are some examples of absolute paths and the corresponding stems + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathStem
    "/tmp/tst.txt""tst"
    "/tmp/.classpath"""
    "/bin/bash""bash"
    "/tmp/tst2.""tst2"
    "/tmp/x.tar.gz""x.tar"
    + */ + string getStem() { this.splitAbsolutePath(result, 2) } + /** * Gets the number of lines containing code in this file. This value * is approximate. diff --git a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll index 5e59669adcb..625229fcb13 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll @@ -2,9 +2,10 @@ private import codeql.swift.generated.decl.ExtensionDecl class ExtensionDecl extends Generated::ExtensionDecl { override string toString() { - result = "extension of " + this.getExtendedTypeDecl().toString() + result = + "extension of " + unique(NominalTypeDecl td | td = this.getExtendedTypeDecl()).toString() or - not exists(this.getExtendedTypeDecl()) and + count(this.getExtendedTypeDecl()) != 1 and result = "extension" } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll index e75e2ff9b40..9055f29d6ca 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll @@ -109,13 +109,13 @@ class TypeDecl extends Generated::TypeDecl { cached string getFullName() { not this.getEnclosingDecl() instanceof TypeDecl and - not this.getEnclosingDecl() instanceof ExtensionDecl and + not count(this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl()) = 1 and result = this.getName() or result = this.getEnclosingDecl().(TypeDecl).getFullName() + "." + this.getName() or result = - this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl().getFullName() + "." + - this.getName() + unique(NominalTypeDecl td | td = this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl()) + .getFullName() + "." + this.getName() } } diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 9dcac1c414a..70ec4798ea8 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 0.3.9 +version: 0.3.10 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 96615d06972..bda9834c9bc 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.10 + +No user-facing changes. + ## 0.3.9 ### New Queries diff --git a/swift/ql/src/change-notes/released/0.3.10.md b/swift/ql/src/change-notes/released/0.3.10.md new file mode 100644 index 00000000000..925a48fc52e --- /dev/null +++ b/swift/ql/src/change-notes/released/0.3.10.md @@ -0,0 +1,3 @@ +## 0.3.10 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 3fa5180bcb4..76ca0ac8ba7 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.3.9 +lastReleaseVersion: 0.3.10 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index e711ab8b7b3..ba66b065529 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 0.3.9 +version: 0.3.10 groups: - swift - queries diff --git a/swift/ql/test/library-tests/controlflow/graph/Cfg.ql b/swift/ql/test/library-tests/controlflow/graph/Cfg.ql index 093638e5f87..661ab48818a 100644 --- a/swift/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/swift/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -4,16 +4,17 @@ import swift import codeql.swift.controlflow.ControlFlowGraph -import codeql.swift.controlflow.internal.ControlFlowGraphImpl::TestOutput -class MyRelevantNode extends RelevantNode { +class MyRelevantNode extends ControlFlowNode { MyRelevantNode() { this.getScope().getLocation().getFile().getName().matches("%swift/ql/test%") } private AstNode asAstNode() { result = this.getAstNode().asAstNode() } - override string getOrderDisambiguation() { + string getOrderDisambiguation() { result = this.asAstNode().getPrimaryQlClasses() or not exists(this.asAstNode()) and result = "" } } + +import codeql.swift.controlflow.internal.ControlFlowGraphImpl::TestOutput diff --git a/swift/third_party/BUILD.picosha2.bazel b/swift/third_party/BUILD.picosha2.bazel index c8d2d8e01a1..b6eb4292cb8 100644 --- a/swift/third_party/BUILD.picosha2.bazel +++ b/swift/third_party/BUILD.picosha2.bazel @@ -1,6 +1,6 @@ cc_library( name = "picosha2", hdrs = glob(["*.h"]), - strip_include_prefix = ".", + includes = ["."], visibility = ["//visibility:public"], ) diff --git a/swift/third_party/BUILD.swift-llvm-support.bazel b/swift/third_party/BUILD.swift-llvm-support.bazel index 91337d0aa41..af98184b673 100644 --- a/swift/third_party/BUILD.swift-llvm-support.bazel +++ b/swift/third_party/BUILD.swift-llvm-support.bazel @@ -1,12 +1,13 @@ -load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") - cc_library( name = "swift-llvm-support", - srcs = glob([ - "*.a", - "*.so", - "*.dylib", - ]), + srcs = glob( + [ + "*.a", + "*.so", + "*.dylib", + ], + allow_empty = True, # Either *.so or *.dylib will be empty + ), hdrs = glob([ "include/**/*", "stdlib/**/*", diff --git a/swift/third_party/load.bzl b/swift/third_party/load.bzl index ddd4d1ce5d9..6f876f333f2 100644 --- a/swift/third_party/load.bzl +++ b/swift/third_party/load.bzl @@ -40,7 +40,7 @@ def _get_toolchain_url(info): info.extension, ) -def _toolchains(workspace_name): +def _toolchains(repository_name): rules = { "tar.gz": http_archive, "pkg": _pkg_archive, @@ -51,7 +51,7 @@ def _toolchains(workspace_name): name = "swift_toolchain_%s" % arch, url = _get_toolchain_url(info), sha256 = info.sha, - build_file = _build(workspace_name, "swift-toolchain-%s" % arch), + build_file = _build(repository_name, "swift-toolchain-%s" % arch), strip_prefix = "%s-%s" % (_swift_version, info.suffix), ) @@ -109,10 +109,10 @@ def _github_archive(*, name, repository, commit, build_file = None, sha256 = Non sha256 = sha256, ) -def _build(workspace_name, package): - return "@%s//swift/third_party:BUILD.%s.bazel" % (workspace_name, package) +def _build(repository_name, package): + return "@%s//swift/third_party:BUILD.%s.bazel" % (repository_name, package) -def load_dependencies(workspace_name): +def load_dependencies(module_ctx = None, repository_name = "codeql"): for repo_arch, arch in _swift_arch_map.items(): sha256 = _swift_sha_map[repo_arch] @@ -122,11 +122,11 @@ def load_dependencies(workspace_name): _swift_prebuilt_version, repo_arch, ), - build_file = _build(workspace_name, "swift-llvm-support"), + build_file = _build(repository_name, "swift-llvm-support"), sha256 = sha256, patch_args = ["-p1"], patches = [ - "@%s//swift/third_party/swift-llvm-support:patches/%s.patch" % (workspace_name, patch_name) + "@%s//swift/third_party/swift-llvm-support:patches/%s.patch" % (repository_name, patch_name) for patch_name in ( "remove-redundant-operators", "add-constructor-to-Compilation", @@ -134,11 +134,11 @@ def load_dependencies(workspace_name): ], ) - _toolchains(workspace_name) + _toolchains(repository_name) _github_archive( name = "picosha2", - build_file = _build(workspace_name, "picosha2"), + build_file = _build(repository_name, "picosha2"), repository = "okdshin/PicoSHA2", commit = "27fcf6979298949e8a462e16d09a0351c18fcaf2", sha256 = "d6647ca45a8b7bdaf027ecb68d041b22a899a0218b7206dee755c558a2725abb", @@ -146,30 +146,34 @@ def load_dependencies(workspace_name): _github_archive( name = "binlog", - build_file = _build(workspace_name, "binlog"), + build_file = _build(repository_name, "binlog"), repository = "morganstanley/binlog", commit = "3fef8846f5ef98e64211e7982c2ead67e0b185a6", sha256 = "f5c61d90a6eff341bf91771f2f465be391fd85397023e1b391c17214f9cbd045", ) - _github_archive( - name = "absl", - repository = "abseil/abseil-cpp", - commit = "d2c5297a3c3948de765100cb7e5cccca1210d23c", - sha256 = "735a9efc673f30b3212bfd57f38d5deb152b543e35cd58b412d1363b15242049", - ) + if module_ctx == None: + # legacy workspace loading, remove when transition is complete + _github_archive( + name = "absl", + repository = "abseil/abseil-cpp", + commit = "d2c5297a3c3948de765100cb7e5cccca1210d23c", + sha256 = "735a9efc673f30b3212bfd57f38d5deb152b543e35cd58b412d1363b15242049", + ) - _github_archive( - name = "json", - repository = "nlohmann/json", - commit = "6af826d0bdb55e4b69e3ad817576745335f243ca", - sha256 = "702bb0231a5e21c0374230fed86c8ae3d07ee50f34ffd420e7f8249854b7d85b", - ) + _github_archive( + name = "json", + repository = "nlohmann/json", + commit = "6af826d0bdb55e4b69e3ad817576745335f243ca", + sha256 = "702bb0231a5e21c0374230fed86c8ae3d07ee50f34ffd420e7f8249854b7d85b", + ) - _github_archive( - name = "fmt", - repository = "fmtlib/fmt", - build_file = _build(workspace_name, "fmt"), - commit = "a0b8a92e3d1532361c2f7feb63babc5c18d00ef2", - sha256 = "ccf872fd4aa9ab3d030d62cffcb258ca27f021b2023a0244b2cf476f984be955", - ) + _github_archive( + name = "fmt", + repository = "fmtlib/fmt", + build_file = _build(repository_name, "fmt"), + commit = "a0b8a92e3d1532361c2f7feb63babc5c18d00ef2", + sha256 = "ccf872fd4aa9ab3d030d62cffcb258ca27f021b2023a0244b2cf476f984be955", + ) + +swift_deps = module_extension(load_dependencies)