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/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/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/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/2024-02-26-ir-named-destructors.md b/cpp/ql/lib/change-notes/2024-02-26-ir-named-destructors.md new file mode 100644 index 00000000000..4e35decaf8e --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-02-26-ir-named-destructors.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added destructors for named objects to the intermediate representation. \ No newline at end of file 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 80a1ea28dea..9b111de7a04 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..2a7dfbb8208 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 @@ -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`. */ 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/change-notes/2024-02-16-modelled-functions-block-flow.md b/cpp/ql/src/change-notes/2024-02-16-modelled-functions-block-flow.md new file mode 100644 index 00000000000..d6ef3c3e056 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-02-16-modelled-functions-block-flow.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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/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 913a5d55bba..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 @@ -16622,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 @@ -16754,12 +16802,36 @@ ir.cpp: # 2159| Value = [CStyleCast] 98 # 2159| ValueCategory = prvalue # 2160| getThen(): [ReturnStmt] return ... -# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 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 @@ -16867,12 +16939,24 @@ ir.cpp: # 2164| Value = [Literal] 1 # 2164| ValueCategory = prvalue # 2165| getThen(): [ReturnStmt] return ... -# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 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 @@ -16996,6 +17080,18 @@ ir.cpp: # 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 @@ -17096,6 +17192,909 @@ ir.cpp: # 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 d9b4056f20e..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 23:~m2168_42 +# 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] : @@ -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,7 +13204,23 @@ 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 # 2168| Block 20 @@ -13066,8 +13266,8 @@ ir.cpp: #-----| Goto -> Block 21 # 2168| Block 21 -# 2168| m2168_34(iterator) = Phi : from 20:m2168_25, from 22:m2168_59 -# 2168| m2168_35(unknown) = Phi : from 20:~m2168_32, from 22:~m2168_56 +# 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!=] : @@ -13082,45 +13282,77 @@ ir.cpp: #-----| 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 -# 2168| r2168_52(glval) = VariableAddress[(__begin)] : -# 2168| r2168_53(glval) = FunctionAddress[operator++] : -# 2168| r2168_54(iterator &) = Call[operator++] : func:r2168_53, this:r2168_52 -# 2168| m2168_55(unknown) = ^CallSideEffect : ~m2170_6 -# 2168| m2168_56(unknown) = Chi : total:m2170_6, partial:m2168_55 -# 2168| v2168_57(void) = ^IndirectReadSideEffect[-1] : &:r2168_52, m2168_34 -# 2168| m2168_58(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_52 -# 2168| m2168_59(iterator) = Chi : total:m2168_34, partial:m2168_58 -# 2168| r2168_60(glval) = CopyValue : r2168_54 +# 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_1(void) = NoOp : +# 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 24 @@ -13160,11 +13392,19 @@ ir.cpp: #-----| Goto -> Block 2 # 2177| Block 2 -# 2177| m2177_1(unknown) = Phi : from 0:~m2175_6, from 1:~m2176_7 -# 2177| v2177_2(void) = NoOp : -# 2174| v2174_5(void) = ReturnVoid : -# 2174| v2174_6(void) = AliasedUse : ~m2177_1 -# 2174| v2174_7(void) = ExitFunction : +# 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 @@ -13192,19 +13432,27 @@ ir.cpp: #-----| 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 : -# 2179| v2179_5(void) = ReturnVoid : -# 2179| v2179_6(void) = AliasedUse : ~m2181_7 -# 2179| v2179_7(void) = ExitFunction : +# 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 @@ -13248,11 +13496,27 @@ ir.cpp: #-----| Goto -> Block 2 # 2188| Block 2 -# 2188| m2188_1(unknown) = Phi : from 0:~m2186_6, from 1:~m2187_7 -# 2188| v2188_2(void) = NoOp : -# 2184| v2184_5(void) = ReturnVoid : -# 2184| v2184_6(void) = AliasedUse : ~m2188_1 -# 2184| v2184_7(void) = ExitFunction : +# 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 @@ -13269,6 +13533,1066 @@ ir.cpp: # 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 @@ -13357,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 @@ -13401,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 @@ -13514,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 1de5f8d5b8f..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; }; @@ -2189,4 +2189,146 @@ void static_variable_with_destructor_3() { 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 fe7bebfa3cb..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 | @@ -917,6 +921,10 @@ | 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 | @@ -966,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 | @@ -3024,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 | @@ -3066,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 | @@ -3980,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 | @@ -4331,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 | @@ -4375,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 | @@ -4428,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 | @@ -5111,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 | @@ -5589,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 | @@ -6230,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 | @@ -6350,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 | @@ -6628,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 | @@ -6753,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 | @@ -6827,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 | @@ -9129,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 | @@ -9163,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 | @@ -9319,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 | @@ -9333,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 | @@ -10262,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 23:~m2168_42 | +| 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 | @@ -10291,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 | @@ -10300,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 | @@ -10380,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 | @@ -10450,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 | @@ -10464,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 | @@ -10549,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 | @@ -10637,56 +10877,66 @@ | 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_52 | -| ir.cpp:2168:68:2168:68 | Address | &:r2168_52 | +| 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_52 | +| 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_53 | +| 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_55 | -| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_58 | +| 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:m2170_6 | +| 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_59 | -| ir.cpp:2168:68:2168:68 | Phi | from 22:~m2168_56 | +| 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 | ~m2170_6 | +| 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_54 | +| 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 | @@ -10709,9 +10959,59 @@ | 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_1 | +| 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 | @@ -10730,11 +11030,21 @@ | 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 | ~m2181_7 | +| 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 | @@ -10755,9 +11065,19 @@ | 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_1 | +| 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 | @@ -10785,8 +11105,28 @@ | 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 | @@ -10796,6 +11136,906 @@ | 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 | @@ -10874,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 | @@ -10917,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 | @@ -11039,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 9913148c609..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,14 +12329,35 @@ 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 -# 2168| Block 21 +# 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] : @@ -12198,9 +12393,9 @@ ir.cpp: # 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 22 +#-----| Goto -> Block 27 -# 2168| Block 22 +# 2168| Block 27 # 2168| r2168_30(glval) = VariableAddress[(__begin)] : #-----| r0_37(glval) = Convert : r2168_30 # 2168| r2168_31(glval) = FunctionAddress[operator!=] : @@ -12210,42 +12405,75 @@ ir.cpp: # 2168| mu2168_35(unknown) = ^CallSideEffect : ~m? #-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, ~m? # 2168| v2168_36(void) = ConditionalBranch : r2168_34 -#-----| False -> Block 24 -#-----| True -> Block 23 +#-----| False -> Block 30 +#-----| True -> Block 28 -# 2168| Block 23 -# 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 -# 2168| r2168_44(glval) = VariableAddress[(__begin)] : -# 2168| r2168_45(glval) = FunctionAddress[operator++] : -# 2168| r2168_46(iterator &) = Call[operator++] : func:r2168_45, this:r2168_44 -# 2168| mu2168_47(unknown) = ^CallSideEffect : ~m? -# 2168| v2168_48(void) = ^IndirectReadSideEffect[-1] : &:r2168_44, ~m? -# 2168| mu2168_49(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_44 -# 2168| r2168_50(glval) = CopyValue : r2168_46 -#-----| Goto (back edge) -> Block 22 +# 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 -# 2172| Block 24 -# 2172| v2172_1(void) = NoOp : +# 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() @@ -12276,10 +12504,16 @@ ir.cpp: #-----| Goto -> Block 2 # 2177| Block 2 -# 2177| v2177_1(void) = NoOp : -# 2174| v2174_4(void) = ReturnVoid : -# 2174| v2174_5(void) = AliasedUse : ~m? -# 2174| v2174_6(void) = ExitFunction : +# 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 @@ -12303,16 +12537,22 @@ ir.cpp: #-----| 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 : -# 2179| v2179_4(void) = ReturnVoid : -# 2179| v2179_5(void) = AliasedUse : ~m? -# 2179| v2179_6(void) = ExitFunction : +# 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 @@ -12348,10 +12588,22 @@ ir.cpp: #-----| Goto -> Block 2 # 2188| Block 2 -# 2188| v2188_1(void) = NoOp : -# 2184| v2184_4(void) = ReturnVoid : -# 2184| v2184_5(void) = AliasedUse : ~m? -# 2184| v2184_6(void) = ExitFunction : +# 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 @@ -12366,6 +12618,911 @@ ir.cpp: # 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 @@ -12444,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? @@ -12483,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? @@ -12582,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/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/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/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index 95fcb51072e..9f5a4b74c2e 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -558,6 +558,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestLinuxBuildlessExtractionSuccess() { + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -567,12 +569,14 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 0, 1); + TestAutobuilderScript(autobuilder, 0, 2); } [Fact] public void TestLinuxBuildlessExtractionFailed() { + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 10; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -582,12 +586,14 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 10, 1); + TestAutobuilderScript(autobuilder, 10, 2); } [Fact] public void TestLinuxBuildlessExtractionSolution() { + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -597,7 +603,28 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 0, 1); + TestAutobuilderScript(autobuilder, 0, 2); + } + + [Fact] + public void TestLinuxBuildlessExtractionNoDotnet() + { + actions.RunProcess["dotnet --list-sdks"] = 1; + actions.RunProcessOut["dotnet --list-sdks"] = ""; + actions.RunProcess[@"chmod u+x scratch/.dotnet/dotnet-install.sh"] = 0; + actions.RunProcess[@"scratch/.dotnet/dotnet-install.sh --channel release --version 8.0.101 --install-dir scratch/.dotnet"] = 0; + actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone --dotnet scratch/.dotnet"] = 0; + actions.FileExists["csharp.log"] = true; + actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; + actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; + actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SCRATCH_DIR"] = "scratch"; + actions.EnumerateFiles[@"C:\Project"] = "foo.cs\ntest.sln"; + actions.EnumerateDirectories[@"C:\Project"] = ""; + actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "scratch/.dotnet/dotnet-install.sh")); + actions.CreateDirectories.Add(@"scratch/.dotnet"); + + var autobuilder = CreateAutoBuilder(false, buildless: "true"); + TestAutobuilderScript(autobuilder, 0, 4); } private void SkipVsWhere() @@ -888,6 +915,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestSkipNugetBuildless() { + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -897,7 +926,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 0, 1); + TestAutobuilderScript(autobuilder, 0, 2); } diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs index 3a6c1bda85c..859029eee32 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs @@ -50,7 +50,7 @@ namespace Semmle.Autobuild.CSharp attempt = new BuildCommandRule(DotNetRule.WithDotNet).Analyse(this, false) & CheckExtractorRun(true); break; case CSharpBuildStrategy.Buildless: - attempt = DotNetRule.WithDotNet(this, (dotNetPath, env) => + attempt = DotNetRule.WithDotNet(this, ensureDotNetAvailable: true, (dotNetPath, env) => { // No need to check that the extractor has been executed in buildless mode return new StandaloneBuildRule(dotNetPath).Analyse(this, false); diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/Constants.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/Constants.cs new file mode 100644 index 00000000000..6e0f0ded7a4 --- /dev/null +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/Constants.cs @@ -0,0 +1,8 @@ +namespace Semmle.Autobuild.CSharp +{ + internal static class Constants + { + // 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"; + } +} diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index b85e6cc7732..f5e519b1f90 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -46,7 +46,7 @@ namespace Semmle.Autobuild.CSharp builder.Log(Severity.Info, "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,29 +79,29 @@ 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); + var installScript = DownloadDotNet(builder, installDir, ensureDotNetAvailable); return BuildScript.Bind(installScript, installed => { - Dictionary? env; + var env = new Dictionary + { + { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, + { "MSBUILDDISABLENODEREUSE", "1" } + }; if (installed == 0) { // The installation succeeded, so use the newly installed .NET Core 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 Core SDKs + env.Add("PATH", installDir + delim + path); } else { + // The .NET SDK was not installed, either because the installation failed or because it was already installed. installDir = null; - env = null; } return f(installDir, env); @@ -117,14 +117,14 @@ namespace Semmle.Autobuild.CSharp /// are needed). /// public static BuildScript WithDotNet(IAutobuilder builder, Func?, BuildScript> f) - => WithDotNet(builder, (_1, env) => f(env)); + => WithDotNet(builder, ensureDotNetAvailable: false, (_, 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) + private static BuildScript DownloadDotNet(IAutobuilder builder, string installDir, bool ensureDotNetAvailable) { if (!string.IsNullOrEmpty(builder.Options.DotNetVersion)) // Specific version supplied in configuration: always use that @@ -152,7 +152,17 @@ namespace Semmle.Autobuild.CSharp validGlobalJson = true; } - return validGlobalJson ? installScript : BuildScript.Failure; + if (validGlobalJson) + { + return installScript; + } + + if (ensureDotNetAvailable) + { + return DownloadDotNetVersion(builder, installDir, Constants.LatestDotNetSdkVersion, needExactVersion: false); + } + + return BuildScript.Failure; } /// @@ -161,14 +171,25 @@ namespace Semmle.Autobuild.CSharp /// /// See https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script. /// - private static BuildScript DownloadDotNetVersion(IAutobuilder builder, string path, string version) + private static BuildScript DownloadDotNetVersion(IAutobuilder builder, string path, string version, bool needExactVersion = true) { return BuildScript.Bind(GetInstalledSdksScript(builder.Actions), (sdks, sdksRet) => { - if (sdksRet == 0 && sdks.Count == 1 && sdks[0].StartsWith(version + " ", StringComparison.Ordinal)) + if (needExactVersion && 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; + } + 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) + { + builder.Log(Severity.Info, "No .NET Core SDK found."); + } builder.Log(Severity.Info, "Attempting to download .NET Core {0}", version); diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index c0444292020..0279c6af01c 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -1,5 +1,4 @@ -using System.Linq; -using Semmle.Autobuild.Shared; +using Semmle.Autobuild.Shared; namespace Semmle.Autobuild.CSharp { @@ -17,36 +16,23 @@ namespace Semmle.Autobuild.CSharp 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); + + if (!string.IsNullOrEmpty(this.dotNetPath)) + { + cmd.Argument("--dotnet"); + cmd.QuoteArgument(this.dotNetPath); + } + + return cmd.Script; } } } 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/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/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/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/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/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/2024-02-21-getonly-properties.md b/csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md index 3e8940a44e6..6bb8e99c71e 100644 --- a/csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md +++ b/csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* C#: Data flow via get only properties like `public object Obj { get; }` is now captured by the data flow library. +* 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/change-notes/2024-02-22-no-db-stats.md b/csharp/ql/lib/change-notes/2024-02-22-no-db-stats.md new file mode 100644 index 00000000000..d6ffbd523ac --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-22-no-db-stats.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* 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. diff --git a/csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md b/csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md new file mode 100644 index 00000000000..9b1739b9b6d --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C#: The table `expr_compiler_generated` has been deleted and its content has been added to `compiler_generated`. diff --git a/csharp/ql/lib/change-notes/2024-02-26-variable-capture-flow.md b/csharp/ql/lib/change-notes/2024-02-26-variable-capture-flow.md new file mode 100644 index 00000000000..66ab65083dc --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-26-variable-capture-flow.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Improved support for flow through captured variables that properly adheres to inter-procedural control flow. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2024-02-28-experimental-attribute.md b/csharp/ql/lib/change-notes/2024-02-28-experimental-attribute.md new file mode 100644 index 00000000000..8749c790954 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-28-experimental-attribute.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# 12: Add QL library support (`ExperimentalAttribute`) for the experimental attribute. 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/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/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/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 414310f655e..c4b3b3261d4 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() } } @@ -395,33 +348,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; @@ -488,11 +414,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. * @@ -507,10 +428,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" } @@ -524,11 +441,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. * @@ -543,10 +455,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" } @@ -558,10 +466,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 0b97a268d5d..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() { @@ -1967,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* @@ -1989,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 { @@ -2021,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 ) @@ -2074,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 { @@ -2170,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 @@ -2191,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) ) @@ -2211,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) } /** @@ -2241,6 +2498,8 @@ predicate clearsContent(Node n, ContentSet c) { ) or n = any(PostUpdateNode n1 | primaryConstructorParameterStore(_, c, n1)).getPreUpdateNode() + or + VariableCapture::clearsContent(n, c) } /** @@ -2289,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) @@ -2314,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`. */ @@ -2534,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" } } @@ -2546,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 @@ -2609,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() ] } @@ -2641,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 @@ -2671,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 @@ -2701,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 } /** @@ -2715,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`. */ @@ -2737,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 + ) } } @@ -2771,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/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/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index c9ee11bd1ee..21ede72308c 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; @@ -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/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/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-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= ... | 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 fc211507a1c..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,21 +53,25 @@ 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 | | @@ -68,19 +80,38 @@ edges | 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:18:130:34 | call to method Source : Object | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | provenance | | -| Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | provenance | | -| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:15 | 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:134:14:134:15 | access to local variable c4 : 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 | @@ -88,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 | @@ -107,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 | @@ -130,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 | @@ -143,7 +183,9 @@ 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 | @@ -154,8 +196,12 @@ nodes | 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 | @@ -164,21 +210,39 @@ nodes | 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 | @@ -191,3 +255,5 @@ subpaths | 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 af83b9896e2..9eae5079d84 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs +++ b/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs @@ -134,6 +134,17 @@ public class Constructors 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/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 3443ea23f8e..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,44 +1,58 @@ 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: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: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: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 | 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-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/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/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/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/images/codeql-for-visual-studio-code/accept-test-output.png b/docs/codeql/images/codeql-for-visual-studio-code/accept-test-output.png new file mode 100644 index 00000000000..28a2f3aee2f Binary files /dev/null and b/docs/codeql/images/codeql-for-visual-studio-code/accept-test-output.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/model-application-mode.png b/docs/codeql/images/codeql-for-visual-studio-code/model-application-mode.png index c364d58beb5..9071596b728 100644 Binary files a/docs/codeql/images/codeql-for-visual-studio-code/model-application-mode.png and b/docs/codeql/images/codeql-for-visual-studio-code/model-application-mode.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode-expanded.png b/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode-expanded.png index 2e85503a990..ee8f558fd6c 100644 Binary files a/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode-expanded.png and b/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode-expanded.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode.png b/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode.png index be499cdbccc..f799cafb33d 100644 Binary files a/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode.png and b/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/open-test-explorer.png b/docs/codeql/images/codeql-for-visual-studio-code/open-test-explorer.png deleted file mode 100644 index b5a2a16824a..00000000000 Binary files a/docs/codeql/images/codeql-for-visual-studio-code/open-test-explorer.png and /dev/null differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/open-testing-view.png b/docs/codeql/images/codeql-for-visual-studio-code/open-testing-view.png new file mode 100644 index 00000000000..127f2191c19 Binary files /dev/null and b/docs/codeql/images/codeql-for-visual-studio-code/open-testing-view.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/show-test-diff.png b/docs/codeql/images/codeql-for-visual-studio-code/show-test-diff.png deleted file mode 100644 index 7b1e45d194f..00000000000 Binary files a/docs/codeql/images/codeql-for-visual-studio-code/show-test-diff.png and /dev/null differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/test-results-panel.png b/docs/codeql/images/codeql-for-visual-studio-code/test-results-panel.png new file mode 100644 index 00000000000..36ff6a3ebaa Binary files /dev/null and b/docs/codeql/images/codeql-for-visual-studio-code/test-results-panel.png differ diff --git a/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst b/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst index 161a837d71a..aed5fdae17e 100644 --- a/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst +++ b/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst @@ -2,4 +2,4 @@ Note - The CodeQL model editor and CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin analysis. To use this beta functionality, install the latest version of the CodeQL extension for Visual Studio Code. + The CodeQL model editor and CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin and C# analysis. To use this beta functionality, install the latest version of the CodeQL extension for Visual Studio Code. diff --git a/docs/codeql/reusables/beta-note-model-packs-java.rst b/docs/codeql/reusables/beta-note-model-packs-java.rst deleted file mode 100644 index 049621a57f7..00000000000 --- a/docs/codeql/reusables/beta-note-model-packs-java.rst +++ /dev/null @@ -1,5 +0,0 @@ -.. pull-quote:: - - Note - - CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin analysis. To use this beta functionality, install the latest version of the CodeQL CLI bundle from: https://github.com/github/codeql-action/releases. diff --git a/go/documentation/library-coverage/coverage.csv b/go/documentation/library-coverage/coverage.csv index 8997dec7b3a..6c515f12eed 100644 --- a/go/documentation/library-coverage/coverage.csv +++ b/go/documentation/library-coverage/coverage.csv @@ -1,97 +1,112 @@ -package,source,summary,source:remote,summary:taint,summary:value -,,2,,,2 -archive/tar,,5,,5, -archive/zip,,6,,6, -bufio,,17,,17, -bytes,,43,,43, -compress/bzip2,,1,,1, -compress/flate,,4,,4, -compress/gzip,,3,,3, -compress/lzw,,1,,1, -compress/zlib,,4,,4, -container/heap,,5,,5, -container/list,,20,,20, -container/ring,,5,,5, -context,,5,,5, -crypto,,1,,1, -crypto/cipher,,3,,3, -crypto/rsa,,2,,2, -crypto/tls,,3,,3, -crypto/x509,,1,,1, -database/sql,,7,,7, -database/sql/driver,,4,,4, -encoding,,4,,4, -encoding/ascii85,,2,,2, -encoding/asn1,,8,,8, -encoding/base32,,3,,3, -encoding/base64,,3,,3, -encoding/binary,,2,,2, -encoding/csv,,5,,5, -encoding/gob,,7,,7, -encoding/hex,,3,,3, -encoding/json,,14,,14, -encoding/pem,,3,,3, -encoding/xml,,23,,23, -errors,,3,,3, -expvar,,6,,6, -fmt,,16,,16, -github.com/astaxie/beego,,7,,7, -github.com/astaxie/beego/context,,1,,1, -github.com/astaxie/beego/utils,,13,,13, -github.com/beego/beego/core/utils,,13,,13, -github.com/beego/beego/server/web,,7,,7, -github.com/beego/beego/server/web/context,,1,,1, -github.com/couchbase/gocb,,18,,18, -github.com/couchbaselabs/gocb,,18,,18, -github.com/elazarl/goproxy,,2,,2, -github.com/evanphx/json-patch,,12,,12, -github.com/gin-gonic/gin,,2,,2, -github.com/go-pg/pg/$ANYVERSION/orm,,6,,6, -github.com/golang/protobuf/$ANYVERSION/proto,,4,,4, -github.com/json-iterator/go,,4,,4, -github.com/labstack/echo,,2,,2, -github.com/revel/revel,,10,,10, -github.com/robfig/revel,,10,,10, -github.com/sendgrid/sendgrid-go/$ANYVERSION/helpers/mail,,1,,1, -github.com/valyala/fasthttp,,5,,5, -go.uber.org/zap,,11,,11, -golang.org/x/net/$ANYVERSION/html,,16,,16, -golang.org/x/net/context,,5,,5, -google.golang.org/protobuf/$ANYVERSION/internal/encoding/text,,1,,1, -google.golang.org/protobuf/$ANYVERSION/internal/impl,,2,,2, -google.golang.org/protobuf/$ANYVERSION/proto,,8,,8, -google.golang.org/protobuf/$ANYVERSION/reflect/protoreflect,,1,,1, -gopkg.in/couchbase/gocb,,18,,18, -gopkg.in/macaron,,1,,1, -gopkg.in/yaml,,9,,9, -html,,2,,2, -html/template,,6,,6, -io,,19,,19, -io/fs,,12,,12, -io/ioutil,,2,,2, -k8s.io/api/core,,10,,10, -k8s.io/apimachinery/$ANYVERSION/pkg/runtime,,47,,47, -log,,3,,3, -mime,,5,,5, -mime/multipart,,8,,8, -mime/quotedprintable,,1,,1, -net,,20,,20, -net/http,8,22,8,22, -net/http/httputil,,10,,10, -net/mail,,6,,6, -net/textproto,,19,,19, -net/url,,23,,23, -os,,4,,4, -path,,5,,5, -path/filepath,,13,,13, -reflect,,37,,37, -regexp,,20,,20, -sort,,1,,1, -strconv,,9,,9, -strings,,34,,34, -sync,,10,,10, -sync/atomic,,24,,24, -syscall,,8,,8, -text/scanner,,3,,3, -text/tabwriter,,1,,1, -text/template,,6,,6, +package,sink,source,summary,sink:credentials-key,sink:jwt,source:remote,summary:taint,summary:value +,,,2,,,,,2 +archive/tar,,,5,,,,5, +archive/zip,,,6,,,,6, +bufio,,,17,,,,17, +bytes,,,43,,,,43, +compress/bzip2,,,1,,,,1, +compress/flate,,,4,,,,4, +compress/gzip,,,3,,,,3, +compress/lzw,,,1,,,,1, +compress/zlib,,,4,,,,4, +container/heap,,,5,,,,5, +container/list,,,20,,,,20, +container/ring,,,5,,,,5, +context,,,5,,,,5, +crypto,,,1,,,,1, +crypto/cipher,,,3,,,,3, +crypto/rsa,,,2,,,,2, +crypto/tls,,,3,,,,3, +crypto/x509,,,1,,,,1, +database/sql,,,7,,,,7, +database/sql/driver,,,4,,,,4, +encoding,,,4,,,,4, +encoding/ascii85,,,2,,,,2, +encoding/asn1,,,8,,,,8, +encoding/base32,,,3,,,,3, +encoding/base64,,,3,,,,3, +encoding/binary,,,2,,,,2, +encoding/csv,,,5,,,,5, +encoding/gob,,,7,,,,7, +encoding/hex,,,3,,,,3, +encoding/json,,,14,,,,14, +encoding/pem,,,3,,,,3, +encoding/xml,,,23,,,,23, +errors,,,3,,,,3, +expvar,,,6,,,,6, +fmt,,,16,,,,16, +github.com/astaxie/beego,,,7,,,,7, +github.com/astaxie/beego/context,,,1,,,,1, +github.com/astaxie/beego/utils,,,13,,,,13, +github.com/beego/beego/core/utils,,,13,,,,13, +github.com/beego/beego/server/web,,,7,,,,7, +github.com/beego/beego/server/web/context,,,1,,,,1, +github.com/couchbase/gocb,,,18,,,,18, +github.com/couchbaselabs/gocb,,,18,,,,18, +github.com/cristalhq/jwt,1,,,1,,,, +github.com/dgrijalva/jwt-go,3,,9,2,1,,9, +github.com/elazarl/goproxy,,,2,,,,2, +github.com/evanphx/json-patch,,,12,,,,12, +github.com/form3tech-oss/jwt-go,2,,,2,,,, +github.com/gin-gonic/gin,,,2,,,,2, +github.com/go-chi/jwtauth,1,,,1,,,, +github.com/go-jose/go-jose/$ANYVERSION/jwt,1,,4,,1,,4, +github.com/go-kit/kit/auth/jwt,1,,,1,,,, +github.com/go-pg/pg/$ANYVERSION/orm,,,6,,,,6, +github.com/golang-jwt/jwt,3,,11,2,1,,11, +github.com/golang/protobuf/$ANYVERSION/proto,,,4,,,,4, +github.com/json-iterator/go,,,4,,,,4, +github.com/kataras/iris/$ANYVERSION/middleware/jwt,1,,,1,,,, +github.com/kataras/jwt,5,,,5,,,, +github.com/labstack/echo,,,2,,,,2, +github.com/lestrrat-go/jwx,1,,,1,,,, +github.com/lestrrat-go/jwx/$ANYVERSION/jwk,1,,,1,,,, +github.com/lestrrat/go-jwx/jwk,1,,,1,,,, +github.com/ory/fosite/token/jwt,2,,,2,,,, +github.com/revel/revel,,,10,,,,10, +github.com/robfig/revel,,,10,,,,10, +github.com/sendgrid/sendgrid-go/$ANYVERSION/helpers/mail,,,1,,,,1, +github.com/valyala/fasthttp,,,5,,,,5, +go.uber.org/zap,,,11,,,,11, +golang.org/x/net/$ANYVERSION/html,,,16,,,,16, +golang.org/x/net/context,,,5,,,,5, +google.golang.org/protobuf/$ANYVERSION/internal/encoding/text,,,1,,,,1, +google.golang.org/protobuf/$ANYVERSION/internal/impl,,,2,,,,2, +google.golang.org/protobuf/$ANYVERSION/proto,,,8,,,,8, +google.golang.org/protobuf/$ANYVERSION/reflect/protoreflect,,,1,,,,1, +gopkg.in/couchbase/gocb,,,18,,,,18, +gopkg.in/macaron,,,1,,,,1, +gopkg.in/square/go-jose.v2/jwt,1,,4,,1,,4, +gopkg.in/yaml,,,9,,,,9, +html,,,2,,,,2, +html/template,,,6,,,,6, +io,,,19,,,,19, +io/fs,,,12,,,,12, +io/ioutil,,,2,,,,2, +k8s.io/api/core,,,10,,,,10, +k8s.io/apimachinery/$ANYVERSION/pkg/runtime,,,47,,,,47, +log,,,3,,,,3, +math/big,,,1,,,,1, +mime,,,5,,,,5, +mime/multipart,,,8,,,,8, +mime/quotedprintable,,,1,,,,1, +net,,,20,,,,20, +net/http,,8,22,,,8,22, +net/http/httputil,,,10,,,,10, +net/mail,,,6,,,,6, +net/textproto,,,19,,,,19, +net/url,,,23,,,,23, +os,,,4,,,,4, +path,,,5,,,,5, +path/filepath,,,13,,,,13, +reflect,,,37,,,,37, +regexp,,,20,,,,20, +sort,,,1,,,,1, +strconv,,,9,,,,9, +strings,,,34,,,,34, +sync,,,10,,,,10, +sync/atomic,,,24,,,,24, +syscall,,,8,,,,8, +text/scanner,,,3,,,,3, +text/tabwriter,,,1,,,,1, +text/template,,,6,,,,6, diff --git a/go/documentation/library-coverage/coverage.rst b/go/documentation/library-coverage/coverage.rst index 2de6fe0121e..63c408d82fc 100644 --- a/go/documentation/library-coverage/coverage.rst +++ b/go/documentation/library-coverage/coverage.rst @@ -10,21 +10,30 @@ Go framework & library support `Couchbase official client(gocb) `_,"``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/ql/lib/change-notes/2024-02-14-range-map-read.md b/go/ql/lib/change-notes/2024-02-14-range-map-read.md new file mode 100644 index 00000000000..ea45737a72e --- /dev/null +++ b/go/ql/lib/change-notes/2024-02-14-range-map-read.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed dataflow out of a `map` using a `range` statement. 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/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/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/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/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/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/2024-02-27-mvnw-versions.md b/java/ql/lib/change-notes/2024-02-27-mvnw-versions.md new file mode 100644 index 00000000000..a0227088ae9 --- /dev/null +++ b/java/ql/lib/change-notes/2024-02-27-mvnw-versions.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* 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. 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/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/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/change-notes/2024-02-12-android-insecure-keys.md b/java/ql/src/change-notes/2024-02-12-android-insecure-keys.md new file mode 100644 index 00000000000..1de07727796 --- /dev/null +++ b/java/ql/src/change-notes/2024-02-12-android-insecure-keys.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query `java/android/insecure-local-key-gen` for finding instances of keys generated for biometric authentication in an insecure way. \ No newline at end of file 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/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/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/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/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/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/semmle/javascript/dataflow/internal/StepSummary.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll index 6593df32615..829e02591a0 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll @@ -45,6 +45,8 @@ private module Cached { CopyStep(PropertyName prop) or LoadStoreStep(PropertyName fromProp, PropertyName toProp) { SharedTypeTrackingStep::loadStoreStep(_, _, fromProp, toProp) + or + summarizedLoadStoreStep(_, _, fromProp, toProp) } or WithoutPropStep(PropertySet props) { SharedTypeTrackingStep::withoutPropStep(_, _, props) } } @@ -69,6 +71,26 @@ private module Cached { AccessPath::isAssignedInUniqueFile(global) } + bindingset[fun] + pragma[inline_late] + private DataFlow::PropRead getStoredPropRead(DataFlow::FunctionNode fun, string storeProp) { + result = fun.getAReturn().getALocalSource().getAPropertySource(storeProp) + } + + /** + * Holds if `loadProp` of `parameter` is stored in the `storeProp` property of the return value of `fun`. + */ + pragma[nomagic] + private predicate summarizedLoadStoreStep( + DataFlow::ParameterNode param, DataFlow::FunctionNode fun, string loadProp, string storeProp + ) { + exists(DataFlow::PropRead read | + read = getStoredPropRead(fun, storeProp) and + read.getBase().getALocalSource() = param and + read.getPropertyName() = loadProp + ) + } + /** * INTERNAL: Use `TypeBackTracker.smallstep()` instead. */ @@ -156,6 +178,14 @@ private module Cached { exists(string prop | param.getAPropertyRead(prop).flowsTo(fun.getAReturn()) and summary = LoadStep(prop) + or + fun.getAReturn().getALocalSource().getAPropertySource(prop) = param and + summary = StoreStep(prop) + ) + or + exists(string loadProp, string storeProp | + summarizedLoadStoreStep(param, fun, loadProp, storeProp) and + summary = LoadStoreStep(loadProp, storeProp) ) ) and if param = fun.getAParameter() diff --git a/javascript/ql/test/library-tests/TypeTracking/summarize.js b/javascript/ql/test/library-tests/TypeTracking/summarize.js new file mode 100644 index 00000000000..e4aa9ebdb85 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeTracking/summarize.js @@ -0,0 +1,33 @@ +import 'dummy'; + +function identity(x) { + return x; +} +function load(x) { + return x.loadProp; +} +function store(x) { + return { storeProp: x }; +} +function loadStore(x) { + return { storeProp: x.loadProp }; +} + +identity({}); +load({}); +store({}); +loadStore({}); + +const obj = {}; // name: obj + +let x = identity(obj); +x; // track: obj + +x = load({ loadProp: obj }); +x; // track: obj + +x = store(obj); +x.storeProp; // track: obj + +x = loadStore({ loadProp: obj }); +x.storeProp; // track: obj 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..7d50c7fcdee 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)] @@ -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..439bfbb59d7 100644 --- a/misc/bazel/cmake/setup.cmake +++ b/misc/bazel/cmake/setup.cmake @@ -19,8 +19,7 @@ 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) macro(include_generated BAZEL_TARGET) bazel(build ${BAZEL_TARGET}) 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/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/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..a623a151e89 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -15,7 +15,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/2024-02-15-activerecord_connection_sql_sinks.md b/ruby/ql/lib/change-notes/2024-02-15-activerecord_connection_sql_sinks.md new file mode 100644 index 00000000000..c2276f284a8 --- /dev/null +++ b/ruby/ql/lib/change-notes/2024-02-15-activerecord_connection_sql_sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Calls to several methods of `ActiveRecord::Connection`, such as `ActiveRecord::Connection#exec_query`, are now recognized as SQL executions, including those via subclasses. \ No newline at end of file diff --git a/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md b/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md new file mode 100644 index 00000000000..1486c7a472d --- /dev/null +++ b/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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. \ No newline at end of file diff --git a/ruby/ql/lib/change-notes/2024-02-26-arel-sqlliteral.md b/ruby/ql/lib/change-notes/2024-02-26-arel-sqlliteral.md new file mode 100644 index 00000000000..56d2dcf5c73 --- /dev/null +++ b/ruby/ql/lib/change-notes/2024-02-26-arel-sqlliteral.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +Calls to `Arel::Nodes::SqlLiteral.new` are now modeled as instances of the `SqlConstruction` concept, as well as propagating taint from their argument. \ No newline at end of file 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/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/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..d2fe2a78ab3 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -2177,7 +2177,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/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/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/src/change-notes/2024-02-13-rails-more-request-sources.md b/ruby/ql/src/change-notes/2024-02-13-rails-more-request-sources.md new file mode 100644 index 00000000000..84ea696dfef --- /dev/null +++ b/ruby/ql/src/change-notes/2024-02-13-rails-more-request-sources.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added additional request sources for Ruby on Rails. \ No newline at end of file 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/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/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/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 35249d82a65..3f11dd07617 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -2804,6 +2804,7 @@ | 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 | 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/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-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..fee6441cf9c 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -34,36 +34,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 | | @@ -133,42 +143,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 +213,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 +231,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-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/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/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/dataflow/codeql/dataflow/DataFlow.qll b/shared/dataflow/codeql/dataflow/DataFlow.qll index 1c9c900530f..bad80247861 100644 --- a/shared/dataflow/codeql/dataflow/DataFlow.qll +++ b/shared/dataflow/codeql/dataflow/DataFlow.qll @@ -273,6 +273,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/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/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/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/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/ql/lib/change-notes/2024-02-22-extension-patch.md b/swift/ql/lib/change-notes/2024-02-22-extension-patch.md new file mode 100644 index 00000000000..7bd78f3b785 --- /dev/null +++ b/swift/ql/lib/change-notes/2024-02-22-extension-patch.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* 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/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/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)